Archive for 07月, 2007

祝我生日快乐!

星期二, 07月 31st, 2007

[ Happy 心情: Happy ]
生日快乐!
おたんじょうびおめでとう!
Happy Birthday!
Bon Anniversaire!

low-latency kernel

星期日, 07月 1st, 2007

[ Sleepy 心情: Sleepy ]
我用linux最关注的是应用,而不是开发。

我所追求的是简单而不简陋,朴素而不寒酸的桌面环境,追求功能的多样性和高性能。

这些都是些trade off的东西,所谓鱼与熊掌不可兼得。

gnome是接近我理想的尤物,或许出自同门(gtk)的xfce以后也可以到达这个水准(可是那个时候还能叫xfce么?xfce是以功能的简约来达到高性能的目的)。

我选择ubuntu是因为简单无须过多的设置,完善的包安装管理方式,快速的更新周期,完全满足日常应用的功能,强大的社区支持和符合本人个性的用户界面环境。

每次的ubuntu版本更新换代,都能带来性能和功能上的提升,这令我非常满意——也有些令人费解——这两者不是辩证的关系么?

说了一堆废话,进入我们今天的正题。

无意在论坛中得知了low latency kernel的存在(严格说来应该是以前就在7.04的pool里看到了,只是不知干嘛用的,毕竟主流默认的都是generic)。特意去狗狗了一下:

引用:
Preemption Model

内核抢占模式

No Forced Preemption (Server)

适合服务器环境的禁止内核抢占

Voluntary Kernel Preemption (Desktop)

适合普通桌面环境的自愿内核抢占

Preemptible Kernel (Low-Latency Desktop)

适合运行实时程序的主动内核抢占

Preempt The Big Kernel Lock

可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境

引用:
Processor type and features–>Preemption Model
这是一个单选条目。它是一条对桌面响应能力有很重要意义的选项,我强烈建议大家选择Preemptible Kernel (Low-Latency Desktop) ,选中这项会定义CONFIG_PREEMPT宏,表示该内核将支持抢占式内核(Preemptible Kernel )特性。为了突出它的重要性,我下面通过一个例子简单介绍一下抢占式内核的概念:假设某系统中(假定只有一个逻辑CPU)有两个线程在运行,一个叫线程 H,一个叫线程L,线程H的动态优先级要比线程L高,在某一时刻,线程H由于等待键盘响应进入了阻塞状态,这时内核将会调度线程L将其投入运行,而再假设在线程L运行的过程中由于某种原因进入了内核空间(这里主要指由于系统调用或者异常),而恰巧在L进入了内核之后用户按下了键盘,键盘中断导致线程H从阻塞状态进入了就绪状态,那么按照正常的逻辑此时应该立刻将CPU交给线程H(因为线程H的动态优先级高),从而让线程H立刻进行用户按键后的操作处理。这个时候,如果系统支持抢占式内核特性的话,那么linux确实会像刚才的逻辑那样做,但是如果不支持抢占式内核特性的话,那么线程H将无法立刻得到执行,它必须要等到线程L完成了在内核空间中的所有工作并返回用户空间的前一刻才能得到调度,这就会对线程H造成一个调度上的延迟,这种延迟最大可能达到几百毫秒之多,而几百毫秒的延时可能让人产生响应迟钝的感觉。因此对于以响应能力为重要指标的桌面系统来说,抢占式内核特性是很重要的(据我所知windows 与mac os x的内核都属于抢占式内核),因此极力建议大家选中这项。
抢占式内核特性是从2.6.x内核开始有的,我从fedora core 2一直到fedora core 6以及ubuntu 6.10自己编译的内核都开启这个特性,从来没有遇到过任何稳定性方面的问题,所以请大家放心。另外,再多说一句,不要把抢占式内核与抢占式多任务(preemptive multitasking)混为一谈,linux从最开始就是支持抢占式多任务的。

引用:
设定桌面计算机(Desktop)要留意的选项

