One*_*ero 601
Linux 内核提供了一个可调整的设置,用于控制交换文件的使用频率,称为 swappiness。
交换设置为零意味着除非绝对必要(内存不足),否则将避免使用磁盘,而交换设置为100意味着程序将几乎立即交换到磁盘。
Ubuntu 系统默认为 60,这意味着如果内存使用量大约是我 RAM 的一半,交换文件将被经常使用。您可以通过运行以下命令来检查您自己系统的 swappiness 值:
one@onezero:~$ cat /proc/sys/vm/swappiness
60
Run Code Online (Sandbox Code Playgroud)
由于我有 4 GB 的 RAM,我想将其降低到 10 或 15。只有当我的 RAM 使用率约为80 %或90 %时才会使用交换文件。要更改系统 swappiness 值,请/etc/sysctl.conf以root身份打开。然后,将此行更改或添加到文件中:
vm.swappiness = 10
Run Code Online (Sandbox Code Playgroud)
应用更改。
sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)
您还可以在系统仍在运行时更改该值:
sysctl vm.swappiness=10
Run Code Online (Sandbox Code Playgroud)
您还可以通过运行swapoff -a然后swapon -a以 root 身份而不是重新启动来清除交换以达到相同的效果。
计算您的掉期公式:
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
Run Code Online (Sandbox Code Playgroud)
所以总数是 3950 / 100 = 39.5 * 10 = 395
所以这意味着当剩下10% (395 MB) 的内存时,它将开始使用交换。
swappiness 参数控制内核将进程从物理内存移到交换磁盘上的趋势。由于磁盘比 RAM 慢得多,如果进程过于频繁地移出内存,这可能会导致系统和应用程序的响应时间变慢。
swappiness 可以有一个介于 0 和 100 之间的值。swappiness=0:
swappiness=1:
swappiness=100:
请参阅http://en.wikipedia.org/wiki/Swappiness。
Ubuntu 中的默认设置是swappiness=60. 减少 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。swappiness=10建议使用 的值,但可以随意尝试。
在91%开始使用交换:
由于我已将系统和虚拟机配置为在90% 时使用 RAM ,因此在90%时没有交换。
之后,我打开了一些应用程序,例如 Firefox 和 Shutter,它开始交换,因为 RAM 使用率超过90%。
Gab*_*les 12
我需要一种逐步、简单且容易的方法来配置交换性。
我想通过添加以下内容来阐述此处已有的答案:
所以,事情是这样的:
# read current swappiness setting
sysctl vm.swappiness
# or (same thing)
cat /proc/sys/vm/swappiness
# change setting to zero
sudo sysctl vm.swappiness=0
Run Code Online (Sandbox Code Playgroud)
上述命令在重新启动后不会持续存在。要使该设置持久存在,您需要使用sudo并编辑该文件/etc/sysctl.conf,将所需的交换设置添加到其末尾。例子:
# edit the file with the `nano` editor
sudo nano /etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)
将其添加到“/etc/sysctl.conf”的末尾:
# my custom swappiness setting
vm.swappiness=0
Run Code Online (Sandbox Code Playgroud)
如果您选择仅编辑该文件来设置自定义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
Run Code Online (Sandbox Code Playgroud)
运行上述任一命令结束时,终端会将其打印到标准输出:
vm.swappiness = 0
要查看您当前的设置/etc/sysctl.conf:
cat /etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)
按照我的说明自行下载 Linux 源代码:在哪里以及如何获取官方 Linux 内核源代码。
如 的 Linux Stable 存储库中所示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 更有效。最佳值需要进行实验,并且还取决于工作负载。
默认值为 60。
对于内存中交换(例如 zram 或 zswap)以及在比文件系统更快的设备上进行交换的混合设置,可以考虑超过 100 的值。例如,如果针对交换设备的随机 IO 平均比来自文件系统的 IO 快 2 倍,则交换性应为 133 (x + 2x = 200, 2x = 133.33)。
当值为 0 时,内核不会启动交换,直到空闲页面和文件支持页面的数量小于区域中的高水位线。
因此,值不再介于 0 和 100 之间。自2020 年 6 月 3 日提交哈希 c843966c556d7起,该值现在的范围从 0 到 200。
在此之前的提交哈希497a6c1b09902b22ceccc0f25ba4dd623e1ddb7d指出了这一点:
交换性
=========
该控制用于定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少交换量。值 0 指示内核不要启动交换,直到空闲页面和文件支持页面的数量小于区域中的高水位线。
默认值为 60。
默认的 swappiness 值60至少可以追溯到 18 年前的 Linux 内核版本 v2.6.12-rc2(截至 2005 年),如设置该值的文件所示git blame(mm/vmscan.c此处 )。
我强烈推荐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)交换内存(在铬合金)。当 RAM 达到 80% 满时,我就会开始出现这些锁定情况。在此期间,计算机将完全无法使用——甚至无法在终端中输入内容或单击菜单。将 swappiness 设置为 0有很大帮助!。直到 RAM 占满 90% 之前,我的 CPU 使用率才开始达到很高的水平,交换空间仍然会被大量使用,但效率更高,当我的 RAM 几乎占满时,我的计算机会变得非常缓慢,但仍然几乎无法使用,而不是完全无法使用!
在这里查看我的一些症状,我最初认为这是由于 Google Meet 中的错误造成的,但现在认为是由于内存交换导致我的计算机变慢:https://github.com/ElectricRCAircraftGuy/bug_reports/issues/3#issue -1177137900
在我的系统上:
vm.swappiness=60,我会看到 1 到 2 分钟的 100% CPU 锁定,从 RAM 使用率大约 79% 开始,每 4 到 6 分钟一次,永远如此。在使用 Google Meet 时,这种情况尤其严重和突出。vm.swappiness=0,就不会发生这种情况。当 RAM 使用率达到 80% 时,我会觉得还好,但当 RAM 使用率达到 90% 时,我会开始看到明显的迟缓,但不会像以前那样完全锁定。
sysctl --system上面的cmdkswapd0占用大量 cpu - 有用,但这个引用是完全错误的:
其中 0 是 100 中剩余的百分比,此时应使用 SWAP(当 RAM 剩余 0% 时,SWAP 将开始接收数据)。
我的答案——我需要这个交换信息。对他们来说: