Generic kernel 和 Server Kernel

有一批机器,原本应该是 2.6.32-33-server 版本的内核,实际却是 2.6.32-33-generic。安装的版本为 Ubuntu-10.04.3-amd64。

server 版跟 generic(desktop) 的版本的差异主要体现在下面几个方面:

* The Server Edition uses the Deadline I/O scheduler instead of the CFQ scheduler used by the Desktop Edition.

* Pre-emption is turned off in the Server Edition.

* The timer interrupt is 100 Hz in the Server Edition and 250 Hz in the Desktop Edition.

* The Server Edition is optimised for i686 processors while the Desktop Edition is optimised for both the i586 and i686.

* Virtualization is better supported in the Server Edition through the enabling of IPC namespaces.

* Multiple routing tables for the IPv6 protocol are also supported in the Server Edition.

* For 32-bit systems the Server Edition is configured to use PAE which allows addressing up to 64GB of memory while the Desktop Edition is configured for 4GB.

* When running a 64-bit version of Ubuntu on 64-bit processors you are not limited by memory addressing space.

以上摘自官方的 serverguide

下面是根据 serverwatch 上对 server 和 generic 的 config 文件的测评大致翻译而来。他们使用的是 2.6.22-14 内核。

I/O 调度(Scheduler)

Ubuntu 上有 4 种 I/O 调度方式:CFQ(Completely Fair Queuing),Deadline,NOOP,Anticipatory。desktop 默认为 CFQ,server 默认为 DeadLine。
跟上述有关的选项为 CONFIG_DEFAULT_IOSCHED,CONFIG_DEFAULT_DEADLINE,CONFIG_DEFAULT_CFQ
关于这四种调度方式的区别,摘录如下:

1.CFQ tries to balance all read/write requests equally.
2.Deadline gives a higher priority to read requests, and will re-order read/write requests aggressively to meet the goal of completing read requests within a specified time, without "starving" write requests, which are not given deadlines.
3.Anticipatory aims to reduce latency by giving priority to already-running applications. It is supposed to be suitable for smaller systems with one or two hard disks, and single or dual-core CPUs.
4.NOOP is a minimal scheduler for systems with hardware that handles I/O scheduling, like large SCSI RAID arrays.

使用哪种调度方式需要根据你的系统以及如何使用而定:cpu,硬盘的大小以及个数,上层应用程序的类型,系统的负载等。可以在系统启动的时候传递 scheduler 选项给内核,甚至可以在每一个 block 设备中使用不同的调度方式,在系统运行时修改他们,而不需要重启。

如果要在系统启动时选择调度的种类,使用 'elevator=deadline',noop','as' 或者 'cfq'。
如果想在系统运行时修改:

# echo SCHEDNAME > /sys/block/DEV/queue/scheduler

抢占(Preemption)

server 的内核将内核抢占(kernel preemption)关闭了(CONFIG_PREEMPT_NONE=y),而 desktop 则将其开启(CONFIG_PREEMPT_BKL=y, CONFIG_PREEMPT_VOLUNTARY=y)。抢占通常跟调度配合工作以提供更好的性能,效率。在非抢占式内核中,内核代码会一直运行到结束,在这期间,调度(scheduler)不会触及他。而 Linux 内核允许任务几乎在任何时间点都能被打断,因而哪些权重比较小的任务会到最后才被执行。
对于 desktop 版本的用户来说,使用抢占模式是比较好的选择,通常他们会同时做几件事:写文档,听音乐,网上冲浪,下载电影等。用户通常不会关心后台的程序是如何运转的,他们唯一关心的就是他们目前在使用的程序的正常运行。所以当一个用户在使用 thunderbird 写邮件时,加载网页的速度比较慢,他们是能接受这样的情况的。尽管整体的性能降低了,但是对用户来说,他们并没有感觉的到。
对与 server 来说,应该尽可能的减少这种性能上的 hits,所以关闭抢占通常是一个比较好的做法。

