Merge remote-tracking branch 'LCTT/master'

This commit is contained in:
Xingyu Wang 2019-09-14 18:30:56 +08:00
commit d0c790903c
4 changed files with 386 additions and 50 deletions

View File

@ -1,20 +1,22 @@
[#]: collector: (lujun9972)
[#]: translator: (LazyWolfLin)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-11339-1.html)
[#]: subject: (Why const Doesn't Make C Code Faster)
[#]: via: (https://theartofmachinery.com/2019/08/12/c_const_isnt_for_performance.html)
[#]: author: (Simon Arneaud https://theartofmachinery.com)
为什么 `const` 无法让 `C` 代码跑得更快?
为什么 const 无法让 C 代码跑得更快?
======
在几个月前的一篇文章里,我曾说过“[有个一个流行的传言,`const` 有助于编译器优化 `C``C++` 代码][1]”。我觉得我需要解释一下,尤其是曾经我自己也以为这是显然对的。我将会用一些理论并构造一些例子来论证,然后在一个真正的代码库,`Sqlite`,上做一些实验和基准测试。
![](https://img.linux.net.cn/data/attachment/album/201909/14/181535lsrt9t93k1c1n0mt.jpg)
在几个月前的一篇文章里,我曾说过“[有个一个流行的传言,`const` 有助于编译器优化 C 和 C++ 代码][1]”。我觉得我需要解释一下,尤其是曾经我自己也以为这是显然对的。我将会用一些理论并构造一些例子来论证,然后在一个真实的代码库 `Sqlite` 上做一些实验和基准测试。
### 一个简单的测试
让我们从一个最简单、最明显的例子开始,以前认为这是一个 `const``C` 代码跑得更快的例子。首先,假设我们有如下两个函数声明:
让我们从一个最简单、最明显的例子开始,以前认为这是一个 `const` 让 C 代码跑得更快的例子。首先,假设我们有如下两个函数声明:
```
void func(int *x);
@ -39,7 +41,7 @@ void constByArg(const int *x)
}
```
调用 `printf()`CPU 会通过指针从 RAM 中取得 `*x` 的值。很显然,`constByArg()` 会稍微快一点,因为编译器知道 `*x` 是常量,因此不需要在调用 `constFunc()` 之后再次获取它的值。它仅是打印相同的东西。没问题吧?让我们来看下 `GCC` 在如下编译选项下生成的汇编代码:
调用 `printf()`CPU 会通过指针从 RAM 中取得 `*x` 的值。很显然,`constByArg()` 会稍微快一点,因为编译器知道 `*x` 是常量,因此不需要在调用 `constFunc()` 之后再次获取它的值。它仅是打印相同的东西。没问题吧?让我们来看下 GCC 在如下编译选项下生成的汇编代码:
```
$ gcc -S -Wall -O3 test.c
@ -62,7 +64,7 @@ byArg:
xorl %eax, %eax
call __printf_chk@PLT
movq %rbx, %rdi
call func@PLT # The only instruction that's different in constFoo
call func@PLT # constFoo 中唯一不同的指令
movl (%rbx), %edx
leaq .LC0(%rip), %rsi
xorl %eax, %eax
@ -73,16 +75,16 @@ byArg:
.cfi_endproc
```
函数 `byArg()` 和函数 `constByArg()` 生成的汇编代码中唯一的不同之处是 `constByArg()` 有一句汇编代码 `call constFunc@PLT`,这正是源码中的调用。关键字 `const` 本身并没有造成任何字面上的不同。
函数 `byArg()` 和函数 `constByArg()` 生成的汇编代码中唯一的不同之处是 `constByArg()` 有一句汇编代码 `call constFunc@PLT`,这正是源码中的调用。关键字 `const` 本身并没有造成任何字面上的不同。
好了,这是 `GCC` 的结果。或许我们需要一个更聪明的编译器。`Clang` 会有更好的表现吗?
好了,这是 GCC 的结果。或许我们需要一个更聪明的编译器。Clang 会有更好的表现吗?
```
$ clang -S -Wall -O3 -emit-llvm test.c
$ view test.ll
```
这是 `IR` 代码(`LLVM` 的中间语言)。它比汇编代码更加紧凑,所以我可以把两个函数都导出来,让你可以看清楚我所说的“除了调用外,没有任何字面上的不同”是什么意思:
这是 `IR` 代码(LCTT 译注LLVM 的中间语言)。它比汇编代码更加紧凑,所以我可以把两个函数都导出来,让你可以看清楚我所说的“除了调用外,没有任何字面上的不同”是什么意思:
```
; Function Attrs: nounwind uwtable
@ -121,14 +123,14 @@ void localVar()
void constLocalVar()
{
const int x = 42; // const on the local variable
const int x = 42; // 对本地变量使用 const
printf("%d\n", x);
constFunc(&x);
printf("%d\n", x);
}
```
下面是 `localVar()` 的汇编代码,其中有两条指令在 `constLocalVar()` 中会被优化:
下面是 `localVar()` 的汇编代码,其中有两条指令在 `constLocalVar()` 中会被优化
```
localVar:
@ -146,10 +148,10 @@ localVar:
call __printf_chk@PLT
leaq 4(%rsp), %rdi
call constFunc@PLT
movl 4(%rsp), %edx # not in constLocalVar()
movl 4(%rsp), %edx # 在 constLocalVar() 中没有
xorl %eax, %eax
movl $1, %edi
leaq .LC0(%rip), %rsi # not in constLocalVar()
leaq .LC0(%rip), %rsi # 在 constLocalVar() 中没有
call __printf_chk@PLT
movq 8(%rsp), %rax
xorq %fs:40, %rax
@ -164,7 +166,7 @@ localVar:
.cfi_endproc
```
`LLVM` 生成的 `IR` 代码中更明显。在 `constLocalVar()` 中,第二次调用 `printf()` 之前的 `load` 会被优化掉:
在 LLVM 生成的 `IR` 代码中更明显一点。在 `constLocalVar()` 中,第二次调用 `printf()` 之前的 `load` 会被优化掉:
```
; Function Attrs: nounwind uwtable
@ -182,9 +184,9 @@ define dso_local void @localVar() local_unnamed_addr #0 {
}
```
好吧,现在,`constLocalVar()` 成功的优化了 `*x` 的重新读取,但是可能你已经注意到一些问题:`localVar()` 和 `constLocalVar()` 在函数体中做了同样的 `constFunc()` 调用。如果编译器能够推断出 `constFunc()` 没有修改 `constLocalVar()` 中的 `*x`,那为什么不能推断出完全一样的函数调用也没有修改 `localVar()` 中的 `*x`
好吧,现在,`constLocalVar()` 成功的省略了对 `*x` 的重新读取,但是可能你已经注意到一些问题:`localVar()` 和 `constLocalVar()` 在函数体中做了同样的 `constFunc()` 调用。如果编译器能够推断出 `constFunc()` 没有修改 `constLocalVar()` 中的 `*x`,那为什么不能推断出完全一样的函数调用也没有修改 `localVar()` 中的 `*x`
这个解释更贴近于为什么 `C` 语言的 `const` 不能作为优化手段的核心。`C` 语言的 `const` 有两个有效的含义:它可以表示这个变量是某个可能是常数也可能不是常数的数据的一个只读别名,或者它可以表示这变量真正的常量。如果你移除了一个指向常量的指针的 `const` 属性并写入数据,那结果将是一个未定义行为。另一方面,如果是一个指向非常量值的 `const` 指针,将就没问题。
这个解释更贴近于为什么 C 语言的 `const` 不能作为优化手段的核心原因。C 语言的 `const` 有两个有效的含义:它可以表示这个变量是某个可能是常数也可能不是常数的数据的一个只读别名,或者它可以表示该变量是真正的常量。如果你移除了一个指向常量的指针的 `const` 属性并写入数据,那结果将是一个未定义行为。另一方面,如果是一个指向非常量值的 `const` 指针,将就没问题。
这份 `constFunc()` 的可能实现揭示了这意味着什么:
@ -207,13 +209,15 @@ void doubleIt(int *x)
}
```
`localVar()` 传递给 `constFunc()` 一个指向非 `const` 变量的 `const` 指针。因为这个变量并非常量,`constFunc()` 可以撒个谎并强行修改它而不触发而不触发未定义行为。所以,编译器不能断定变量在调用 `constFunc()` 后仍是同样的值。在 `constLocalVar()` 中的变量是真正的常量,因此,编译器可以断定它不会改变——因为在 `constFunc()` 去除变量的 `const` 属性并写入它*将*会是一个未定义行为。
`localVar()` 传递给 `constFunc()` 一个指向非 `const` 变量的 `const` 指针。因为这个变量并非常量,`constFunc()` 可以撒个谎并强行修改它而不触发未定义行为。所以,编译器不能断定变量在调用 `constFunc()` 后仍是同样的值。在 `constLocalVar()` 中的变量是真正的常量,因此,编译器可以断定它不会改变 —— 因为在 `constFunc()` 去除变量的 `const` 属性并写入它*将*会是一个未定义行为。
第一个例子中的函数 `byArg()``constByArg()` 是没有可能优化的,因为编译器没有任何方法能知道 `*x` 是否真的是 `const` 常量。
第一个例子中的函数 `byArg()``constByArg()` 是没有可能优化的,因为编译器没有任何方法能知道 `*x` 是否真的是 `const` 常量。
但是为什么不一致呢?如果编译器能够推断出 `constLocalVar()` 中调用的 `constFunc()` 不会修改它的参数,那么肯定也能继续在其他 `constFunc()` 的调用上实施相同的优化,是吗?并不。编译器不能假设 `constLocalVar()` 根本没有运行。 如果不是这样(例如,它只是代码生成器或者宏的一些未使用的额外输出),`constFunc()` 就能偷偷地修改数据而不触发未定义行为。
> 补充(和题外话):相当多的读者已经正确地指出,使用 `const int *x`,该指针本身不是限定的常量,只是该数据被加个了别名,而 `const int * const extra_const` 是一个“双向”限定为常量的指针。但是因为指针本身的常量与别名数据的常量无关,所以结果是相同的。仅在 `extra_const` 指向使用 `const` 定义的对象时,`*(int*const)extra_const = 0` 才是未定义行为。(实际上,`*(int*)extra_const = 0` 也不会更糟。)因为它们之间的区别可以一句话说明白,一个是完全的 `const` 指针,另外一个可能是也可能不是常量本身的指针,而是一个可能是也可能不是常量的对象的只读别名,我将继续不严谨地引用“常量指针”。(题外话结束)
你可能需要重复阅读上述说明和示例,但不要担心它听起来很荒谬,它确实是正确的。不幸的是,对 `const` 变量进行写入是最糟糕的未定义行为:大多数情况下,编译器不知道它是否将会是未定义行为。所以,大多数情况下,编译器看见 `const` 时必须假设它未来可能会被移除掉,这意味着编译器不能使用它进行优化。这在实践中是正确的,因为真实的 `C` 代码会在“深思熟虑”后移除 `const`
但是为什么不一致呢?如果编译器能够推断出 `constLocalVar()` 中调用的 `constFunc()` 不会修改它的参数,那么肯定也能继续在其他 `constFunc()` 的调用上实施相同的优化,是吗?并不。编译器不能假设 `constLocalVar()` 根本没有运行。如果不是这样(例如,它只是代码生成器或者宏的一些未使用的额外输出),`constFunc()` 就能偷偷地修改数据而不触发未定义行为。
你可能需要重复阅读几次上述说明和示例,但不要担心,它听起来很荒谬,它确实是正确的。不幸的是,对 `const` 变量进行写入是最糟糕的未定义行为:大多数情况下,编译器无法知道它是否将会是未定义行为。所以,大多数情况下,编译器看见 `const` 时必须假设它未来可能会被移除掉,这意味着编译器不能使用它进行优化。这在实践中是正确的,因为真实的 C 代码会在“深思熟虑”后移除 `const`
简而言之,很多事情都可以阻止编译器使用 `const` 进行优化,包括使用指针从另一内存空间接受数据,或者在堆空间上分配数据。更糟糕的是,在大部分编译器能够使用 `const` 进行优化的情况,它都不是必须的。例如,任何像样的编译器都能推断出下面代码中的 `x` 是一个常量,甚至都不需要 `const`
@ -224,19 +228,19 @@ y += x;
printf("%d %d\n", x, y);
```
TLDR`const` 对优化而言几乎无用,因为:
总结`const` 对优化而言几乎无用,因为:
1. 除了特殊情况,编译器需要忽略它,因为其他代码可能合法地移除它
2. 在 #1 以外地大多数例外中,编译器无论如何都能推断出该变量是常量
1. 除了特殊情况,编译器需要忽略它,因为其他代码可能合法地移除它
2. 在 #1 以外的大多数例外中,编译器无论如何都能推断出该变量是常量
### C++
如果你在使用 `C++` 那么有另外一个方法让 `const` 能够影响到代码的生成。你可以用 `const` 和非 `const` 的参数重载同一个函数,而非 `const` 版本的代码可能可以优化(由程序员优化而不是编译器)掉某些拷贝或者其他事情。
如果你在使用 C++ 那么有另外一个方法让 `const` 能够影响到代码的生成:函数重载。你可以用 `const` 和非 `const` 的参数重载同一个函数,而非 `const` 版本的代码可能可以被优化(由程序员优化而不是编译器),减少某些拷贝或者其他事情。
```
void foo(int *p)
{
// 需要更多的数据拷贝
// 需要更多的数据拷贝
}
void foo(const int *p)
@ -253,24 +257,22 @@ int main()
}
```
一方面,我不认为这会在实际的 `C++` 代码中大量使用。另一方面,为了导致差异,程序员需要做出编译器无法做出的假设,因为它们不受语言保护。
一方面,我不认为这会在实际的 C++ 代码中大量使用。另一方面,为了导致差异,程序员需要假设编译器无法做出,因为它们不受语言保护。
### 用 `Sqlite3` 进行实验
### 用 Sqlite3 进行实验
有了足够的理论和例子。那么 `const` 在一个真正的代码库中有多大的影响呢?我将会在代码库 `Sqlite`版本3.30.0)上做一个测试,因为:
* 它真正地使用了 `const`
* 它不是一个简单的代码库(超过 20 万行代码)
* 作为一个代码库,它包括了字符串处理、数学计算、日期处理等一系列内容
* 它能够在绑定 CPU 下进行负载测试
* 它真正地使用了 `const`
* 它不是一个简单的代码库(超过 20 万行代码)
* 作为一个数据库,它包括了字符串处理、数学计算、日期处理等一系列内容
* 它能够在绑定 CPU 的情况下进行负载测试
此外,作者和贡献者们已经进行了多年的性能优化工作,因此我能确定他们没有错过任何有显著效果的优化。
#### 配置
我做了两份[源码]][2]拷贝,并且正常编译其中一份。而对于另一份拷贝,我插入了这个预处理代码段,将 `const` 变成一个空操作:
我做了两份[源码][2]拷贝,并且正常编译其中一份。而对于另一份拷贝,我插入了这个特殊的预处理代码段,将 `const` 变成一个空操作:
```
#define const
@ -299,7 +301,7 @@ sqlite3_blob_read 7lea 5jmpq 4nopl
#### 分析编译结果
`const` 版本的 `libsqlite3.so` 的大小是 4,740,704 byte大约比 4,736,712 byte 的非 `const` 版本大了 0.1% 。在全部 1374 个导出函数(不包括类似 PLT 里的底层辅助函数)中,一共有 13 个函数的识别码不一致。
`const` 版本的 `libsqlite3.so` 的大小是 4,740,704 字节,大约比 4,736,712 字节的非 `const` 版本大了 0.1% 。在全部 1374 个导出函数(不包括类似 PLT 里的底层辅助函数)中,一共有 13 个函数的识别码不一致。
其中的一些改变是由于插入的预处理代码。举个例子,这里有一个发生了更改的函数(已经删去一些 `Sqlite` 特有的定义):
@ -330,7 +332,7 @@ static int64_t doubleToInt64(double r){
删去 `const` 使得这些常量变成了 `static` 变量。我不明白为什么会有不了解 `const` 的人让这些变量加上 `static`。同时删去 `static``const` 会让 GCC 再次认为它们是常量,而我们将得到同样的编译输出。由于类似这样的局部的 `static const` 变量,使得 13 个函数中有 3 个函数产生假的变化,但我一个都不打算修复它们。
`Sqlite` 使用了很多全局变量,而这正是大多数真正的 `const` 优化产生的地方。通常情况下,它们类似于将一个变量比较代替成一个常量比较,或者一个循环在部分展开的一步。([Radare toolkit][3] 可以很方便的找出这些优化措施。)一些变化则令人失望。`sqlite3ParseUri()` 有 487 指令,但 `const` 产生的唯一区别是进行了这个比较:
`Sqlite` 使用了很多全局变量,而这正是大多数真正的 `const` 优化产生的地方。通常情况下,它们类似于将一个变量比较代替成一个常量比较,或者一个循环在部分展开的一步。([Radare toolkit][3] 可以很方便的找出这些优化措施。)一些变化则令人失望。`sqlite3ParseUri()` 有 487 指令,但 `const` 产生的唯一区别是进行了这个比较:
```
test %al, %al
@ -352,18 +354,18 @@ je <sqlite3ParseUri+0x717>
`Sqlite` 自带了一个性能回归测试,因此我尝试每个版本的代码执行一百次,仍然使用默认的 `Sqlite` 编译设置。以秒为单位的测试结果如下:
| const | No const
| | const | 非 const
---|---|---
Minimum | 10.658s | 10.803s
Median | 11.571s | 11.519s
Maximum | 11.832s | 11.658s
Mean | 11.531s | 11.492s
最小值 | 10.658s | 10.803s
中间值 | 11.571s | 11.519s
最大值 | 11.832s | 11.658s
平均值 | 11.531s | 11.492s
就我个人看来,我没有发现足够的证据说明这个差异值得关注。我是说,我从整个程序中删去 `const`,所以如果它有明显的差别,那么我希望它是显而易见的。但也许你关心任何微小的差异,因为你正在做一些绝对性能非常重要的事。那让我们试一下统计分析。
就我个人看来,我没有发现足够的证据说明这个差异值得关注。我是说,我从整个程序中删去 `const`,所以如果它有明显的差别,那么我希望它是显而易见的。但也许你关心任何微小的差异,因为你正在做一些绝对性能非常重要的事。那让我们试一下统计分析。
我喜欢使用类似 Mann-Whitney U 检验这样的东西。它类似于更著名的 T 检验,但对你在机器上计时时产生的复杂随机变量(由于不可预测的上下文切换,页错误等)更加鲁棒。以下是结果:
我喜欢使用类似 Mann-Whitney U 检验这样的东西。它类似于更著名的 T 检验,但对你在机器上计时时产生的复杂随机变量(由于不可预测的上下文切换、页错误等)更加健壮。以下是结果:
|| const | No const|
|| const | const|
---|---|---
N | 100 | 100
Mean rank | 121.38 | 79.62
@ -378,11 +380,11 @@ HL median difference | -0.056s
U 检验已经发现统计意义上具有显著的性能差异。但是,令人惊讶的是,实际上是非 `const` 版本更快——大约 60ms0.5%。似乎 `const` 启用的少量“优化”不值得额外代码的开销。这不像是 `const` 启用了任何类似于自动矢量化的重要的优化。当然,你的结果可能因为编译器配置、编译器版本或者代码库等等而有所不同,但是我觉得这已经说明了 `const` 是否能够有效地提高 `C` 的性能,我们现在已经看到答案了。
### 那么,`const` 有什么用呢?
### 那么const 有什么用呢?
尽管存在缺陷,`C/C++``const` 仍有助于类型安全。特别是,结合 `C++` 的移动语义和 `std::unique_pointer``const` 可以使指针所有权显式化。在超过十万行代码的 `C++` 旧代码库里,指针所有权模糊是一个大难题,我对此深有感触。
尽管存在缺陷C/C++ 的 `const` 仍有助于类型安全。特别是,结合 C++ 的移动语义和 `std::unique_pointer``const` 可以使指针所有权显式化。在超过十万行代码的 C++ 旧代码库里,指针所有权模糊是一个大难题,我对此深有感触。
但是,我以前常常使用 `const` 来实现有意义的类型安全。我曾听说过基于性能上的原因,最好是尽可能多地使用 `const`。我曾听说过当性能很重要时,重构代码并添加更多的 `const` 非常重要,即使以降低代码可读性的方式。当时觉得这没问题,但后来我才知道这并不对。
但是,我以前常常使用 `const` 来实现有意义的类型安全。我曾听说过基于性能上的原因,最好是尽可能多地使用 `const`。我曾听说过当性能很重要时,重构代码并添加更多的 `const` 非常重要,即使以降低代码可读性的方式。**当时觉得这没问题,但后来我才知道这并不对。**
--------------------------------------------------------------------------------
@ -391,7 +393,7 @@ via: https://theartofmachinery.com/2019/08/12/c_const_isnt_for_performance.html
作者:[Simon Arneaud][a]
选题:[lujun9972][b]
译者:[LazyWolfLin](https://github.com/LazyWolfLin)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,89 @@
[#]: collector: (lujun9972)
[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
[#]: subject: (GNOME 3.34 Released With New Features & Performance Improvements)
[#]: via: (https://itsfoss.com/gnome-3-34-release/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
GNOME 3.34 Released With New Features & Performance Improvements
======
The latest version of GNOME dubbed “Thessaloniki” is here. It is an impressive upgrade over [GNOME 3.32][1] considering 6 months of work there.
With this release, theres a lot of new features and significant performance improvements. In addition to the new features, the level of customization has also improved.
Heres whats new:
### GNOME 3.34 Key Improvements
You may watch this video to have a look at whats new in GNOME 3.34:
#### Drag and drop app icons into a folder
The new shell theme lets you drag and drop the icons in the app drawer to re-arrange them or compile them into a folder. You may have already used a feature like this in your Android or iOS smartphone.
![You can now drag and drop icons into a folder][2]
#### Improved Calendar Manager
The improved calendar manager integrates easily with 3rd party services and gives you the ability to manage your schedule right from your Linux system without utilizing another app separately.
![GNOME Calendar Improvements][3]
#### Background selection settings
Its now easier to select a custom background for the main screen and lock screen as it displays all the available backgrounds in the same screen. Saves you at least one mouse click.
![Its easier to select backgrounds now][4]
#### Re-arranging search options
The search options/results can be re-arranged manually. So, you can decide what comes first when you head to search something.
#### Responsive design for Settings app
The settings menu UI is now responsive so that you can easily access all the options no matter what type (or size) of device youre on. This is surely going to help GNOME on [Linux smartphones like Librem 5][5].
In addition to all these, the [official announcement][6] also notes useful additions for developers (additions to system profiler and virtualization improvements):
> For developers, GNOME 3.34 includes more data sources in Sysprof, making performance profiling an application even easier. Multiple improvements to Builder include an integrated D-Bus inspector.
![Improved Sysprof tool in GNOME 3.34][7]
### How to get GNOME 3.34?
Even though the new release is live it hasnt yet reached the official repositories of your Linux distros. So, we recommend to wait it out and upgrade it when its available as update packages. In either case, you can explore the [source code][8] if you want to build it.
[][9]
Suggested read  Fedora 26 Is Released! Check Out The New Features
Well, thats about it. If youre curious, you may check out the [full release notes][10] for technical details.
What do you think about the new GNOME 3.34?
--------------------------------------------------------------------------------
via: https://itsfoss.com/gnome-3-34-release/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://www.gnome.org/news/2019/03/gnome-3-32-released/
[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/icon-grid-drag-gnome.png?ssl=1
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/gnome-calendar-improvements.jpg?ssl=1
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/background-panel-GNOME.png?resize=800%2C555&ssl=1
[5]: https://itsfoss.com/librem-linux-phone/
[6]: https://www.gnome.org/press/2019/09/gnome-3-34-released/
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/sysprof-gnome.jpg?resize=800%2C493&ssl=1
[8]: https://download.gnome.org/
[9]: https://itsfoss.com/fedora-26-release/
[10]: https://help.gnome.org/misc/release-notes/3.34/

View File

@ -0,0 +1,84 @@
[#]: collector: (lujun9972)
[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
[#]: subject: (Manjaro Linux Graduates From A Hobby Project To A Professional Project)
[#]: via: (https://itsfoss.com/manjaro-linux-business-formation/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
Manjaro Linux Graduates From A Hobby Project To A Professional Project
======
_**Brief: Manjaro is taking things professionally. While the Manjaro community will be responsible for the development of the project and other related activities, a company has been formed to work as its legal entity and handle the commercial agreements and professional services.**_
Manjaro is a quite popular Linux distribution considering that it was just a passion project by three people, Bernhard, Jonathan and Philip, which came into existence in 2011. Now that its one of the [best Linux distros][1] out there, this cant really remain a hobby project, right?
Well, heres good news: Manjaro has established a new company “**Manjaro GmbH &amp; Co. KG**” with [Blue Systems][2] as an advisor to enable full-time employment of maintainers and exploration of future commercial opportunities.
![][3]
### What is exactly the change here?
As per the [official announcement][4], the Manjaro project will stay as-is. However, a new company has been formed to secure the project and allow them to make legal contracts, official agreements, and other potential commercial activities. So, this makes the “hobby project” a professional endeavor.
In addition to this, the donation funds will be transferred to non-profit [fiscal hosts][5] ([CommunityBridge][6] and [OpenCollective][7]) which will then accept and administer the funds on behalf of the project. Do note, that the donations havent been used to create the company so the transfer of funds to a non-profit fiscal host will ensure transparency while securing the donations.
### How does this improve things?
With the company formed, the new structure will help Manjaro in the following ways (as mentioned by the devlopers):
* enable developers to commit full time to Manjaro and its related projects;
* interact with other developers in sprints and events around Linux;
* protect the independence of Manjaro as a community-driven project, as well as protect its brand;
* provide faster security updates and a more efficient reaction to the needs of users;
* provide the means to act as a company on a professional level.
[][8]
Suggested read  Linux Mint Website Hacked, ISOs Compromised With Backdoor
The Manjaro team also shed some light on how its going to stay committed to the community:
> The mission and goals of Manjaro will remain the same as before to support the collaborative development of Manjaro and its widespread use. This effort will continue to be supported through donations and sponsorship and these will not, under any circumstances, be used by the established company.
### More about Manjaro as a company
Even though they mentioned that the project will remain independent of the company, not everyone is clear about the involvement of Manjaro with the “community” while having a company with commercial interests. So, the team also clarified about their plans as a company in the announcement.
Manjaro GmbH &amp; Co. KG has been formed to effectively engage in commercial agreements, form partnerships, and offer professional services. With this, Manjaro devs Bernhard and Philip will now be able to commit full-time to Manjaro, while Blue Systems will take a role as an advisor.
The company will be able to sign contracts and cover duties and guarantees officially, which the community cannot take or be held responsible for.
**Wrapping Up**
So, with this move, along with commercial opportunities, they plan to go full-time and also hire contributors.
Of course, now they mean “business” (not as the bad guys, I hope). Most of the reactions to this announcement are positive and we all wish them good luck with this. While some might be skeptical about a “community” project having “commercial” interests (remember the [FreeOffice and Manjaro fiasco][9]?), I see this as an interesting move.
What do you think? Feel free to let us know your thoughts in the comments below.
--------------------------------------------------------------------------------
via: https://itsfoss.com/manjaro-linux-business-formation/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://itsfoss.com/best-linux-distributions/
[2]: https://www.blue-systems.com/
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/manjaro-gmbh.jpg?ssl=1
[4]: https://forum.manjaro.org/t/manjaro-is-taking-the-next-step/102105
[5]: https://en.wikipedia.org/wiki/Fiscal_sponsorship
[6]: https://communitybridge.org/
[7]: https://opencollective.com/
[8]: https://itsfoss.com/linux-mint-hacked/
[9]: https://itsfoss.com/libreoffice-freeoffice-manjaro-linux/

View File

@ -0,0 +1,161 @@
[#]: collector: (lujun9972)
[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
[#]: subject: (How to Collect System and Application Metrics using Metricbeat)
[#]: via: (https://www.linuxtechi.com/collect-system-application-metrics-metricbeat/)
[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
How to Collect System and Application Metrics using Metricbeat
======
**Metricbeat** is a lightweight shipper (or agent) which is used to collect systems metrics and application metrics and send them to Elastic Stack Server (i.e **Elasticsearch**). Here systems metrics refers to CPU, Memory, Disk and Network Stats (IOPS) and application metrics means monitoring and collecting metrics of applications like **Apache**, **NGINX**, **Docker**, **Kubernetes** and **Redis** etc. For metricbeat to work first we must make sure that we have a healthy elastic stack setup up and running.  Please refer the below url to setup elastic stack:
**[How to Setup Multi Node Elastic Stack Cluster on RHEL 8 / CentOS 8][1]**
In this article we will demonstrate how install metricbeat on linux servers and then how metricbeat sends data to Elastic Stack Server (i.e Elasticsearch) and then we will verify from kiabana GUI whether metrics data is visible or not.
### Install Metricbeat on CentOS / RHEL Servers
On CentOS / RHEL Servers, metricbeat is installed using the following rpm command,
```
[root@linuxtechi ~]# rpm -ivh https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.3.1-x86_64.rpm
```
For Debian based systems, use below command to install metricbeat.
```
~]# curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.3.1-amd64.deb
~]# dpkg -i metricbeat-7.3.1-amd64.deb
```
Add the following lines in /etc/hosts file, as we will be using FQDN of Elasticsearch and Kibana in metricbeat config file and command,
**Note:** Change the IPs and Hostname as per  your setup
```
192.168.56.40 elasticsearch1.linuxtechi.local
192.168.56.50 elasticsearch2.linuxtechi.local
192.168.56.60 elasticsearch3.linuxtechi.local
192.168.56.10 kibana.linuxtechi.local
```
### Configure Metricbeat on Linux Server (CentOS / RHEL / Debian)
Whenever metricbeat rpm &amp; deb package is installed then its configuration file (**metricbeat.yml**) is created under “**/etc/metricbeat/**“. Lets edit this configuration file and inform system to send system and application metrics data to Elasticsearch servers.
```
[root@linuxtechi ~]# vi /etc/metricbeat/metricbeat.yml
setup.kibana:
host: "kibana.linuxtechi.local:5601"
output.elasticsearch:
hosts: ["elasticsearch1.linuxtechi.local:9200","elasticsearch2.linuxtechi.local:9200","elasticsearch3.linuxtechi.local:9200"]
```
Save and exit the file
**Note:** Replace Elasticsearch and Kibana details that suits to your environment.
Run following metricbeat command so that metric dashboard become available in Kibana GUI.
```
[root@linuxtechi ~]# metricbeat setup -e -E output.elasticsearch.hosts=['elasticsearch1.linuxtechi.local:9200','elasticsearch2.linuxtechi.local:9200','elasticsearch3.linuxtechi.local:9200'] -E setup.kibana.host=kibana.linuxtechi.local:5601
```
Output of above command would be something like below:
![metricbeat-command-output-linuxserver][2]
Above output confirms that metrics dashboard is loaded successfully in Kibana GUI. Now via metricbeat it will send the metrics data to Elastic Stack server every 10 seconds.
Lets start and enable metricbeat service using following commands,
```
[root@linuxtechi ~]# systemctl start metricbeat
[root@linuxtechi ~]# systemctl enable metricbeat
```
Now go to Kibana GUI and click on Dashboard from left side bar,
[![Kibana-GUI-Dashbaord-Option][2]][3]
In the next window we will see available metrics dashboards, search **system** and then choose System Metrics Dashboard,
[![Choose-Metric-Dashbaord-Kibana][2]][4]
[![Metricbeat-System-Overview-ECS-Kibana][2]][5]
As we can see Systems metrics data is available on the dashboard, these metrics are collected based on entries mentioned in the file “**/etc/metricbeat/modules.d/system.yml**”
Lets suppose we want to collect applications metrics data as well then we have to first enable their respective modules, to enable Apache and MySQL metric module ,run the following command from client machine,
```
[root@linuxtechi ~]# metricbeat modules enable apache mysql
Enabled apache
Enabled mysql
[root@linuxtechi ~]#
```
Once we enable the modules, we can edit their yml file,
```
[root@linuxtechi ~]# vi /etc/metricbeat/modules.d/apache.yml
- module: apache
period: 10s
hosts: ["http://192.168.56.70"]
```
Change IP in host parameter that suits to your environment.
Similarly edit mysql yml file, Change mysql root credentials that suits to your environment
```
[root@linuxtechi ~]# vi /etc/metricbeat/modules.d/mysql.yml
………
- module: mysql
metricsets:
- status
- galera_status
period: 10s
hosts: ["root:root@linuxtechi(127.0.0.1:3306)/"]
………
```
After making the changes restart the metricbeat service,
```
[root@linuxtechi ~]# systemctl restart metricbeat
```
Now Go to Kibana GUI and under Dashboard option, look for MySQL metrics,
[![Metricbeat-MySQL-Overview-ECS-Kibana][2]][6]
As we can see above, MySQL metrics data is visible, this confirms that we have successfully installed and configure metricbeat.
Thats all from tutorial, If these steps help you to setup metricbeat then please do share your feedback and comment.
--------------------------------------------------------------------------------
via: https://www.linuxtechi.com/collect-system-application-metrics-metricbeat/
作者:[Pradeep Kumar][a]
选题:[lujun9972][b]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://www.linuxtechi.com/author/pradeep/
[b]: https://github.com/lujun9972
[1]: https://www.linuxtechi.com/setup-multinode-elastic-stack-cluster-rhel8-centos8/
[2]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Kibana-GUI-Dashbaord-Option.jpg
[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Choose-Metric-Dashbaord-Kibana.jpg
[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Metricbeat-System-Overview-ECS-Kibana.jpg
[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Metricbeat-MySQL-Overview-ECS-Kibana.jpg