![为什么Linux发行版的性能不同?](https://linux22.com/image/167730/%E4%B8%BA%E4%BB%80%E4%B9%88Linux%E5%8F%91%E8%A1%8C%E7%89%88%E7%9A%84%E6%80%A7%E8%83%BD%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
Phoronix 发布一个对比9 个操作系统。最快的三个是:
- 清除Linux 32310
- CentOS Stream(而滚动的 Manjaro 是倒数第二个)
- Fedora 工作站 31
造成这种差异的根本原因是什么,尤其是滚动的 CentOS 和 Manjaro 之间?他们提供不同的内核吗? CentOS 软件包是否使用更多优化标志?他们默认使用不同的 IO 队列或调控器吗?
答案1
以下是我从头到尾能想到的因素:
- 内核配置
- CPU和IO调度器的选择
- 系统启动后有多少个应用程序同时运行
- 编译内核时使用的编译器标志
- 编译基准测试中使用的应用程序时使用的编译器标志
- 编译器(GCC vs Clang vs ICC,旧 GCC vs 新 GCC)
- 交换性
- 文件系统选择(ext4、XFS、BTRFS、ZFS)
- 磁盘配置(软件RAID)
对于 Clear Linux 来说,他们引以为豪的是:
- 优化编译标志
- 使用最新的Linux内核
- 使用自定义补丁修补内核以提高性能
- 使用 AVX512 指令,如果 CPU 可以支持它们(这会产生巨大的差异)
使用 CPU 可以提供的完整指令集会产生重大影响。
作为比较,Arch Linux(和 Manjaro)为通用 64 位 x86 CPU 提供了使用 GCC 编译的内核、库和可执行文件 ( -march=x86-64 -mtune=generic
)。这提供了良好的性能,但不如专门为其运行的 CPU 编译的可执行文件。
使用elfx86extsArch Linux上的工具/usr/bin/ls
至少显示需要哪些 CPU 指令:
$ elfx86exts /usr/bin/ls
MODE64 (call)
CMOV (cmovne)
SSE2 (movdqa)
SSE1 (movups)
CPU Generation: Intel Core
我还没有机会在 Clear Linux 上尝试相同的操作,但我假设会出现更长的指令列表。
总之,修补内核和调整内核配置可以带来良好的结果,但最重要的是,支持可用的 CPU 指令会带来很大的不同。
答案2
手动调整编译标志所带来的性能增益被高估了。而且成本是不小的(如果你编译了一种适合你的机器的配置,我为我的机器定制了一个不同的配置,你偶然发现的任何错误都将只属于你自己,很可能我会有自己的私人一套)。
获取一本 Bentley 的“编写高效程序”(遗憾的是早已绝版)或他的“编程珍珠”(第二版)。真正的性能提升要难得多,而且要大几个数量级。