如何配置swappiness?

One*_*ero 417 swap memory-usage

我需要一个循序渐进、简单易行的方法来配置 swappiness。

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.confroot身份打开。然后,将此行更改或添加到文件中:

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) 的内存时,它将开始使用交换。


                                          帮助 。Ubuntu 。交换

                                           什么是互换性

swappiness 参数控制内核将进程从物理内存移到交换磁盘上的趋势。由于磁盘比 RAM 慢得多,如果进程过于频繁地移出内存,这可能会导致系统和应用程序的响应时间变慢。

  • swappiness 可以有一个介于 0 和 100 之间的值。
  • swappiness=0
    • 内核版本 3.5 及更高版本:禁用交换性。
    • 早于 3.5 的内核版本:避免尽可能长时间地将进程交换出物理内存。
  • swappiness=1
    • 内核版本 3.5 及更高版本:无需完全禁用即可实现最小交换。
  • swappiness=100
    • 告诉内核主动从物理内存中交换进程并将它们移动到交换缓存。

请参阅http://en.wikipedia.org/wiki/Swappiness

Ubuntu 中的默认设置是swappiness=60. 减少 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。swappiness=10建议使用 的值,但可以随意尝试。


例子

91%开始使用交换:

在此处输入图片说明 由于我已将系统和虚拟机配置为在90% 时使用 RAM ,因此在90%时没有交换。

之后,我打开了一些应用程序,例如 Firefox 和 Shutter,它开始交换,因为 RAM 使用率超过90%

  • Swappiness 为 100 不会立即换出程序,值 60 或 90 也不意味着当 ram 已满 60 或 90% 时使用交换。这是从缓存中窃取页面与在内存不足时换出以释放一些内存的偏好比率。低值强烈倾向于从缓存中窃取页面,高值强烈倾向于尝试和交换页面。该设置仅在内存(几乎)全部使用后才有效,并且内核必须选择如何释放一些内存。 (141认同)
  • 您需要指出,未被运行程序占用的 RAM 用作磁盘缓存...因此,通过降低交换率,您增加了程序不被交换出的机会,但同时减小了大小磁盘缓存,这会使磁盘访问速度变慢。所以这个设置对实际性能的影响并不是那么简单......当然欢迎你进行实验,但我怀疑默认值是由对主题足够了解的人设置的:) (73认同)
  • @Sergey 具有讽刺意味的是,那些内存较小的人最有可能尝试他们能遇到的每一个技巧来提高性能,并且更有可能成为那些认为 60 岁甚至更高的人是最好的数字。我们这些人将它设置为 10,因为我们有大量的 RAM 没有增加,如果他们这样做,他们会失去多少。 (18认同)
  • 只是在这里留下一个类似的讨论 - http://unix.stackexchange.com/questions/88693/why-is-swappiness-set-to-60-by-default (9认同)
  • @Freedom_Ben:见 http://www.linuxatemyram.com :) (8认同)
  • 这在很大程度上是一个很好的解释,但更改默认交换率的建议适得其反。减少计算机交换通常会导致**更多** I/O,因为它不断重新加载无法保留在缓存中的有用数据。 (3认同)
  • “因为我有 4 GB 的 RAM,所以我想把它降低到 10 或 15。” <---- 在 2018 年再说一遍。其中一半用于在 Ubuntu 上运行 Slack。 (3认同)
  • 与具有 8GB 的​​ ubuntu 14.04 上的 swappiness 60 相比,我对 swappiness 10 的体验是:我获得了更好的响应时间。Eclipse 不像以前那样经常冻结。Unity 冻结和完全锁定不再发生(以前每天都会发生)。我的磁盘的工作量要少得多,使用 Swappiness 60 时,只要使用了超过 4GB 的内存,我就可以进行全职磁盘操作。但是:我认为作为 JAVA 开发人员,我不是默认设置的预期目标群体。我的 ubuntu 设置中没有默认设置。更换时要小心。 (2认同)
  • 正如其他人已经指出的,这个答案是错误的。它不应被标记为已接受的答案。Swappiness 控制交换文件支持页面与匿名内存之间的比率。有关交换的更深入的技术讨论,尤其是与 SSD 甚至 ZRAM 等快速 I/O 设备的交换,此补丁系列以及围绕它的讨论很有趣:https://lore.kernel.org/patchwork/patch/685711/ (2认同)
  • 对于具有 8GB RAM 和快速 SSD 的笔记本电脑,将 `swappiness` 设置为 10 使 Ubuntu 18.04 变得更加流畅,类似于@mondjunge 的体验。不再有 GNOME 死机,不再有鼠标光标在操作系统处理交换文件时跳过。我一直运行的顶级应用程序(就资源而言)是带有 50 多个选项卡的 Chrome 和 WebStorm IDE(一个 Java 应用程序)。 (2认同)

Gab*_*les 12

我需要一种逐步、简单且容易的方法来配置交换性。

我想通过添加以下内容来阐述此处已有的答案:

  1. 关于如何更改交换性的非常简洁的总结。
  2. 最新 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
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)

2. Linux 内核开发者亲口讲述什么是 swappiness

按照我的说明自行下载 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 blamemm/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% 时,我会开始看到明显的迟缓,但不会像以前那样完全锁定。
    • 即使将 swappiness 设置为 0,我也会看到早在使用 RAM 的 0 到 3% 时就使用了一些交换空间(几 MB),并且我的交换空间使用率很高,达到了使用 RAM 的 80% 到 90%。

参考:

  1. https://linuxize.com/post/how-to-change-the-swappiness-value-in-linux/ - 我在那里学习了上面的大部分 sysctl cmd
  2. https://www.cyberciti.biz/faq/reload-sysctl-conf-on-linux-using-sysctl/ - 我在哪里学习了sysctl --system上面的cmd

有关的:

  1. kswapd0占用大量 cpu - 有用,但这个引用是完全错误的:

    其中 0 是 100 中剩余的百分比,此时应使用 SWAP(当 RAM 剩余 0% 时,SWAP 将开始接收数据)。

  2. 我的答案——我需要这个交换信息。对他们来说:

    1. *****非常有用——我经常引用这个:问题:Eclipse 和 Eclipse 索引器占用了我所有的资源/CPU%
    2. Unix 和 Linux:将 swappiness 设置为 0 与 swapoff 之间有什么不同
  3. 我的答案:如何增加交换文件的大小而不在终端中删除它?