Linux内核参数篇:vm.swappiness

29 阅读2分钟

Linux 内核提供了一个可调整的设置,用于控制交换文件的使用频率,这个设置称为 swappiness。

swappiness 值为零意味着除非绝对必要(例如内存耗尽),否则将避免使用磁盘,而 swappiness 值为 100 则意味着程序几乎会立即被交换到磁盘上。

Ubuntu 系统的默认值为 60,这意味着如果内存使用量大约是 RAM 一半,交换文件会相当频繁地被使用。你可以通过运行以下命令来检查自己系统的 swappiness 值:

one@onezero:~$ cat /proc/sys/vm/swappiness
60

由于我的 RAM 有 4 GB,我想将 swappiness 值调整到 10 或 15。这样,交换文件仅在我的 RAM 使用量达到 80% 或 90% 时才会被使用。要更改系统的 swappiness 值,请以 root 身份打开 /etc/sysctl.conf。然后,修改或添加以下行到文件中:

vm.swappiness = 10

使配置生效:

sudo sysctl -p

或者临时改变(重启失效):

sysctl vm.swappiness=10

你也可以通过以 root 身份运行 swapoff -a 然后再运行 swapon -a 来清除交换空间,而不需要重启系统,以达到相同的效果。

计算交换空间的公式:

free -m (total) / 100 = A

A * 10

root@onezero:/home/one# free -m
             total       used       free     shared    buffers     cached
Mem:          3950       2262       1687          0        407        952
-/+ buffers/cache:        903       3047
Swap:         1953          0       1953

所以总共是 3950 / 100 = 39.5 * 10 = 395

意思是当只剩10% (395 MB) 剩余内存时,将会使用swap.

什么是 swappiness?

swappiness 参数控制内核将进程从物理内存中移出并转移到交换磁盘的倾向。由于磁盘的速度远低于 RAM,如果进程被过于积极地移出内存,可能会导致系统和应用程序的响应时间变慢。

swappiness 的值可以在 0 到 100 之间。

  • swappiness=0

    • 内核版本 3.5 及以上:禁用 swappiness。
    • 内核版本低于 3.5:尽量避免将进程从物理内存中换出。
  • swappiness=1

    • 内核版本 3.5 及以上:最小的 swappiness,而不完全禁用它。
  • swappiness=100

    • 告诉内核积极地将进程从物理内存中换出,并移动到交换缓存。

详细信息请参见 维基百科

Ubuntu 的默认设置是 swappiness=60。降低 swappiness 的默认值可能会改善典型 Ubuntu 桌面安装的整体性能。建议设置为 swappiness=10,但也可以根据需要进行实验。

例子

内存占用超 91% 开始使用swap :

image.png

由于我已将系统和虚拟机配置为在 90% 的情况下使用 RAM,当 RAM 使用量达到 90% 时并没有发生交换。

之后,我打开了一些应用程序,如 Firefox 和 Shutter,然后开始发生交换,因为 RAM 使用量超过了 90%。