# Maximizing performance (简体中文)

翻译状态： 本文是英文页面 Maximizing_Performance 的翻译，最后翻译时间：2014-01-12，点击这里可以查看翻译后英文页面的改动。

本文将介绍关于系统性能诊断的基本知识，以及优化系统性能的具体步骤。

## 基础工作

### 寻找瓶颈

性能优化的最佳方法是找到瓶颈，因为这个子系统是导致系统速度低下的主要原因。查看系统配置表可以发现瓶颈，也可以通过以下方式寻找线索：

- 运行多个大型程序（如OpenOffice.org、Firefox等）时变卡，提示瓶颈可能是内存。为进一步明确内存使用情况，可敲入以下命令，并检查“-/+ buffers/cache”那一栏信息：

    $ free -m

- 如果开机时间非常长，并且第一次加载应用程序也很长（但是启动以后运行却很流畅），这就提示硬盘可能太慢。你可以借助`hdparm`命令测量硬盘速度，请在硬盘空闲时执行：

    $ hdparm -t /dev/sdx

虽然这个命令只测定读取速度，但只要这个速度超过40MB/s就足以应付一般的系统需要。hdparm可在Official repositories中找到。

- 如果内存充裕，但是CPU使用率持续高企，那么CPU可能是系统的瓶颈。有多种方法可以监测CPU负荷，比如`top`命令：

    $ top

- 如果仅仅是游戏或视频播放时出现卡顿，那就像是显卡的问题。首先，请使用`glxinfo`检查显卡是否开启了直接渲染功能：

    $ glxinfo | grep direct

`glxinfo`在mesa-demos包中。

### 首选方案

最简单有效的改善系统性能的方法是：改用轻量级桌面和应用程序。

- 不安装完整的桌面环境，仅仅使用窗口管理器。可选的方案包括Awesome、dwm、Fluxbox、i3、JWM、Openbox、wmii和xmonad。
- 不用重量级的GNOME或KDE，改用轻量的桌面环境，如LXDE或者Xfce。
- 改用轻量级应用程序，你可以在应用程序列表中搜索命令行界面的程序，或者参考论坛票选出的“年度轻便程序”：2007、 2008、 2009、 2010、 2011以及2012。
- 禁用多余的系统服务。

### 妥协的考量

绝大多数优化都会带来副作用。比如，轻量级软件做到了“轻”，但往往牺牲了“用”（功能）。又比如，系统优化需要花费时间调试、维护，甚至可能造成系统不稳定。用户应该根据自身的需要谨慎选择。

### 跑分

为定量评估优化成果，可使用系统评分工具。

## 存储设备

### 分散存储

如果你有多个存储设备，那么把操作系统的工作负荷均匀分摊到这些设备上，将极大提升系统性能。将`/`、`/usr`、`/home`和`/var`分散到不同的硬盘，显著快于将它们集中放置在同一块硬盘。

### 交换分区/文件

把交换分区/文件放在系统盘以外，对提升速度也有所帮助，尤其是系统频繁使用交换分区/文件时。

### 组RAID

如果你有多个硬盘，组一个软RAID或许有不小惊喜。RAID 0可使存储系统的速度翻翻，而且加入的硬盘越多，速度越快，不过，RAID 0没有数据冗余，一旦某个硬盘故障，数据将有损失。RAID 5则是兼顾速度和数据安全的明智选择，但它至少需要3块硬盘。

### 硬盘的连接方式

由于接口速度有差异，所以硬盘连接到主板的方式也将影响系统性能。例如，将固态硬盘接到USB接口，远不如将其接到SATA接口。如果你有很多个硬盘，而主板上的接口有限，那你要充分利用可用的接口，并注意合理安排：

- PCI/PCIe/SATA
- 将硬盘改装为网络存储设备，通过网卡连接
- USB/Firewire

使用USB接口时还要注意USB接口是否为“衍生”。如果某两个USB接口正好出自同一个USB根Hub，那么它俩同时使用时将彼此竞争速度。以下命令将帮助你了解个接口的衍生情况：

    USB设备树

    $ lsusb -tv

    PCI设备树

    $ lspci -tv

### 分区方案

对于机械硬盘，分区有可能影响系统性能，因为开头的分区靠近硬盘中心，转速较快。类似的，小的分区可以减少磁盘头的移动，可以提升磁盘性能。因此，建议将系统分区放在开始的部分，并且容量不必太大（10GB左右，取决于具体的需要）。

### 文件系统

