大多数时候,当我的电脑开始需要交换时,我看到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的人来说可能是个麻烦)
(未完待续)