内存(Memory)

32 bit 的 server 内核能支持 64GB 的内存,而如果使用 desktop(generic) 的来说,则只能达到 4GB(CONFIG_HIGHMEM64G=y, CONFIG_HIGHMEM4G=y)。32 位的地址空间在不经过修改的情况下只能支持 4GB 的内存,否则需要使用 intel 的 Physical Address Extension(PAE) 模式。在 64 位的系统上,则不需要进行任何的 hack 来弥补地址空间的不足,当然如果你的 ram 容量超过了 16 Exabytes 是另一回事。

系统时间(Ticks) & HZ

不管是 generic 还是 server 的内核,他们都支持请求式的中断时钟(CONFIG_NO_HZ=y),或者所谓的"tickless" 选项。这意味着当处于无活动的时间段,系统会进入 idle 状态,这会省电。
server 的内核将定时器的中断频率设为了 100hz(CONFIG_HZ=100, CONFIG_HZ_100=y),这表示他可以接受每秒 100 次的中断。而 desktop 的为 250hz。数字越低,开销越低,传输延时越高。当这个值设的越高时,系统也变得更加“敏感”,其代价会消耗更多的 CPU。有些进程需要更多的中断,比如视频的处理以及 VoIP。

CPU 族(Families)

server 的内核使用 CONFIG_M686=y 而 desktop 的则使用 CONFIG_M586=y。这意味着 server 的对 Pentium Pro 的指令集更优化而 desktop 则是针对的整个 586 和 686 族。这个在一般情况下体现并不明显,然后如果你自己编译内核,选则针对你自己 CPU 的选项会对系统整体的性能有很大的影响。

泄露 IPC 名字空间(Leaky IPC namespace)

在虚拟化流行之前,有一套单一的 IPC 对象(共享内存段,消息队列,信号)供内核使用。而虚拟环境必须将他们的 IPC 固定在自己的容器中,不能产生泄露,因而有了 IPC 名字空间。这个在 server 版的内核中默认是开启的(CONFIG_IPC_NS=y, CONFIG_UTS_NS=y),而 desktop 中则没有这套机制。

最后,server 支持多 IPv6 路由表,而 desktop 则不支持。

这个是我们在 ubuntu-10.04.3-server-amd64.iso 上来对比的 server 与 generic config 文件的不同。

# mount -o loop ubuntu-10.04.3-server-amd64.iso /mnt
# mkdir /tmp/{gen,ser}
# cp /mnt/pool/main/l/linux/linux-image-2.6.32-33-generic_2.6.32-33.70_amd64.deb /tmp/gen
# cp /mnt/pool/main/l/linux/linux-image-2.6.32-33-server_2.6.32-33.70_amd64.deb /tmp/ser
# cd /tmp

# ar -x gen/linux-image-2.6.32-33-generic_2.6.32-33.70_amd64.deb
# tar jxvf gen/data.tar.bz2

# ar -x ser/linux-image-2.6.32-33-server_2.6.32-33.70_amd64.deb
# tar jxvf ser/data.tar.bz2

# diff –suppress-common-lines  -y gen/boot/config-2.6.32-33-generic  ser/boot/config-2.6.32-33-server

具体的就不在此列出了。可以看到大部分跟 2.6.22-14 是相同的,少部分不同。看单词应该能猜出基本的意思。

要将现在的 generic 修改为 server 操作很简单:

# apt-get install linux-image-2.6.32-33-server

重启就可以了。

参考:

http://www.serverwatch.com/tutorials/article.php/3715071/Ubuntu-Server–Kernel-Configuration-Considerations.htm
http://www.serverwatch.com/sreviews/article.php/3716396/Ubuntu-Server-Kernel-Comparisons-and-Implementation-Issues.htm

  • http://www.mftvrocks.org/ mftvrocks.org

    不错,学习了