* Preemption Model
o Preemption (Low-Latency Desktop) (PREEMPT) – 开启这选项可以令多媒体播放更流畅,是桌面计算机必用的选项。
o Preempt The Big Kernel Lock (PREEMPT_BKL) – 建议开启。
o Timer frequency (CONFIG_HZ_250 或者 CONFIG_HZ_1000) – 对桌面计算机来说,选250Hz而可以令多媒体播放很流畅,但如果你对这方便要求高,可以考虑使用1000Hz,但留意电量较高。
* Block Layer -> IO Schedulers – 建议使用CFQ I/O排程器。这是决定使用硬盘存取排程器。在桌面平代方面,CFQ的表现较平均。

[编辑]
设定笔记簿型计算机(Laptop/Notebook)要留意的选项

* 留意上面设定桌面计算机(Desktop)要留意的选项
o Timer frequency (CONFIG_HZ_250) – 对笔记簿型计算机来说,选250Hz而可以令多媒体播放很流畅,而1000Hz会令电池寿命大大缩短。

另外,发行不久的ubuntu studio也默认用的是low latency内核——这个给我吃了一颗定心丸。

发现确实low latency是一个不错的东东,开启了实时抢占任务模式。人家比我说的有道理多了,故不在这里滥竽充数。

心动不如行动,立马装上了low latency kernel,并编译了ati的对应内核模块(这里说一下,两个模块完全可以共存,没有影响的。也就是说,编译了两次不同的模块,以后启动机器时任意选择哪个内核都是ok的)。

体验了一下,也许是心理作用吧,好像是快了一点,至少我打开程序时等待的时间短了一些,毕竟是“实时响应”的嘛 Very Happy

顺便贴一下对比两个内核的不同配置文件,其实改动很少,只有几处(上方是generic,下方是low latency):

代码:
# Linux kernel version: 2.6.20-16-generic
# Thu Jun  7 18:16:52 2007

# Linux kernel version: 2.6.20-16-lowlatency
# Thu Jun  7 18:46:27 2007

代码:
CONFIG_VERSION_SIGNATURE="Ubuntu 2.6.20-16.29-generic"

CONFIG_VERSION_SIGNATURE="Ubuntu Unofficial"

代码:
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set

# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y

代码:
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250

# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000

代码:

CONFIG_DEBUG_PREEMPT=y

很简单对吧?
其实就是开启了low latency和把timer frequecy调高到了1000HZ,可使多媒体播放更流畅(不过耗电厉害点)。

对于我这种又想要性能又死活不愿意自己编译内核的家伙来说,是捡了大便宜了——这也是我喜欢ubuntu的原因之一。

大家如果也像我一样喜欢偷懒的话,不妨就这么着Very Happy

对了,这个内核的安装只需

代码:
sudo apt-get install linux-lowlatency

引用:
Package: linux-lowlatency
Priority: optional
Section: multiverse/admin
Installed-Size: 52
Maintainer: Ubuntu Kernel Team <kernel-team@lists.ubuntu.com>
Architecture: i386
Source: linux-meta
Version: 2.6.20.16.28.1
Depends: linux-image-lowlatency (= 2.6.20.16.28.1), linux-restricted-modules-lowlatency (= 2.6.20.16.28.1)
Filename: pool/multiverse/l/linux-meta/linux-lowlatency_2.6.20.16.28.1_i386.deb
Size: 24544
MD5sum: 9b0f5e91c676c132ef35843f20ea3ce7
SHA1: 90eae98f675c811f1d803871140bc3b5d6a57753
SHA256: fb95f56d27dc6e541a8a825b5ce1d0b6b7b50dca8be4f40e73c72fb5a6159f0a
Description: Complete low latency Linux kernel
This package will always depend on the latest complete low latency Linux kernel
available.
Bugs: mailto:ubuntu-users@lists.ubuntu.com
Origin: Ubuntu

代码:
$ uname -a
Linux ubuntu 2.6.20-16-lowlatency #2 SMP PREEMPT Thu Jun 7 20:23:03 UTC 2007 i686 GNU/Linux