#### 挂载选项

`noatime、nodiratime`可以提升大部分文件系统的磁盘性能。在默认情况下，Linux会记录文件的最近一次访问时间戳，这需要频繁执行写入操作，而且，访问时间戳对桌面用户意义不大。因此，桌面用户可以通过`noatime`参数可以禁止这种行为（“a”=access），从而提升性能。`nodiratime`参数禁止记录目录的访问时间戳，如果开启了`noatime`，则自动开启了`nodiratime`。 修改了`/etc/fstab`之后，使用下列命令可使新配置生效：

    # mount -o remount /target

少数程序，如`mutt`在`noatime`下无法工作，折衷的方案是使用`relatime`。这个参数允许Linux在修改文件时顺便更新访问时间戳，从而避免了访问时间戳落后于修改时间戳的怪现象。事实上，2.6.30版本（2009年6月发布）及以后的内核，都默认开启了`relatime`。

#### Ext3

参见Ext3。

#### Ext4

参见Ext4。

#### JFS

参见JFS Filesystem。

#### XFS

参见XFS、"boost knobs" are already "on" by default。

#### Reiserfs

参见Reiser4和Using ReiserFS and Linux。 挂载选项`data=writeback`可以提高速度，但是，死机或突然断电时将丢失数据。挂载选项`notail`可以增加大约5%的磁盘空间，并提升速度。你还可以将日志文件和数据文件分散在不同的磁盘，从而减少硬盘负荷。不过，要达到这个目的需要重新格式化：

    # mkreiserfs –j /dev/sda1 /dev/sdb1

其中，`/dev/sda1`将保存日志，而`/dev/sdb1`将保存数据文件。

#### Btrfs

参见defragmentation和compression。

### 调整内核参数

参见Low write performance on SLES 11 servers with large RAM和Better Linux Disk Caching & Performance with vm.dirty_ratio & vm.dirty_background_ratio。 对于大内存来说，需要考虑调整磁盘写缓存。在`/etc/sysctl.conf`中加入

    #磁盘写缓存上限（占总内存的百分比）
    vm.dirty_ratio = 3
    #内核flusher线程开始清理磁盘写缓存的上限
    vm.dirty_background_ratio = 2

- vm.dirty_ratio默认是10。按目前的标准配置，内存通常都有4GB，这就意味着磁盘的写缓存有400MB（4GB*10%）。对于磁盘的读取操作而言，大缓存并没有问题，但是对于写操作而言，过大的写缓存将造成两个重要风险，一是意外停机时丢失数据，二是累积太多的数据在内存，一旦开始集中写入操作很容易造成长时间卡机。所以，系统内存较大时，应该将这个参数降下来。
- 调整vm.dirty_background_ratio的原理同上。这个参数一般设置为vm.dirty_ratio的1/4～1/2。

### 优化SSD

参见SSD#Tips for maximizing SSD performance[broken link: invalid section]。

### 使用RAM disks

参见USB stick RAID和Combine RAM disk with disk in RAID。

### USB存储设备

This article or section needs expansion.

Reason: provide better description, or at least some reference (Discuss in Talk:Maximizing performance (简体中文)#)

If you experienced slow copy speed to pendrive (mainly in KDE), then append these three lines in a systemd tmpfile:

    /etc/tmpfiles.d/local.conf

    w /sys/kernel/mm/transparent_hugepage/enabled - - - - madvise
    w /sys/kernel/mm/transparent_hugepage/defrag - - - - madvise
    w /sys/kernel/mm/transparent_hugepage/khugepaged/defrag - - - - 0

See also #Tuning kernel parameters[broken link: invalid section].

## CPU

改善CPU速度的方法只有一个，那就是超频。超频可是一项复杂而又有风险的操作，不建议盲目使用。超频的最佳手段是通过BIOS。 acpi_cpufreq等工具常用工具无法读取I5或I7处理器超频后的频率。用户需要改用AUR中的i7z工具。 另外，请参考Linux-ck以及这篇文章修改内核调度器，它们针对桌面应用做了资源配置优化，使之更适应桌面系统的需要。[AUR]]中提供了打补丁内核的PKGBUILD，可以很方便的编译安装。比较著名的有：打了CK补丁包和BFS补丁的kernel26-ckAUR[broken link: archived in aur-mirror] ，打了BFS补丁的kernel26-bfsAUR[broken link: archived in aur-mirror]，打了pf补丁集的kernel26-pfAUR[broken link: archived in aur-mirror]。

