颜林林的个人网站

Linlin Yan's Personal Website

Linux交换分区的调优

2020-03-05 08:48

最近新安装的Linux系统,在运行一个较大的程序时,性能就明显下降。经检查,瓶颈似乎落到了磁盘读写上,这才意识到忘记对Linux交换分区(swap)做调整了。

交换分区(swap),是从硬盘上划出来的一块存储空间,用来与物理内存中的数据进行交换。当物理内存的使用接近耗尽时,为了确保程序继续正确运行,操作系统就会自动把物理内存中的一部分不常用数据转储到硬盘上,释放出这部分内存空间供急需的程序使用,而当原来那些数据再被使用时,再重新将它们从硬盘中读取回来(或者说交换回来)。这个过程对于应用程序而言是透明的,应用程序只会感觉到似乎有充足的内存供其使用,并不受到物理内存的实际大小所限制。

Linux内核中,有个重要的参数,叫做“swappiness”,它代表了系统使用交换分区的偏好程度,取值为在0到100之间的整数。数值越大,表示越偏好使用交换分区。如果是100,表示系统会尽可能把数据都放到交换分区,而留出物理内存供使用。如果是0,则表示系统不到万不得已,会尽可能不使用交换分区。该数值缺省是60,表示在物理内存被使用60%以下时,不会使用交换分区,而一旦超过60%,超出部分就会转入交换分区。

该参数的查看和修改方法为:

1
2
3
4
5
6
# cat /proc/sys/vm/swappiness  # 查看该配置
60
# echo "vm.swappiness = 10" >> /etc/sysctl.conf  # 追加一行配置
# sysctl -p  # 使该配置生效
# cat /proc/sys/vm/swappiness  # 再次查看该配置
10

对于桌面系统,低延迟的实时响应还是很重要的,延迟太大,就会严重伤害用户体验。所以,通常会降低这个swappiness数值。在新版内核(3.5及以上)中,若将该数值设置为0,则会完全禁用交换分区,所以,想要保持低延迟(尽量不做交换)的同时,还能在内存确实不足时及时启用交换分区,确保程序不至于因内存分配失败而崩溃,则可以将该数值设置为1。

参考: