内核的另一种称呼
由于历史原因,我们将环境标准化为 Ubuntu 服务器。通常,当新的 Ubuntu LTS 版本发布时,我们和许多其他人一样,开始在新版本上部署任何新的安装,同时我们开始计划升级我们最过时的服务器。当 10.04 (lucid) 发布时,我们已经拥有了最高到 8.04 (hardy) 的版本,因此将所有内容升级到较新的版本不会非常痛苦。至少我们是这么想的,但是当我们安装我们的第一台 10.04 服务器时,我们感到惊讶。
不久前,我曾被 x86_64 版本内核中的一些错误所困扰,而这些错误在 32 位内核中不存在。多年来,32 位代码一直更加成熟可靠,而 x86_64 则远未经过充分的测试。我决定尽可能坚持使用 32 位代码,除非我有特定的需求只能通过 64 位功能提供,例如需要超过 2GB 内存的单个进程。新安装的单元将是一个 32 位实例。
我使用 kickstart 和脚本的组合来安装新机器。我在首次启动时运行的脚本执行以下操作,以确保我们拥有设置为在启动时运行的最新服务器内核。
apt-get --assume-yes install linux-server
这有点像一次性命令,所以我通常不会回头检查它。我们部署该服务器是为了响应不断增加的负载,并且需要尽快投入使用。它已安装、测试并在生产环境中运行了几个小时,然后我才注意到负载平均值大约是其他服务器的四倍(所有服务器都是 8.04 - 我们在测试环境中使用了 lucid,但在那里的负载测试总是很难完全模拟,所以直到我们看到完整的生产负载时,问题才变得明显。经过一番调查,找到了原因,并且自定义内核编译解决了这个问题。事实证明,这是我应该知道的事情 - 在 lucid 中,x86 *没有*服务器内核软件包。linux-server 软件包是指向 linux-generic-pae(带有大内存支持的桌面内核)的指针。
我为什么要在意安装哪个内核版本?这有什么区别吗?简短的答案是肯定的,非常重要。桌面内核和服务器内核之间有两个主要区别:IRQ 定时和调度器。还有一些其他的区别。如果您这样比较标准桌面内核和两个内核编译配置
diff --suppress-common-lines -y config-[version]-server config-[version]-generic
您会看到所有这些区别。主要区别如下
CONFIG_DEFAULT_IOSCHED="deadline" | CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_HZ=100 | CONFIG_HZ=250
CONFIG_HZ 指的是内核每秒检查需要处理的事件的频率。您可能会认为每秒 250 次 > 每秒 100 次,更频繁一定更好,因此这是一个更好的设置,对于某些类型的工作负载来说确实如此。当您希望确保您的系统在响应您的按键时快速而灵敏时,例如如果您正在玩街机风格的游戏,那么将该设置稍微调高一点肯定是有意义的。另一方面,随着系统负载的增加和中断队列开始增长,更频繁地检查开始呈指数级增加将事件从内核传递到用户空间所需的上下文切换次数。随着每秒事件数的增加,减少每秒检查次数在提高服务器容量方面变得越来越重要,并且随着系统可用的处理器数量的增加,每秒检查次数会乘以处理器数量,因此可以根据系统架构安全地减少该数量。通常,需要在请求延迟和吞吐量之间取得平衡,这可能需要一些实验来优化。
调度器,或调度算法,是内核用来选择要运行的命令集的算法。CFQ(完全公平队列)调度器是通用桌面内核的默认调度器。它的设计目的是确保每个进程,即使是很少生成事件的进程,都能获得平等的运行任务的时间。这非常适合平滑负载下的桌面系统,并防止响应通过键盘或鼠标生成的用户事件时出现延迟。但在专用于特定任务的系统(如服务网页或处理 VoIP 事件)上,它就表现不佳了。对于服务器类型的工作负载,您 *希望* 特定进程能够占用处理器和磁盘访问。这就是 deadline 调度器旨在实现的目标。顾名思义,它试图保证没有任务的等待执行时间会超过特定时间。我上面新部署的服务器的问题是,当 CFQ 调度器优先考虑较少使用的任务时,您真正希望系统处理的事件会变得越来越旧,即使它正在生成越来越多的中断,再加上更高的时钟频率以进行更频繁的检查,问题就会加剧,导致负载平均值增加四倍。
我能够通过使用我需要的选项自定义内核编译来相对快速地解决这个问题,但我无法理解为什么 Ubuntu 内核团队会基本上放弃 32 位系统的服务器内核。当我可以预先打包的内核时,对我来说保持安全性和错误修复的最新状态肯定更容易,所以这对我来说代表着轻微的不便。
所以我加入了 freenode #ubuntu-kernel 频道,我发现他们明知故犯地、故意地、永久地取消了 x86 的服务器内核。他们正在将资源投入到两种架构中,而 x86_64 内核的 bug 更多,同时对它的需求不断增加,而对 x86 内核的需求却在减少。与此同时,越来越多的人迁移到 x86_64,然后抱怨质量并迁移回或迁移到另一个发行版。(就像我做的那样。)因此,他们做出了战略决策,转向一种服务器架构 x86_64,因为现在几乎所有服务器级硬件都支持它,并且很快它就会像 x86 内核一样经过锤炼和测试。在规划您的服务器路线图时,请记住这一点。
从今以后,我会更加密切地关注 ubuntu-devel@lists.ubuntu.com 和 kernel-team@same。