我需要一个循序渐进、简单易行的方法来配置 swappiness。
答案1
Linux 内核提供了一个可调整的设置来控制交换文件的使用频率,称为 swappiness。
swappiness 设置为零意味着除非绝对必要(内存不足),否则将避免使用磁盘,而 swappiness 设置为100意味着程序将几乎立即被交换到磁盘。
Ubuntu 系统默认为 60,这意味着如果内存使用量约为我的 RAM 的一半,则交换文件将被经常使用。您可以通过运行以下命令检查自己系统的 swappiness 值:
one@onezero:~$ cat /proc/sys/vm/swappiness
60
因为我有 4 GB 的 RAM,所以我想将其调低到 10 或 15。这样,只有当我的 RAM 使用率达到80或者90百分比。要更改系统 swappiness 值,请打开/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) 的 RAM,那么它将开始使用交换。
什么是 swappiness?
swappiness 参数控制内核将进程从物理内存移出并移至交换磁盘的趋势。由于磁盘比 RAM 慢得多,因此如果进程过于频繁地移出内存,这会导致系统和应用程序的响应时间变慢。
swappiness
值介于 0 至 100 之间。swappiness=0
:- 内核版本 3.5 及更新版本:禁用 swapiness。
- 内核版本早于3.5:尽可能避免将进程交换出物理内存。
swappiness=1
:- 内核版本 3.5 及以上:最低限度的交换,而无需完全禁用它。
swappiness=100
:- 告诉内核积极地将进程从物理内存中交换出来并将其移至交换缓存。
看http://en.wikipedia.org/wiki/Swappiness。
Ubuntu 中的默认设置是swappiness=60
。降低 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。swappiness=10
建议使用 的值,但您可以随意尝试。
例子
开始使用 swap91%:
由于我已经配置了我的系统和虚拟机以使用 RAM90%, 在90%没有交换。
之后我打开了一些应用程序,比如 Firefox 和 Shutter,它开始交换,因为 RAM 使用率高于90%。
答案2
我需要一个循序渐进、简单易行的方法来配置 swappiness。
我想通过补充来阐述这里已有的答案:
- 关于如何改变交换能力的非常简洁的总结。
- 最新 Linux 内核源代码中的一些引述(如果有兴趣,请参阅此处了解如何下载) 关于“swappiness”的真正含义以及它的范围到底是多少。
因此,情况如下:
1. 如何配置 swappiness
# read current swappiness setting
sysctl vm.swappiness
# or (same thing)
cat /proc/sys/vm/swappiness
# change setting to zero
sudo sysctl vm.swappiness=0
上述命令在重启后不会持久。要使设置持久,您需要使用sudo
并编辑文件,/etc/sysctl.conf
将所需的 swappiness 设置添加到其末尾。示例:
# edit the file with the `nano` editor
sudo nano /etc/sysctl.conf
将此添加到“/etc/sysctl.conf”的末尾:
# my custom swappiness setting
vm.swappiness=0
如果你选择仅有的编辑该文件以设置您的自定义swappiness
设置,而不是使用 进行设置sudo sysctl vm.swappiness=0
,然后要激活文件中设置的新设置,您需要重新启动或者调用以下命令重新加载配置文件:
# reload just the "/etc/sysctl.conf" config file
sudo sysctl --load
# or: from `man sysctl`:
#
# Load settings from all system configuration files, namely:
#
# /run/sysctl.d/*.conf
# /etc/sysctl.d/*.conf
# /usr/local/lib/sysctl.d/*.conf
# /usr/lib/sysctl.d/*.conf
# /lib/sysctl.d/*.conf
# /etc/sysctl.conf
#
sudo sysctl --system
在运行上述任一命令结束时,终端都会将以下内容打印到标准输出:
vm.swappiness = 0
要查看当前设置,请执行以下操作/etc/sysctl.conf
:
cat /etc/sysctl.conf
2. Linux 内核开发人员直言 swappiness 是什么
按照我的说明自行下载 Linux 源代码:在哪里和如何获取官方Linux内核源代码。
如 Linux Stable repo 中所示git blame Documentation/admin-guide/sysctl/vm.rst
,本文档由 Peter W Morreale、Mauro Carvalho Chehab 和 Johannes Weiner 编写(请参阅内核源代码在这里)(重点添加,格式略有修改):
交换性
==========
此控件用于定义交换和文件系统分页的粗略相对 IO 成本,作为以下值之一:0 和 200当值为 100 时,VM 假设 IO 成本相等,因此会将内存压力平等地应用于页面缓存和交换支持的页面;值越低表示交换 IO 成本越高,值越高表示交换 IO 成本越低。
请记住,在内存压力下,文件系统 IO 模式往往比交换的随机 IO 更高效。最佳值需要进行实验,并且还取决于工作负载。
默认值为 60。
对于内存交换(如 zram 或 zswap)以及在比文件系统更快的设备上进行交换的混合设置,可以考虑使用大于 100 的值。例如,如果针对交换设备的随机 IO 平均比来自文件系统的 IO 快 2 倍,则 swappiness 应该是 133(x + 2x = 200,2x = 133.33)。
在 0 时,内核不会启动交换,直到可用页面和文件支持页面的数量小于区域中的高水位。
因此,价值观不是0 到 100 之间的范围。截至此提交哈希 c843966c556d7截至 2020 年 6 月 3 日,该值现在范围为 0 至 200。
这在此之前提交哈希 497a6c1b09902b22ceccc0f25ba4dd623e1ddb7d而是这样说:
交换性
==========
此控制用于定义内核交换内存页面的积极程度。值越高,积极程度越高;值越低,交换量越少。值为 0 表示内核在可用页面和文件支持页面的数量低于区域中的高水位标记之前不启动交换。
默认值为 60。
默认的 swappiness 值60
至少可以追溯到 18 年前的 Linux 内核版本 v2.6.12-rc2(截至 2005 年),如设置文件git blame
中所示,此处mm/vmscan.c
。
我应该使用哪种 swappiness?
我强烈推荐vm.swappiness=0
!它让我的机器运行得更好。从我的经历来看在我的回答中:
我发现将 swappiness 设置为 0 可以显著提高我的系统的性能,该系统具有 32 GB RAM、高速 m.2 SSD 上的 64 GB 交换文件,并且 RAM 不断耗尽。
将 swappiness 设置为默认值 60 后,我在
kswapd0
运行时经常会出现 1 到 2 分钟的锁定期(如图所示top
),以尝试为 Chrome、Slack、Eclipse 或 Google Meet(在 Chrome 内)等占用大量内存的应用程序交换内存。当 RAM 占用 80% 时,我就会开始出现这些锁定。计算机将完全无法使用在这段时间内——我甚至无法在终端中输入内容或单击菜单。将 swappiness 设置为 0有很大帮助!。我开始没有真正遇到高 CPU 使用率,直到 90% 的 RAM 已满,交换空间仍然会被大量使用 - 但效率更高,当我的 RAM 几乎已满时,我的计算机会变得非常缓慢,但仍然几乎无法使用,而不是完全无法使用!
请在此处查看我的一些症状,我原本以为是由于 Google Meet 中的错误造成的,但现在认为是由于内存交换导致我的计算机运行缓慢:https://github.com/ElectricRCAircraftGuy/bug_reports/issues/3#issue-1177137900
在我的系统上:
- 使用 时
vm.swappiness=60
,我会看到 1 到 2 分钟的 100% CPU 锁定,从大约 79% 的 RAM 使用率开始,每 4 到 6 分钟一次,永远如此。这种情况尤其严重和突出使用 Google Meet 时。 - 使用
vm.swappiness=0
,就不会发生这种情况。80% 的 RAM 使用率让我感觉很好,当 RAM 使用率达到 90% 时,我会开始看到严重的反应迟缓,但不会像以前那样完全锁定。- 即使将 swappiness 设置为 0,我还是会看到一些交换使用量(几 MB),最早是使用 RAM 的 0 到 3%,并且我会发现交换使用量很大,达到 RAM 使用的 80% 到 90%。
参考:
- https://linuxize.com/post/how-to-change-the-swappiness-value-in-linux/- 我在这里学到了上述大部分 sysctl 命令
- https://www.cyberciti.biz/faq/reload-sysctl-conf-on-linux-using-sysctl/- 我在那里学到了
sysctl --system
上面的 cmd
有关的:
kswapd0
占用大量 CPU- 有用,但是这句话完全是错误的:其中 0 是应该使用 SWAP 的剩余百分比(当剩余 RAM 为 0% 时,SWAP 将开始接收数据)。
我的答案——我需要这个交换信息。对于他们来说:
答案3
对于没有任何实际交换分区/文件的 ZRAM 交换,使用 100。它将预压缩所有可以预压缩的内容,保持缓存完好无损并根据需要快速解压缩数据(此外,如果没有真正的交换,您需要增加 admin_reserve_kbytes x2 甚至 x4 以避免整个系统在低 RAM 上冻结,而不是放弃一个耗电的应用程序)。
对于具有实际交换分区的 SSD,使用 1。它将尽可能长时间地防止交换,牺牲缓存(但可以轻松地从 SSD 重新读取缓存)。