大多数时候,当我的电脑开始需要交换时,我看到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使用量很大,下面介绍一些使系统性能更好的方法:
/etc/default/grub并将以下内核参数添加到GRUB_CMDLINE_LINUX_DEFAULT行:
elevator=noop zswap.enabled=1 transparent_hugepage=madvise sudo update-grub2 。 /etc/sysctl.conf并附加以下内容:
vm.swappiness=25 # vm.swappiness=25 (RES在top )* 2 / RAM = 500 MB / 2 GB vm.vfs_cache_pressure=1000 #比周期性地删除caching更安全 您可以像这样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并查找majft和pgscank值,对于其他值man sar
( 这是准答案 – 太长,不能作为评论,但不是一个准备好的答案 )
1)怎么样不使用6G,而是less一些,比如1或2个GiB(你可以使用mkswap来设置大小,而不用resize的交换分区) – 试过了吗? 什么结果?
2)什么是sysctl vm.swappiness , sysctl 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的人来说可能是个麻烦)
(未完待续)