译注:本文译自linuxforums.org上的一篇文章《Linux Performance
Tuning》(原文作者Fernando
Apesteguia发表于2006年)翻译此文仅为英语与技术学习。转载请注明原文出处与作者。如有翻译不当欢迎指正交流。(Garriot
Zhang译注)。
Fernando
Apesteguia的结论是:“当一个发行版打包发送到客户手中的时候,它是为了完全兼容市场中大部分计算机而设计的。这是一个相当混杂的硬件集合(硬盘,显卡,网卡,等等)。所以Red
Hat, Suse,Mandriva和其他的一些发行版厂商选择了一些保守的设置来确保安装成功。”
为什么要系统调优?
这可能是第一件你想知道的事。当一个发行版打包发送到客户手中的时候,它是为了完全兼容市场中大部分计算机而设计的。这是一个相当混杂的硬件集合(硬盘,显卡,网卡,等等)。所以Red
Hat, Suse,Mandriva和其他的一些发行版厂商选择了一些保守的设置来确保安装成功。
简单地说:你的发行版运行的很好,但是它可以运行地更好!
比如,你可能有一个具体一些特殊特性的高级硬盘,而这些特性在标准配置的情况下可能就没被启用。
如何知道它运行的不好?
一旦你确定要优化你的系统,需要花一点时间来找出来哪些地方可以提升。你可以使用如下工具来完成这个工作:
ps
这个工具能让以看到你的系统里有什么正在运行的进程。你能看到从你自己的到整个系统范围内的所有进程。这个命令显示进程的PID,相关的终端,累计时间和进程名称。你能用ps来监视什么进程正在运行和哪些进程正在大量占用CPU。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
COMMAND
fernape 2474 0.0 0.1 53944 1648 tty1 Ss 13:02 0:00 -bash
fernape 2577 0.0 0.1 52732 1180 tty1 S+ 13:02 0:00 /bin/sh
/usr/X11R
fernape 2609 0.0 0.0 5476 720 tty1 S+ 13:02 0:00 xinit
/etc/X11/xi
fernape 2801 0.0 1.1 134360 11768 tty1 S 13:03 0:00
/usr/bin/gnome-se
fernape 2854 0.0 0.0 8796 812 tty1 S 13:03 0:00
/usr/bin/dbus-lau
fernape 2899 0.1 0.9 73576 10112 tty1 S 13:03 0:01
/usr/libexec/gcon
fernape 2962 0.0 0.0 5244 972 tty1 S 13:03 0:00
/usr/bin/gnome-ke
fernape 3180 0.0 0.1 53952 1652 pts/0 Ss 13:07 0:00 bash
fernape 3249 0.0 0.1 53952 1628 pts/1 Ss 13:09 0:00 bash
fernape 3535 0.0 0.0 5440 828 pts/0 R+ 13:18 0:00 ps u
top
如果你喜欢ps的话,你也会喜欢top。Top是一个持续跟踪进程的非常有效的工具。在命令行里输入top可以启动它。通过top,你能得到一个根据CPU或者内存占用排序的进程列表。要知道top更多的信息,请读一下这个文章,更有效的使用top命令。
vmstat
vmstat提供虚拟内存、进程、CPU以及更多的信息。它在监测系统全局状态的时候非常有用。这个工具提供的是从其他著名的UNIX工具获得的信息的集合。
[fernape@Hammer ~]$ vmstat
procs ———–memory———- —swap– —–io—- –system–
—-cpu—-
r b swpd free buff cache si so bi bo in cs us sy
id wa
0 0 0 598412 17444 222484 0 0 258 39 1040 211 6 2
86 7
time
这是一个很小但很有用的记录执行时间的工具。它把一个命令当作参数,然后执行它并且给出一个简要的进程时间花费的统计。它能帮你找出来这个命令是不是花费了比预期更长的时间。当然,当你处理你自己开发的程序的时候它会特别有用。你可以修改源代码再编译,然后比较结果。
[fernape@Hammer ~]$ time ls -R >/dev/null
real 0m0.117s
user 0m0.057s
sys 0m0.046s
x11perf
x11perf在X
server上执行基准检查。在命令行输入x11perf调用这个命令。它有很多参数,用-all参数执行它可以获得很多信息(但是可能会执行很长时间)。
很明显,如果我们不能把它的结果与别的进行比较,它给的信息就不会太有用。于是还有一个x11perfcomp的工具。X11perfcomp是用于比较x11perf两份结果的shell脚本。现在,分析X
server性能的方法就很明显了:先对当前的系统性能做一个快照,然后修改配置文件和系统设置(记住,x视窗系统使用共享内存,其它的进程间通信机制会影响它的性能,),再运行x11perf,最后,用x11perfcomp比较两份结果。
下面是一个节选的x11perf的输出。它是一个高度可配置的工具,你能指定性能测试的内容,也能执行全部可用的测试。
[fernape@Hammer ~]$ x11perf -all
x11perf – X11 performance program, version
1.5
The X.Org Foundation server version 60801000 on :0.0
from Hammer
Sun Apr 2 13:21:41 2006
Sync time adjustment is 0.0895 msecs.
40000000 reps @ 0.0001 msec (6890000.0/sec):
Dot
40000000 reps @ 0.0001 msec (7910000.0/sec): Dot
40000000 reps @ 0.0001 msec (7890000.0/sec): Dot
40000000 reps @ 0.0001 msec (7790000.0/sec): Dot
40000000 reps @ 0.0001 msec (8290000.0/sec): Dot
200000000 trep @ 0.0001 msec (7720000.0/sec): Dot
50000000 reps @ 0.0001 msec (10100000.0/sec): 1×1
rectangle
结果可以通过重定向输出到文件来保存下来。我执行了x11perf一次并且把结果保存在test1文件里,然后我修改了一下xorg.conf的一些设置,又执行了一次测试,并把结果保存在test2文件里。然后我比较它们:
[fernape@Hammer ~]$ x11perfcomp test1 test2
1: test1
2: test2
1 2 Operation
——– ——– ———
8310000.0 8140000.0 Dot
结果显示我的修改并不是太合适。
当x11perf运行的时候,下图一样的窗口会显示在屏幕上。为了避免测试结果被改动,不要动这个窗口也不要把鼠标放在它上面。这个窗口会在测试结束的时候消失。
hdparm
硬盘是机器里最重要的设备之一。无论什么时候加载进程,内存区在硬盘和内存之间被反复交换,硬盘都会被用到,而且,由于几乎UNIX系列操作系统的所有的东西都会用到文件,所以正确的设置硬盘非常重要。Hdparm能帮助你测试和设置硬盘。
现在我只是展示一下如何执行硬盘测试。如果你没有耐心而且想知道有哪些能用的参数,请直接读下一节:优化你的系统。
执行测试,键入(你可以把/dev/had换成你的硬盘):
[root@Hammer ~]# hdparm -tT /dev/hda
/dev/hda:
Timing cached reads: 1656 MB in 2.00 seconds =
828.13 MB/sec
Timing buffered disk reads: 102 MB in 3.03 seconds = 33.71
MB/sec
因为hdparm是一个受限制的工具,我用root的帐号执行的它。我们能看到缓存读取和缓冲磁盘读取的传输速率。如果你想看你现在的磁盘设置,试一下:
[root@Hammer ~]# hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
IO_support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 65535/16/63, sectors = 80026361856, start = 0
我建议你至少运行5次测试来获取一个有效值。而且,尽可能的不要使用其余的系统资源也很重要,这样这个测试就不会受别的阻塞的磁盘请求影响。
调优你的系统
接下来,我们会用一些工具来调优我们的系统。我们也会看到一些有用的节省内存的技巧,因为对于一些内存不太多的机器,这是极其重要的。
禁用系统服务
典型安装的情况下,为了保证最大化的用户兼容性和可用性,很多服务被启动。虽然对于大多数人来讲这是一个不错的做法,但是有时候,有些服务根本就不会被用到。因此,禁用那些没用的服务是个不错的主意。很多程序可以做这个。在基于Red
Hat的系统上,你可以在命令行模式使用setup或者使用图形会话中使用serviceconf(如下图所示)。
有一些可以被禁用的服务:
Network Manager:
选择最好的有效链接(你一直都保持连接并且经常移动吗?)
Bluetooth:如果你不太用蓝牙设备,那就禁用它
Cron:
如果你没有计划任务的话,就禁用它(也许你可以自己运行这些任务,而不是定时执行)
Cups:打印机后台程序(我在我的笔记本上禁用了他因为我不在上面打印东西)
Iptables:linux防火墙(这个需要冒点风险)
Irda:和蓝牙一样的红外线通信服务
Irqbalance:如果你使用的不是SMP系统的话,那就禁用它
Nfs:如果你不通过NFS共享文件的话,可以禁用它
杂项服务(ssh,sftpd。。。):很多服务都会被默认启动。你真的想让你的系统变成一个服务器吗?
Vnc:虚拟网络控制台。如果你不需要远程图形化访问,禁用它
在Red Hat系统里,你可以这样chkconfig命令(针对非图形化会话)添加和移除系统服务:
chkconfig service on/off
其它的系统有它们自己的机制管理服务。读一下你的系统手册。
禁止X在启动时运行
是不是禁用X服务,要看你是哪种用户。我是一个命令行的狂热者,我就禁止了X在启动的时候运行。当我启动我的系统的时候,我登录到命令行开始我的工作并且结束掉X。如果你不介意使用bash(或者shell)的话,这能节省很多内存。如果你想禁用X,找到/etc/inittab文件,修改这一行:
id:5:initdefault:
改成:
id:3:initdefault:
下次你在启动系统的时候,你会进入纯命令行模式。这不仅是为了节省内存,一些简单的操作还会更快。如果如果我想向我的电影列表里加入一行,在命令行模式下,我就不用那么多时间去等待图形界面的GNOME,Metacity和X
server加载。
移除控制台
Linux一个很酷的特性就是可以允许多个终端。这些终端可以通过Ctrl+Fn键访问,也允许你多次登录一个系统。但诚实一点讲,我用了Linux很多年,但从没有同时用过三、四个以上的终端。所以,你也可以禁用它们来节省一些内存。如果你使用图形化的桌面,你甚至还可以使用一个或多个gnome-terminal或者konsole。所以你也可以只留下一个额外的终端,而释放其它的。
为了实现这个,还得修改/etc/inittab文件,只需要注释掉设置终端的那些行。
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
hdparm
现在,我们再来研究一下hdparm。我们已经知道它能显示磁盘信息,其实它还能设置磁盘属性。你可以试一下一些重要选项:
-d:启用/禁用DMA传输
-X:优化DMA传输
-A:磁盘预读
-c:启用IDE32位支持
-C:对笔记本来说非常重要(电源管理特性)
比如,我要禁用DMA传输、预读和32位支持并且执行一个测试
[root@Hammer ~]# hdparm -A0 -d0 /dev/hda
/dev/hda:
setting using_dma to 0 (off)
setting
drive read-lookahead to 0 (off)
using_dma =
0 (off)
[root@Hammer ~]# hdparm -tT /dev/hda
/dev/hda:
Timing
cached reads: 1580 MB in 2.00 seconds = 789.33 MB/sec
Timing
buffered disk reads: 8 MB in 3.20 seconds = 2.50 MB/sec
请注意,磁盘缓冲读取明显降低了。性能相差15倍以上(与上面的测试结果相比较)。
sysctl
这可能是最好的linux系统调优工具。它能在linux内核运行的时候设置大量的系统参数。它通过从procfs文件里读写系统变量来做这件事。
当输入下面的命令的时候,会显示完整的有效系统变量列表:
[root@Hammer ~]# sysctl -a
解释这个长长列表里的每一个变量会浪费大量时间。如果你对它们感兴趣的话,可以自己去试一下(大多数变量都是自解释的)。
我的建议:看一下网络选项。
安装显卡驱动
如果你使用的常用配置和安装方式的话,我确信你没有充分利用到这个设备的所有能力。最大的显卡厂商,就像Nvidia,ATI或者Intel,提供很多它们针对Linux的专用驱动。因为许可证的问题,它们并没有被包括在大多数发行版之内。让我们再来用一下x11perf。我用默认安装的标准VGA驱动运行了一次deepcopyplane500测试,并把结果保存为test1文件。接着我把我的ATI
Radeon Mobility 9700显卡的驱动换成了ATI的专用驱动,又运行了这个测试并把结果保存成test2文件。
x11perfcomp的比较结果显示了这两个驱动的巨大差异:
[fernape@Hammer ~]$ x11perfcomp test1 test2
1: test1
2: test2
1 2
Operation
——– ——–
———
7.7 54.2
Copy 500×500 n-bit deep plane
ATI的驱动获得了将近8倍的性能提升。
正如你所见,为你的显卡换上一个适当优化过的驱动绝对是个好主意。
更进一步,你甚至能提高显卡驱动的性能。Nvidia和ATI,允许你安装一个预编译的包或者生成一个新的。后者允许你针对你的机器编译一个驱动,而不必使用通用的那个。
如果你选择重新编译,你需要你的内核源码,但幸运的是安装程序做的非常好,能让你生成一个包却不需要任何额外工作。
主频调整的调节器
如果你在使用一个可变主频处理器(比如Centrino或者AMD64),你可以正确的设置你的处理器来节省电池电量。Cpufreq可以帮助你做这个。它能管理Centrino和AMD64处理器,并且允许你通过/sys下的一个接口来控制频率。通过cpufreq你能调整频率到最小(最大省电),最大(最大性能),或者让调节器来选择什么时候提高或者降低频率。
要安装这个后台程序,你需要libsysfs和频率调整的内核支持。大多数现在的发行版都已经预装了cpufreq。现在,我们来配置它一下。我的情况是,我的AMD
CPU并没有正确配置,所以它一直运行在100%的程度上。
上面提到的可配置的那些东西被显示出来:
[fernape@Hammer ~]$ ls /sys/devices/system/cpu/cpu0/cpufreq/
cpuinfo_max_freq scaling_available_governors
scaling_governor cpuinfo_min_freq
scaling_cur_freq scaling_max_freq scaling_available_frequencies
scaling_driver scaling_min_freq
更多信息请看一下文档。你可以安装cpufreq的applet来轻松配置你的调节器。
想做更多:编译你的内核(最简单的方式)
Linux的内核是操作系统的核心。它是你用你的发行版工作的必需品。就算你只是执行一个“hello
world”程序,也是内核在加载这个程序,请求内存,并执行系统调用来完成你能看到的工作。
因此,安装和正确配置(还有优化)你的linux内核是非常重要的。编译内核是一个很长很复杂的话题,这里不会深入讨论。然而,如果你的发行版提供针对大多数通用架构的默认配置文件,那你就非常幸运。基于Red
Hat的系统就是这么做的。让我们看一下如何简单的编译我们自己的内核:
首先,我假设你已经在你的机器上正确安装了Linux内核的源代码。
现在,我们转到源代码目录。一般来说路径好像:
/usr/src/linux-2.6.9/
现在,我们开始配置我们的新内核。
make gconfig
我们可以从写配置开始配置我们的内核,但那不是我们的目标。我们可能会忘掉一个重要要素,然后构建出一个可能不能用的内核。所以,从“configs”子目录加载一个配置文件。
这些配置文件会确保你能得到和默认内核一样的但针对你的特殊处理器优化过的结果。你可以放心的加载这个文件,而不用担心任何东西。下图显示配置文件加载。
还有,我确定我的处理器是一个Athlon64,所以我在选项里设置了它,并且取消了Generic-x86-64的选项。
然后保存你的设置,继续下一步:
make;
make modules;
make modules_install;
如果需要,创建你自己的initrd文件。
如果你成功编译并安装了你的内核,你就会不费吹灰之力感受到你系统架构的优势。
结论
Linux厂商做了很大努力还构建优化版本的Linux系统。然而,成功安装也很重要。所以,这些厂商会评估这两个因素。因此,系统的某些部分并没有在最大性能工作。我们的任务就是找到这些点,然后调整它们到更高性能的状态。
此外,因为这些厂商想让Linux成为被广泛应用的操作系统,有些时候他们启动了很多不常用的服务。作为一个高级用户,禁用这些服务和特性来节省内存和其他系统资源是很重要的。
最佳策略:如果你不用这个特性,那就可以安全地禁用它。你就可以节省很多系统资源。
Linux系统是完全可配置的。让我们利用好这个优势。