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

大多数时候,当我的电脑开始需要交换时,我看到CPU使用率大幅上升( kswapd0始终使用99%-100%的CPU)。 根据top ,时间花在sy (系统/内核)而不是wa (IO等待)。

我正在C720上运行Linux 4.0.4-2-ARCH,内存为2GB,固态硬盘为6GB。

我似乎有这个问题有或没有丢弃页面(TRIM)打开。

有什么设置我应该检查或调整,看看我能解决这个问题吗?

有什么方法可以debugging这个问题吗? 像内核线程strace东西?


使用默认的Arch Linux设置运行:

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

这似乎是一个比较 常见的 问题

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

如果可行,则可以将其作为周期性的计划工作计划,作为解决方法。

在Ubuntu 14.04.1 LTS上有一个运行Linux Kernel 4.4.0的C720,带有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并附加以下内容:
    • vm.swappiness=25vm.swappiness=25 (RES在top )* 2 / RAM = 500 MB / 2 GB
    • vm.vfs_cache_pressure=1000 #比周期性地删除caching更安全
  4. 重启。

您可以像这样validation更改:

 $ 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可能是有益的。 尝试131072 (128 MB)的值。 最后的结果是,桌面上的Linux在低内存情况下performance不佳。 有人build议将Chrome / Chromium放在cgroup ,但这不在这个答案的范围之内。

kswap内核用于分配和释放momery页面,如果你的swap使用在你看到这个内核线程使用这么多的cpu时间,也就是说kswap内核线程正在扫描内存页面来交换一些页面并提供内存分配请求。

在这种情况下,我认为放弃caching并没有帮助,因为当操作系统内存紧张时,内核会自动回收caching。

如果你没有任何内存问题并且使用free命令,那么你将使用如此多的内存作为caching,但是如果你有一个内存问题的话,那么Linux就会减lesscaching来服务于内存分配请求,而不需要去掉caching

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

这是准答案 – 太长,不能作为评论,但不是一个准备好的答案

1)怎么样不使用6G,而是less一些,比如1或2个GiB(你可以使用mkswap来设置大小,而不用resize的交换分区) – 试过了吗? 什么结果?

2)什么是sysctl vm.swappinesssysctl vm.vfs_cache_pressure

3) cat /sys/kernel/mm/transparent_hugepage/enabled什么?

NB你是否意识到你将会在这样的设置中显着地损耗你的SSD(而不是那么多的RAM,巨大的交换)。

PS我可以build议尝试使用UltraKSM,但它需要修补一个内核。 我有一些我自己的(基于实时和基于BFS的)构build,但他们是基于.deb的系统,同时他们可以很容易地在不同的系统上使用(通常你只需要解压缩.deb和做相应的initrd / initramfs,对于那些不熟悉Linux的人来说可能是个麻烦)

(未完待续)