withwu 2012-01-12
分析瓶颈
要优化系统,先要找到性能瓶颈。通过分析系统配置能够获取这些信息。这里给出几条分析系统性能的简单方法:
运行大型软件(比如openoffice、firefox)时,如果系统变卡,很可能是内存不足。以下命令用来查询内存使用信息(-/+buffers一栏):
$free-m
如果开机时间很长,或者第一次加载某个程序十分缓慢,则很可能是硬盘太慢了。以下命令用来测试硬盘速度:
$hdparm-t/dev/硬盘设备
该命令仅测试读取速度,并不能准确测试硬盘。一般来讲,测试结果在40MB/s以上是比较合理的。
如果内存充足,系统还是很迟钝,那么看看是不是CPU的问题。以下命令可以监视CPU使用:
$top
如果看电影、玩游戏、使用图形软件时比较卡,应该是显卡的问题。首先,请使用以下命令,检查是否开启了直接渲染:
$glxinfo|grepdirect
首选方案
最简单有效的提升系统性能的方法,就是使用轻量级软件。
不安装桌面环境,仅仅使用窗口管理器,例如:dwm、Openbox、JWM。
或者选择轻量级桌面环境,例如:LXDE、Xfce。
安装轻量级软件。参见论坛年度”轻快软件奖“
在/etc/rc.conf禁用不需要的系统服务。
折衷方案
凡是有两面,轻量级软件做到了”轻“,却往往牺牲”用“。优化可能带来负面影响,是否使用,取决于你。
系统测试
使用系统测试工具,可以帮助用户更好地分析系统瓶颈。
存储设备
选择文件系统
不同文件系统各有利弊,选择合适的文件系统令用户收益良多。新手指南相关章节提供了简单指导。此外,Category:Filesystems(简体中文)里也有一些与此相关的信息。
概览
XFS:适宜存取大型文件,小型文件性能一般。适宜作为/home。
Reiserfs:存取小型文件性能好。适宜作为/var。
Ext3:性能一般,稳定可靠。
Ext4:整体性能极佳。使用sqlite等数据库时,有性能缺陷。
JFS:整体性能好,CPU使用率低。
Btrfs:整体性能极佳,优于ext4,拥有许多新特性。但还处于开发阶段,有数据丢失风险。
挂载参数
使用适当的挂载参数也能提高文件系统性能。使用参数的挂载命令如下:
$mount-o选项1,选项2,.../dev/分区/文件夹/路径
修改/etc/fstab,开机时自动使用参数挂载分区:
/dev/分区/文件夹/路径分区类型选项1,选项2,...00
noatime,nodiratime两个优化选项适用于大多数文件系统,开启后禁止记录最近访问时间。前一选项其实已经包含后者(后者近包含文件夹)。极少的情况下,比如使用mutt时,可能出现问题。
Ext3
参见:Ext3FilesystemTips。
Ext4
参见:Ext4#Improvingperformance。
JFS
参见:JFSFilesystem#Optimizations.
XFS
使用下列参数创建XFS文件系统,能获得更好的性能:
$mkfs.xfs-linternal,lazy-count=1,size=128m-dagcount=2/dev/分区
此外,设置logbufs=8挂载选项也能提升XFS性能:
#/etc/fstab
LABEL=XFSHOME/homexfsnoatime,logbufs=801
Reiserfs
使用挂载参数data=writeback可以提高性能,但断电时有数据损坏风险。notail参数会额外占用5%左右的磁盘空间,但也有益于改善磁盘性能。把日志和数据放在不同的分区可以减少磁盘负载,这需要使用如下命令创建文件系统:
$mkreiserfs–j/dev/分区1/dev/分区2
其中,分区1存放日志,分区2存放数据。详细信息参见此文。
BTRFS
新型文件系统Btrfs拥有在线碎片整理、无损伸缩分区、SSD优化等诸多特性,拥有极佳的性能。但它尚处于开发阶段,不建议普通用户使用。更多信息参见:Btrfs主页。
提供btrfs支持的mkinitcpio.conf
如果只是把brtfs作为非root分区,那么只需在挂载时加载模块即可。但要想把brtfs分区作为root,就需要把模块打包在内核中。brtfs模块还依赖于libcrc32c模块。修改/etc/mkinitcpio.conf,加入brtfs模块及其依赖:
MODULES="crc32clibcrc32czlib_deflatebtrfs"
如果懒得修改,有一个专门的AUR软件包:mkinitcpio-btrfs。
压缩/usr
磁盘IO通常比内存操作、CPU操作要慢很多,所以有些时候牺牲CPU和内存资源减少磁盘IO是值得的。通过压缩文件系统,可以减少磁盘IO(但使用更多CPU资源)。btrfs、reiserfs4等文件系统支持直接压缩,但压缩率受文件系统4k块大小限制,往往不是很高。更好的方式是使用squashfs压缩文件系统,支持64k甚至128k块大小。Gentoo论坛帖子提供了相关信息。
下面讲解如何使用squashfs压缩/usr分区。通过压缩/usr,可以节约三分之二的磁盘空间,并加快程序加载。囿于squashfs文件创建的是只读的文件系统镜像,而/usr在安装、升级软件时需要重写文件,我们还需要使用aufs提供写入支持。aufs用于合并只读文件系统和可写文件系统,从而使只读文件系统变得可读写。内核已经提供squashfs支持,extra软件仓库提供了aufs2软件包。
安装aufs模块和创建squashfs的工具:
#pacman-Saufs2squashfs-tools
然后创建用于挂载squashfs的目录(ro)和可写的记录更改的目录(rw):
#mkdir-p/squashed/usr/{ro,rw}
现在做一次系统升级,把需要的软件尽量都安装好(减少未来对/usr的写入)。如果使用prelink,还需要重新prelink一下。现在使用下面的命令创建squashfs:
#mksquashfs/usr/squashed/usr/usr.sfs-b65536
还有一些其他参数,可以获得更高的压缩比。参见:here。然后修改/etc/fstab,设置开机挂载:
/squashed/usr/usr.sfs/squashed/usr/rosquashfsloop,ro00
usr/usraufsudba=reval,br:/squashed/usr/rw:/squashed/usr/ro00
接下来重启动即可。
这里提供了自动化bash脚本,包含配置自动重新压缩(使用cron计划任务)。
SSD优化
SSD#Tips_for_Maximizing_SSD_Performance
CPU
超频是唯一提升CPU速度的方法。但它存在一定危险性,不建议盲目使用。通常在BIOS中设置超频(有些CPU可能禁止超频),本文不再叙述。
从另一方面看,通过优化CPU资源分配,也可以“提升”CPU性能。
用户可以使用优化的Linux内核,它们针对特定用途做了优化。ConKolivas的内核补丁集针对桌面应用做了优化;用BrainFuckScheduler(BFS)代替默认的CompletelyFairScheduler(CFS),可以优化系统资源调度。
AUR中提供了打补丁内核的PKGBUILD,可以很方便的编译安装。比较著名的有:打了CK补丁包和BFS补丁的kernel26-ck,打了BFS补丁的kernel26-bfs,打了pf补丁集的kernel26-pf。
Note:BFS/CK适用于桌面机、笔记本,不适用于服务器。少于16个CPU时,这些补丁能起到比较好的效果。此外,ConKolivas建议把HZ(时钟中断周期)设置为1000。参见:BFSFAQ、ckpatches。
Verynice
Verynice(软件包:verynice)服务通过调整进程nice(优先级)动态分配CPU资源。/etc/verynice.conf是配置文件,Verynice会分给其中goodexe(比如X、多媒体软件)更多的CPU资源,badexe反之。
Ulatencyd
Ulatencyd(软件包:ulatencyd)服务同样通过动态分配CPU资源缓解系统负载。但它使用更先进的cgroup功能(需要内核支持)。该功能把进程分组,并对不同的组使用不同的系统资源分配策略。
网络
参见:GeneralRecommendations(简体中文)#网络。
图形
xorg.conf
xorg.conf是Xorg的配置文件,对图形界面性能至关重要。不同显卡的设置,参见:Nvidia、ATI(简体中文)、Intel(简体中文)。谨慎设置,错误设置可能导致X崩溃。
Driconf
Driconf是用于开源驱动的直接渲染设置工具。开启HyperZ功能可以大幅提高性能。
显卡超频
显卡超频比CPU超频更简单一些,有专门的软件可以设置超频。ATI显卡使用rovclock,Nvidia用户使用nvclock,Intel用户使用gmabooster。
可以在~/.xinitrc添加超频命令,使X启动时自动超频。但不建议这么做,因为超频总是有风险的。
内存和虚拟内存
Swappiness
swappiness数值决定内核使用交换空间和物理内存大小的比率。如果设置成较小的值,CPU会尽量完全使用内存,从而加速系统性能(物理内存比虚拟内存快得多)。该值在/etc/sysctl.conf中设定(如果没有相似内容,请自行添加):
vm.swappiness=20
vm.vfs_cache_pressure=50
此文介绍了这种优化的原理。
Compcache
Compcache(软件包:compcache),也就是ramzswap内核模块,在内存中建立压缩的交换空间文件系统。通俗来讲,就是设置一部分内存可以压缩数据,从而容纳更多数据。这种优化对内存紧张的用户很有帮助。
使用Compcache后,仍然可以(且推荐)使用硬盘交换空间作为补充。不要在/etc/fstab设置备用交换空间,Compcache有专门的配置文件。
该方法有利于减少由于交换空间造成的固态硬盘读写。
/tmp使用内存空间
如果内存很充足,使用内存文件系统作为/tmp储存临时文件能小幅改善系统性能(同样,能减少磁盘读写)。犯法是在/etc/fstab中添加:
tmpfs/tmptmpfsdefaults,noatime,nodev,nosuid,mode=177700
使用显存
这听起来很奇特,如果显存过剩,还可以把显存作为交换空间。参见:Swaponvideoram。
预读
通过预读程序、库到内存中,能有效加快程序加载速度。预读通常用于常用的程序,如浏览器。
Go-preload
Go-preload是来自gentoo的一个预读服务。安装后,通过下列命令采集预读信息:
#gopreload-prepareprogram
运行需要预读的程序,收集结束后按回车键。
然后会生成一个预读列表:/usr/share/gopreload/enabled。在/etc/rc.conf设置开机启动gopreload,Go-preload就会在每次开机时预读列表中的程序。要禁止预读某个程序,只需从/usr/share/gopreload/enabled删除项目,或者移入/usr/share/gopreload/disabled。
Preload
比起Go-preload,Preload更自动化(尽管有违KISS):只需要在/etc/rc.conf添加服务就完事了。
Readahead
Readahead提供文件预读,从而加速程序加载。
系统启动
参见:加速系统启动。
待机
想要加快系统启动,最好的方法就是不要关电脑,而选择待机。当然,为了可持续发展(至少是电费),不用电脑时还是关了吧。
内核启动参数
使用fastboot参数可以节约一两秒开机时间。如果开机时总是显示“Waiting8sfordeviceXXX”之类的信息,可以使用rootdelay=1参数减少等待时间。通过编辑/boot/grub/grub.cfg(Grub)、/boot/grub/menu.lst(Grub)或/etc/lilo.conf(Lilo)应用参数。
自己编译内核
自己编译内核,删除不需要的模块,可以减少引导时间和内存占用。但通常这是个耗时、枯燥甚至令人厌烦的事情,你可能面临各种错误——甚至最终节约的开机时间还不如你浪费的时间多。但通过自己编译内核,可以学习到不少知识。参见:here。
针对特定程序的优化技巧
Firefox
Firefox(简体中文)一文提供了不少技巧。常用的有:禁用pango,清理sqlite数据库,使用firefox-pgo。另见:Speed-upFirefoxusingtmpfs、关闭反钓鱼功能。
Gcc/Makepkg
参见:Ccache。
LibreOffice
参见:LibreOffice#SpeedupLibreOffice。
Pacman
参见:ImprovePacmanPerformance。
SSH
参见:SpeedupSSH。