什么是Swap分区
自己安装过Linux系统的朋友可能还记得,在我们安装Linux系统时,需要创建叫做Swap的分区,网上大部分教程中大都建议Swap分区大小和RAM大小相当以便休眠时可以快速启动。
那么Swap分区是干什么用的呢?
简单来说,Swap(交换分区)是一块虚拟内存空间,也就是Linux系统会把一部分磁盘当作备用的内存来使用,
(是的,和我们经常在各大国产安卓定制系统中听到的内存扩展、虚拟内存是一个东西)
当系统中内存不足且某个进程不再活跃时,它会从RAM中被交换(Swap)到单独规划出的Swap分区以便备用,这主要是为了减轻内存压力,保证前台的流畅运行,同时避免因为资源不足导致进程被杀死(killed)。
怎样控制内核交换
我们刚才在讲进程Swap时,提到的 “系统中内存不足” 是一个模糊的概念,在实际的操作中,必须有一个指标将这个模糊的概念量化。
由此,就不得不提Linux系统中的一个内核参数:
vm.swappiness
这里的vm指的是 Vertial Machine 即 Linux 操作系统(有时也指应用程序的运行环境),
swappiness表示交换区 (Swap分区) 的使用频率。
这个值可以在0~200之间。
这个参数的值越大,意味着内核会更加积极的将内存中的数据移动到Swap分区,反之亦反。
vm.swappiness | 含义 |
---|---|
0 | 指示内核尽可能避免交换。 |
10-50 | 指示内核在换出内存页面时稍微积极一些。 |
50-100 | 指示内核在换出内存页面时适度积极。 |
>100 | 指示内核在换出内存页面时非常积极。 |
很多资料认为,vm.swappiness 是内核开始交换时RAM的使用百分比,但如果你使用top或top like工具(这里推荐bashtop)查看时会发现这并不符合实际情况。
实际上,wappiness 更关心的是在文件支持的页面缓存所需的资源和匿名内存所需的资源之间平衡内存资源。-- By Robert Sheldon
为什么要更改Swap策略
如此以来,有了Swap分区系统就可以智能得将暂时不用的文件从RAM中移出,既保证了前台流畅,又保持了进程存活。
这听起来不错,不是吗? 😃
但是,有一个问题:
如果我们把文件从RAM中交换到ROM,一旦我们向重新把它读取到RAM,由于ROM相较与RAM孱弱的IO性能,开销将是巨大的,作为用户我们直观的感受就是应用卡顿。
如果swappiness设置的过于激进,系统就会在RAM还有大量可用空间时就开始动用Swap分区,这显然是我们在PC上不希望看到的(服务器另当别论),毕竟我们希望我们能榨干电脑的每一滴性能来保证流畅的体验 (毕竟我们为硬件花了钱)。
因此,通常情况下,虽然我们会提供Swap分区以备不时之需,但我们都希望系统能先使用RAM来维持性能,而不是使用Swap来损耗我们的磁盘寿命。
然而,在大多数Linux发行版中vm.swappiness的默认值通常是60。
显然,这对于大部分PC用户来说略高了。
那么我们该怎样调整这个值呢?
调整Swap策略
查看
如果你想查看Swappiness的值,可以
cat /proc/sys/vm/swappiness
或者
sudo sysctl vm.swappiness
临时更改
如果你想临时更改Swappiness看看效果,你可以:
sudo sysctl vm.swappiness=[value]
这里[value]为你要修改的值。
但是注意,下次开机时临时更改的值将会消失。
永久更改
对于永久更改:
你可以在/etc/sysctl.conf
最后添加一行
vm.swappiness=[value]
同样 [value] 为你要更改的值。
更改完成后,保存文件。
之后执行,
sysctl -p
生效。
应该改成什么值合适?
对于合适的大小,并没有绝对的最优解,应该根据实际的软硬件情况调整,可能需要反复实验和调试才能找到性能最优的方案。
(我电脑设置的值为5,可以供你参考)