使用交换区时,kswapd 经常占用 100% 的 CPU

使用交换区时,kswapd 经常占用 100% 的 CPU

大多数情况下,当我的计算机开始需要交换时,我会看到 CPU 使用率大幅上升(kswapd0持续使用 99%-100% 的 CPU)。根据top,时间花在sy(系统/内核)上,而不是wa(IO 等待)上。

我在具有 2GB RAM 和 6GB SSD 交换空间的 C720 上运行 Linux 4.0.4-2-ARCH。

无论是否打开丢弃页面(TRIM),我似乎都遇到了这个问题。

我应该检查或调整哪些设置来查看是否可以修复此问题?

有什么方法可以调试该问题吗?类似strace内核线程的方法?


使用默认 Arch Linux 设置运行:

/proc/sys/vm/swappiness= 60
/proc/sys/vm/vfs_cache_pressure= 100
/sys/kernel/mm/transparent_hugepage/enabled=[always] madvise never

答案1

这似乎相对地 常见的 问题

当问题发生时,您可以检查以下命令是否可以停止它:echo 1 > /proc/sys/vm/drop_caches

如果有效,您可以将其安排为定期的 cron 作业作为解决方法。

答案2

我有一台 C720,在 Ubuntu 14.04.1 LTS 上运行 Linux 内核 4.4.0,具有 2 GB RAM 和 2 GB 交换空间。

假设 Chrome/Chromium 使用量很大,以下是一些提高系统性能的方法:

  1. 编辑/etc/default/grub并添加以下内核参数到该GRUB_CMDLINE_LINUX_DEFAULT行:
    • elevator=noop
    • zswap.enabled=1
    • transparent_hugepage=madvise
  2. 跑步sudo update-grub2
  3. 编辑/etc/sysctl.conf并附加以下内容:
  4. 重启。

您可以像这样验证更改:

$ dmesg | grep -i noop
[    0.694680] io scheduler noop registered (default)
$ dmesg | grep -i zswap
[    0.724855] zswap: loaded using pool lzo/zbud
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
$ sysctl vm.swappiness
vm.swappiness = 25
$ sysctl vm.vfs_cache_pressure
vm.vfs_cache_pressure = 1000

更新

在步骤 #3 中增加vm.min_free_kbytes可能会有所帮助。尝试使用 (128 MB) 的值131072。最后的结论是,在内存不足的情况下,桌面上的 Linux 性能不佳。有人建议将 Chrome/Chromium 放在 中cgroup,但这超出了本答案的范围。

答案3

我不确定为什么没有人提出这个答案:killall -9 kswapd0

我遇到了这个问题,kswapd0进程以非 root 用户身份运行,并且该用户很长时间没有登录。我已终止此进程,问题不再出现。

不,这并不能解决根本问题(它一开始是怎么达到 100% 的),但可以让您快速恢复系统的使用。

答案4

kswap内核用于分配和释放内存页,如果你使用交换,你会看到这个内核线程使用了这么多的CPU时间,那就说明kswap内核线程正在扫描内存页以交换一些页面并满足内存分配请求。

我认为在这种情况下删除缓存没有帮助,因为当操作系统出现内存紧张的情况时内核会自动回收缓存。

如果你没有任何内存问题并使用该free命令,你会看到很多内存被用作缓存,但是如果你有内存问题,Linux 会减少缓存以满足内存分配请求,而无需删除缓存

您可以使用sar -B和查找majftpgscank值,查找其他值man sar

相关内容