最大化桌面速度
Linux 最好的优点之一是,与其它操作系统相比,您可以在同一台计算机上获得更高的性能。然而,总有改进的空间,您应该可以通过应用一些特定的增强功能,从您的机器中获得更多的速度。
但是,不要期望奇迹发生。任何程度的调整都不能将奔腾 II 变成四核怪兽(还记得关于丝绸钱包和母猪耳朵的老话吗?),但是您可以期望获得响应更快的机器,并且“处理”得更好。尽管有些变化是内部的且难以察觉的,但您会发现您的系统感觉更活跃,您的点击会更快地产生响应,您可以在应用程序之间更快地切换,并且程序运行的时间更少。
让我们务实一点。如果您获得了更好的 CPU,那么本文中的任何内容都可能无法与您的结果相提并论,更好的显卡或更快的磁盘也是如此。但是,您已经预料到了,不是吗?(进行此类硬件升级不仅对 Linux 有利,而且对所有其他操作系统也有利。)但是,进行此类更改实际上相当于获得一台全新的机器,因此您实际上并不是在增强旧机器的性能,而是在重新开始。
话虽如此,本文讨论了配置更改,目的是使一切(好吧,几乎一切)保持原样,但使其性能更好。当然,这些更改并非完全相同;有些更困难(且风险更大),有些需要重新启动或其他程序,有些甚至需要深入命令行并编辑配置文件。但是,不要放弃。结果是值得的。
最后,我在本文的示例中使用了 OpenSUSE(版本 10.3)和 KDE。如果您使用的是其他发行版或桌面环境,您会发现文件位置或程序上存在细微差异。目前,由于大多数发行版都提供完全相同的软件包和驱动程序,因此它们之间最大的剩余差异之一恰恰在于配置工具,因此您可能需要自行搜索。无论如何,可以肯定的是,您会找到一种管理此处描述的任何内容的方法,只是方式不同而已。
类似于旧的房地产格言“位置,位置,位置”,获得更多的内存,内存,内存将提供巨大的改进。所有进程都需要内存,并且每当内核耗尽 RAM 时,它就会开始交换到磁盘,但是由于磁盘比 RAM 慢几个数量级,因此您的性能会受到影响。如果您愿意花一些钱,请不要犹豫。出去为您的机器购买一些额外的 RAM 条。一旦您将它们插入,您就会注意到更好的性能。获得更多 RAM 不是很昂贵,并且不需要任何配置或重新安装。
即使您不想花钱购买更多 RAM,您也可以使 Linux 以更有效的方式管理可用的 RAM。以下是一些简单的更改需要考虑
从 KDE 或 GNOME 更改为更轻量级的桌面环境。就 RAM 需求而言,GNOME 是最糟糕的(尽管它远低于 Windows Vista),而 KDE 紧随其后。尝试使用要求较低的环境,例如 Xfce 或 Enlightenment,后者在 gOS 中使用,gOS 是预装在沃尔玛销售的 Everex Green gPC 中的操作系统 [有关 gOS 的更多信息,请参见 Doc Searls 对 David Liu 的采访,第 58 页]。其他可能性包括 IceWM、Blackbox、Fluxbox、Fvwm、JWM 或(现在似乎已不再使用的)Window Maker。请注意,这些窗口管理器与拥有完整的桌面环境并不完全等同,因此您必须进行一些调整。许多流行的发行版,例如 DSL(Damn Small Linux)或 Puppy Linux 使用这些轻量级窗口管理器,并且许多都可以作为 Red Hat 或 SUSE 的可选软件包使用。
删除您从不使用的字体。我曾经是一个字体迷,并在我的机器上加载了数百种字体(我没有夸张),以防万一我将来可能会使用它们。每种字体都需要内存,您拥有的字体越少,您将释放的 RAM 就越多。而且,某些程序将运行得更快,因为它们将加载更短的字体列表。
减少虚拟桌面的数量。Windows 用户仅使用一个桌面,但是您真的需要在 Linux 中使用 16 个虚拟桌面吗?对此进行一些实验。我不会减少到一个桌面,但是在大多数情况下,拥有两到三个虚拟桌面就足够了。
Linux(与大多数其他现代操作系统(如果不是全部)一样)使用一种称为虚拟内存的技术,使程序产生它们拥有大量可用内存的印象,甚至比机器的实际 RAM 大小还要多。此技术意味着使用磁盘内存(/swap 分区)来模拟实际 RAM,来回交换片段。当然,每当此交换过程运行时,您都会遇到更长的响应时间和更慢的性能。
内核尝试通过提前进行一些交换来防止未来的交换,您可以通过更改参数来更改其执行程度,参数范围从 0(最小交换,仅在需要时执行)到 100(尝试释放尽可能多的 RAM)。
有两种方法可以更改此设置。标准值设置为 60。要降低它,以 root 身份执行类似的操作
sysctl -w vm.swappiness=25
或
echo 25 > /proc/sys/vm/swappiness
请注意,此更改仅在您下次重新启动机器之前有效。如果您想使更改永久生效,请编辑 /etc/sysctl.conf,并添加如下行
vm.swappiness=25
现在,它将在每次启动时加载。如果您想测试更改,请编辑 /etc/sysctl.conf,然后使用以下命令重新加载它/sbin/sysctl -p.
较低的值(低至 5 或 10)还是较高的值(高达 100)更好?就我个人而言,我使用 5,并且我喜欢我的机器(台式机和笔记本电脑)的工作方式。如果您调高它,内核将使用更多的 CPU 时间来提前释放 RAM;如果您调低它,CPU 将更空闲,但是 I/O 将会更多。
对于 CPU 密集型程序,如果您有快速磁盘,我建议使用较低的值,就像我自己所做的那样。这将产生改进,例如在应用程序之间切换时,因为它们更有可能驻留在物理 RAM 中而不是交换分区上。即使您将 swappiness 设置为零,如果需要,内核也会进行交换,因此再次强调,如果可能,您将受益于获得更多 RAM。
但是,Linux 内核开发人员 Andrew Morton 建议使用 100,而作者 Mladen Gogale 观察到他没有发现任何差异,因此您可能需要尝试不同的值并查看您喜欢哪个值(有关此主题的文章链接,请参见“资源”)。
在 Linux 下,大多数应用程序都采用特殊的“可执行和可链接格式”(ELF),这使它们更小。程序文件不是包含所有需要的库,而是引用了它们,这些引用在代码加载以执行时被解析(或链接)。您可能会在这里认识到经典的“时间与空间”折衷方案:文件大小更小,但加载时间更长。如果您的程序只需要几个库,则链接过程很快,但是对于使用多个库的较大程序,链接过程会明显变长。
如果您愿意使用更多的磁盘空间(并花费一些时间准备所有文件),则可以使用 prelink 命令预先执行链接阶段,并将所需的库存储在程序文件本身中,以便在加载后即可立即执行。(实际上,我在这里略微夸大了。当程序加载时,会检查库以验证自预链接以来它们是否已更改,但是该检查比执行链接本身要快得多。)以这种方式使用 prelink 显然需要更多的磁盘空间(因为每个预链接的库都将在每个可执行文件中复制一份),但是对于当前的大型磁盘来说,这甚至不会被注意到。
为了预链接您的程序,您需要设置一个配置文件(/etc/prelink.conf),以便 prelink 知道在哪里搜索共享库以及要处理哪些程序(如果您选择 -a 选项并预链接所有可能的内容)。此文件的格式很简单:空行无关紧要,注释以 # 字符开头,其余行应类似于以下内容
-l aDirectoryToBeProcessed -h anotherDirectoryButAllowingForSymlinks -b fileToSkip
-l 行指定应处理的目录。-h 行几乎相同,但允许使用符号链接,这些链接将被跟随,因此预链接过程最终可能会处理实际驻留在您最初指定的目录之外的其他目录中的文件。最后,-b 行显示应被预链接过程跳过的黑名单程序(也可以使用模式)。我建议保留这些行不动。如果您的预链接实验表明某些程序无法预链接(如果您尝试,您将收到错误消息),则应添加适当的 -b 行以避免将来不必要的警告。例如,清单 1 显示了我的(OpenSUSE 中已提供的)/etc/prelink.conf 文件的一些部分。
清单 1. 提供的 OpenSUSE /etc/prelink.conf 文件的一部分
# Acrobat Reader -b /usr/X11R6/lib/Acrobat5/Reader/intellinux/bin/acroread -b /usr/X11R6/lib/Acrobat7/Reader/intellinux/bin/acroread # RealPlayer -b /usr/lib/RealPlayer8/realplay [...some snipped lines...] # Files to skip -b *.la -b *.png -b *.py -b *.pl -b *.pm -b *.sh -b *.xml -b *.xslt -b *.a -b *.js # kernel modules -b /lib/modules [...more snipped lines...] -l /lib -l /lib64 -l /usr/lib -l /usr/lib64 -l /usr/X11R6/lib -l /usr/X11R6/lib64 -l /usr/kerberos/lib -l /usr/kerberos/lib64 -l /opt/kde3/lib -l /opt/kde3/lib64
如果您要预链接单个程序,只需执行prelink 程序路径和名称,并且如果程序可以成功重新链接(请记住我的评论——对于某些程序来说,这根本不可行),则原始二进制 ELF 文件将被新的、更大的、包含所有内容的版本覆盖。
您可以通过执行以下命令启动大规模预链接会话prelink -a,这将遍历 /etc/prelink.conf 中的所有 -l 和 -h 目录,并预链接它找到的所有内容。以下是一些需要注意的更多选项
通过包含 -n 选项来执行试运行。这将生成所有结果的报告,但是不会将任何更改提交到磁盘。使用此选项来查看是否存在意外问题或要排除的文件。
如果您的系统中有许多库(极有可能)并且内存不是很大,请包含 -m 选项,以便 prelink 尝试节省内存。在我自己的机器上,如果我省略此选项,prelink 将无法工作,因此我通常用来预链接所有可能内容的命令是prelink -m -a.
如果您不喜欢预链接的文件,或者如果您厌倦了每次更新库时都预链接所有内容,请使用 -u 参数来撤消更改。执行prelink -u 预链接的程序名称会将程序恢复为以前的未链接格式,而不会引起任何麻烦。当然,要彻底恢复到原始状态,请执行prelink -a -u.
所有程序的预链接版本都像普通版本一样执行,但是加载速度会更快一些,从而提供更流畅的感觉。我发现关于实际测量结果的意见不一,但是大多数参考文献都指出有真正的加速。
Ubuntu 或 Debian 中不需要预链接?
最近的 Ubuntu 和 Debian 发行版包括一种不同的机制来加速应用程序加载和一种新的链接机制,该机制在不使用预链接的情况下加速链接过程。
要启用更快的启动时间,请执行sudo apt-get install preload,从那时起,Linux 将监视您运行哪些应用程序,并将这些二进制文件和库提取到内存中。
例如,如果您每天都使用 Firefox 和 OpenOffice.org,preload 将确定这两个是常用应用程序,并将所需的库保留在 RAM 中。当然,如果您更改为 Seamonkey 和 KOffice,preload 最终将检测到您习惯的更改并执行相应的操作。
每次您创建、修改或只是访问文件时,Linux 都会尽职尽责地将当前时间戳记录在其目录结构中。特别是,后者的更新显然意味着文件访问时间的惩罚。即使您只是读取文件(而不进行任何更改),Linux 也会使用当前时间戳更新文件的 inode(有关 inode 的更多信息,请参见“资源”)。由于写入显然需要一些时间,因此取消这些更新会带来性能提升。
为了实现此增强功能,您需要更改文件系统的挂载方式。以 root 身份工作,执行cat /etc/fstab以获得以下结果
/dev/hda1 /boot ext2 acl,user_xattr 1 2 /dev/hda2 swap swap defaults 0 0 /dev/hda3 / reiserfs acl,user_xattr 1 1 /dev/hdd1 /media/disk2 reiserfs defaults 1 2 /dev/hdc /media/cdrom udf,iso9660 ro,user,noauto 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 usbfs /proc/bus/usb usbfs noauto 0 0 devpts /dev/pts devpts mode=0620,gid=5 0 0
考虑到此输出,优化的最佳候选对象是 / 和 /dev/hdd1;/boot 仅在启动时使用,/swap 超出了您的范围,而其他则不是硬盘。
进行更改很简单。使用您喜欢的文本编辑器,添加,noatime到第四列中的选项。完成后,发出mount -a命令以重新挂载所有分区,然后发出普通的mount以检查是否已完成更改(清单 2)。
清单 2. 使用以下命令检查新参数mount
$ mount -a $ mount /dev/hda3 on / type reiserfs (rw,noatime,acl,user_xattr) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) debugfs on /sys/kernel/debug type debugfs (rw) udev on /dev type tmpfs (rw) devpts on /dev/pts type devpts (rw,mode=0620,gid=5) /dev/hda1 on /boot type ext2 (rw,acl,user_xattr) /dev/hdd1 on /media/disk2 type reiserfs (rw,noatime)
请注意 /dev/hda3 和 /dev/hdd1 行中的 noatime 参数。这些意味着您做的一切都正确,并且不再记录访问时间。
顺便说一句,如果您在 Web 上对此进行研究,您可能会找到对另一个选项 nodiratime 的引用,该选项与目录有关。不要费心设置此选项,因为 noatime 意味着 nodiratime。
我运行了一些测试(创建大量文件,并将它们复制到 /dev/null),并计时了有和没有 noatime 选项的结果,发现了一些小的性能提升——积少成多。
现在,如果您已经走到这一步,那么您已经准备好迎接最重要的一个:增强您的内核。
数据完整性与速度?
在 Google 上搜索文件系统性能增强功能时,您可能会遇到关于 ext3 和 ReiserFS 的建议,其中涉及另一个挂载选项data=writeback。此选项通过部分禁用其日志记录,有效地取消了这两个文件系统的优势。(日志记录是确保您的数据不会丢失的原因,即使在系统崩溃后也是如此。)如果您包含data=writeback,您将以系统崩溃后显示旧数据的代价来换取速度的提高。我不喜欢这种风险,因此我不使用该选项。
到目前为止,我们所做的所有调整只是工作的一部分,如果您重新编译内核并针对您的特定硬件和需求进行最佳调整,您甚至可以获得更高的速度。请注意,即使编译完整的内核不像以前那样具有挑战性(主要是您只需做出一些选择并键入一些命令),但仍然有搞砸事情的余地。除非您感到舒适,否则不要尝试这样做。
大多数发行版通常提供使用最通用选项编译的通用内核,该内核应适用于所有人。当然,这不一定适合您的特定情况。如果您的机器具有 Athlon XP CPU(例如我的笔记本电脑),或者多个处理器,或者特定的显卡,则通用内核将无法利用它们。该怎么办?您可以调整一些内核选项并重新编译它以获得最佳性能。在这里,我特别关注增强速度和响应能力的选项。
注意
本文中使用的特定命令适用于 OpenSUSE 发行版,但各个发行版之间有所不同。在尝试重新编译内核之前,请查看您的文档以获取您需要的特定命令。
编译内核并不那么困难,但是请记住,很有可能会损坏您的机器并将其变成镇纸。(好吧,这可能有点夸张。在最坏的情况下,您只需重新安装 Linux,并且不会丢失您的数据。)就我而言,我使用了 YaST 管理工具并安装了两个内核,因此我可以在启动时选择其中一个,并且如果我损坏了一个,我可以重新启动到另一个内核,重新安装损坏的内核并继续尝试。
您需要一些特定的软件包才能执行此操作:kernel-source(实际内核的源文件)、gcc(编译器)、ncurses(用于菜单)和 bzip2(在内部用于创建启动映像)。您还需要了解一些关于您的硬件的知识。使用cat /proc/cpuinfo查看您有多少个 CPU 及其品牌,以及cat /proc/meminfo获取 RAM 信息(清单 3)。
清单 3. 在重新编译内核之前,您将需要有关 CPU 和 RAM 的信息。
$ cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 6 model : 8 model name : Mobile AMD Athlon(tm) XP 2200+ [...some lines snipped...] $ cat /proc/meminfo MemTotal: 483488 kB MemFree: 11560 kB Buffers: 19888 kB Cached: 323408 kB SwapCached: 2768 kB Active: 166432 kB Inactive: 230396 kB [...more lines snipped...]
首先进行试运行,并在不进行任何更改的情况下重新编译内核,只是为了查看一切设置是否正常。以 root 身份工作,执行清单 4 中显示的操作。
清单 4. 执行试运行以确保您拥有编译内核所需的一切。
cd /usr/src/linux make clean make make modules_install make install
make 进程将运行一段时间,尽管它们可能会产生一些警告,但不应有任何错误。如果在您重新启动后一切仍然运行正常,则意味着您可以开始进行实验;您已经完成了内核构建。(如果事情确实严重出错,请重新启动到另一个内核,重新安装损坏的内核,解决问题,然后再次尝试试运行。)
调整内核只是从(大型)菜单中选择适当的选项的问题。以 root 身份,执行以下操作
cd /usr/src/linux make clean make menuconfig
您将看到一个屏幕(图 1),其中包含数百个选项的菜单,尽管幸运的是,您只需更改其中的几个选项。
如果图形界面更符合您的风格,请将最后一个命令更改为make xconfig以获得更友好的工作方式(图 2)。
以下是一些要更改的选项
在“常规设置”下,取消选中“Cpuset 支持”。
在“处理器类型和功能”下,选中“无滴答系统”和“高分辨率定时器支持”。在“处理器系列”下选择正确的 CPU 类型,以便编译后的内核代码针对其进行优化,并取消选中“通用 x86 支持”,这仅对于通用内核是必需的。在“高内存支持”下选择您拥有的 RAM 量。选中“抢占大内核锁”,然后在“抢占模型”下,选择“可抢占内核(低延迟桌面)”。请注意,对于服务器机器,您应选择“无强制抢占”选项。在“定时器频率”下,选择“1000”(代表 1000H)。最后,如果您的机器只有一台 CPU,请取消选中“对称多处理支持”。如果您有两台或更多台 CPU,请选中该框,并在“最大 CPU 数量”下输入正确的数量。(所有这些数据都来自执行cat /proc/cpuinfo,如前所述。)
在“块层”下,取消选中所有内容,除非您的磁盘大于 2Tb。
在“内核黑客”下,取消选中“内核调试”、“收集内核定时器统计信息”、“调试可抢占内核”和“写保护内核只读数据结构”。
完成选择选项后,退出配置程序(对保存新内核配置说“是”),然后执行以下操作
make make modules_install make install
注意意外的错误消息;应该没有。您需要等待,就像您进行试运行时一样。在我的笔记本电脑上,整个过程需要 30 多分钟。如果您收到错误消息,请返回菜单尝试修复任何错误,或者重新启动到您的备份内核,重新安装损坏的内核,然后重试。如果一切正常,只需重新启动,然后试用您的新内核。
通过对您的 Linux 机器进行少量更改,您可以获得更快的响应速度和更高的速度,并且您将能够向所有人炫耀您的机器。然后,在遵循本文中的建议之后,您可以在 Internet 上自行查找,并且您将能够获得更高的速度,但是请注意,进行这些增强功能可能会让人上瘾!
资源
Eric Youngdale 的“ELF 对象文件格式剖析”:www.linuxjournal.com/article/1060
Clay J. Claiborne, Jr. 的“让 inodes 表现良好”:www.linuxjournal.com/article/4404
“维基百科:Inode”:en.wikipedia.org/wiki/Inode
“Linux:调整 swappiness”:kerneltrap.org/node/3000
维基百科:虚拟内存:en.wikipedia.org/wiki/Virtual_memory
Mladen Gogala 的“在 Kernel 2.6 上调整 Linux VM”:www.dba-oracle.com/t_tuning_linux_kernel_2_6_oracle.htm
“...特别是对于您的笔记本电脑”:beranger.org/index.php?article=1547&page=3k
gOS 功能:www.thinkgos.com/technology.html
gOS,维基百科:en.wikipedia.org/wiki/GOS_(Linux_distribution)
Xfce:www.xfce.org
Federico Kereki 是一位乌拉圭系统工程师,在大学教学、从事开发和咨询工作以及撰写文章和课程材料方面拥有 20 多年的经验。他使用 Linux 多年,并在多家不同的公司安装了 Linux。他对 Linux 机器的更好安全性和性能特别感兴趣。