Note: BFS/CK适用于桌面机、笔记本，不适用于服务器。少于16个CPU时，这些补丁能起到比较好的效果。此外，Con Kolivas建议把HZ（时钟中断周期）设置为1000。参见：BFS FAQ、ck patches。

### 使用Verynice服务

AUR中的veryniceAUR是一种可以动态调整程序nice等级的服务。对响应时间敏感的应用程序，如X系统、多媒体程序等，可以在`/etc/verynice.conf`文件中将其标记为goodexe，而把那些可以在后台运行的高CPU占用的程序，如make，标记为badexe。这样，当系统负荷很重时仍能及时响应用户的指令。

## 显卡

### Xorg.conf配置

显卡性能严重依赖于`/etc/X11/xorg.conf`，请参阅NVIDIA、ATI以及Intel显卡的相关教程修改配置。注意，不当的配置可能导致Xorg停止工作，所以，请审慎操作。

### Driconf

driconf是官方库中收录的小工具，它可以修改开源驱动的直接渲染设置。启用HyperZ功能将显著改善性能。

### GPU超频

GPU超频要比CPU超频简单得多，通过软件可以实时调整GPU时钟频率。

- ATI显卡可使用rovclockAUR[broken link: archived in aur-mirror]或者amdoverdrivectrlAUR
- NVIDIA显卡可使用nvclockAUR。
- Intel显卡可使用GMABooster.com出品的gmaboosterAUR。

超频设置可以保存到`~/.xinitrc`，每次X启动之后就能自动超频。当然，更安全的做法应该是按需设置。

## 内存及虚拟内存

### 将临时文件转移到tmpfs

如果内存充足，可将`/tmp`、`/dev/shm`或者浏览器缓存文件等转移至tmpfs，这些文件将保存在内存中，从而加快软件的响应速度。借助脚本的帮助，可以轻松实现：

- 同步浏览器缓存：Profile-sync-daemon。
- 同步任意目录：Anything-sync-daemon。

### Swappiness

参阅Swap#Swappiness。

### Compcache/Zram

目前，Compcache已被内核模块zram取代，它们在内存中开辟一个区域存储压缩过的交换文件。如果系统频繁陷入交换状态，此法可以改善系统响应。不过，Zram目前仍在开发状态，尚未完全稳定，使用需谨慎。 AUR中收录的zramswapAUR包含了一个脚本进行自动设置，每个CPU核心对应一个zram设备，总容量等于可用的内存。通过systemctl启动`zramswap.service`，可使得每次开机时自动应用这些配置。

Tip: 该方法有利于减少由于交换空间造成的固态硬盘读写，延长固态硬盘寿命。

### 使用显存

如果你的系统内存很小，而显存又过剩（这种奇葩系统还真少见），请参阅Swap on video ram的方法，将交换文件设置在显存上。

### 预读

通过预读程序、库到内存中，能有效加快程序加载速度。预读通常用于常用的程序，如浏览器。

#### Go-preload

Go-preloadAUR[broken link: package not found]是来自gentoo的一个预读服务。安装后，通过下列命令采集预读信息：

    # gopreload-prepare program

运行需要预读的程序，收集结束后按回车键。

然后会生成一个预读列表：`/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`添加服务就完事了。

## 系统启动

参见：加速系统启动。

### 待机

想要加快系统启动，最好的方法就是不要关电脑，而选择待机。当然，为了可持续发展（至少是电费），不用电脑时还是关了吧。

### 自己编译内核

自己编译内核，删除不需要的模块，可以减少引导时间和内存占用。但通常这是个耗时、枯燥甚至令人厌烦的事情，你可能面临各种错误——甚至最终节约的开机时间还不如你浪费的时间多。但通过自己编译内核，可以学习到不少知识。参见：here。

## 针对特定程序的优化技巧

### Firefox

Firefox (简体中文)一文提供了不少技巧。常用的有：禁用 pango[broken link: invalid section]，清理sqlite数据库，使用firefox-pgo[broken link: invalid section]。另见：Speed-up Firefox using tmpfs、关闭反钓鱼功能。

### Gcc/Makepkg

参见：Ccache。

### LibreOffice

参见：LibreOffice#Speed up LibreOffice。

### Pacman

参见：Improve pacman performance。

### SSH

参见：Speed up SSH。

Categories:

- Hardware (简体中文)
- Software (简体中文)

Hidden categories:

- Pages with broken section links
- Pages or sections flagged with Template:Expansion
- Pages with broken package links