我们在使用默认 SLES11 SP2 内核时发现了与 I/O 相关的性能问题。我们在相同硬件上的相同应用程序没有任何问题(公认古老的 SLES9 SP3)。
我们感觉这与内核有关,到目前为止已经做了以下实验:
- 下载并解压 kernel.org
3.0.13
源代码树。 - 安装了 Novell 的
kernel-source-3.0.13-0.27.1
软件包。这是3.0.13
已应用所有 Novell 补丁/调整的源。 - 在
3.0.13
树中生成了make x86_64_defconfig
默认配置文件,然后用于make menuconfig
打开我们的硬件所需的驱动控制器和网卡驱动程序并构建内核。该内核存在no
性能问题。 - 在
3.0.13-0.27.1
树中,我们获得了 Novell 随编译内核一起提供的配置文件,并使用它进行构建,并且遇到了与 Novell 编译内核相同的性能问题。 - 在
3.0.13-0.27.1
树中,获取 (3) 中使用的配置文件,并用它构建(接受 Novell 版本的配置器想要添加的附加配置默认值)。有不性能问题。 - 在
3.0.13
树中,获取 (4) 中使用的配置文件,并用它构建(丢失文件中仅 Novell 的配置选项)。有不性能问题。 - 在
3.0.13-0.27.1
树中,获取 (4) 中使用的配置文件,并使设备驱动程序(但没有其他内容)与 (3) 中的配置文件匹配(即关闭大量尚未使用的设备驱动程序) 。有不性能问题。
所以 kernel.org3.0.13
树无论如何都没有性能问题。3.0.13-0.27.1
仅当我们使用 Novell 的配置文件或与 Novell 的配置文件相同但大多数设备驱动程序已取消配置的文件进行构建时,Novell 的树才会出现问题。
鉴于此,似乎有一些 Novell-only 配置选项(以及隐含的它激活的 Novell 代码)导致了问题,或者 Novell 补丁和一些标准选项之间存在一些不良交互(假设尽可能接近) as-possible-to-Novell's-config 做到了不是在针对原始 kernel.org 源代码构建时出现问题)。
在我们继续调查的同时,由于我不是内核黑客(我知道如何构建内核,但仅此而已),我想知道配置选项的哪些“系列”是最值得关注的。这个想法是将一些选项从“Novell”设置更改为“kernel.org”设置,看看问题是否消失,然后将它们设置回来并尝试另一组,依此类推。
但我想缩小范围——因此问题是哪些配置选项是首先使用的好选择。
答案1
我们解决了问题!对“好”和“坏”内核之间的配置选项差异进行准二分搜索,我们发现问题是由于 SLES11ext3
默认打开写屏障造成的。默认情况下关闭写屏障构建的内核确实如此不是有问题。当我们使用有问题的内核,但将barrier=0
mount 选项放入时/etc/fstab
,问题就消失了。