故障现象
公司某公有云上一台临时测试主机突然无法正常登录,从控制台查看监控图像发现已经无法正常显示即时信息,将监控时间范围调整7天内,发现如下图信息:
查看系统进程信息:
故障原因
kswapd0,管理虚拟内存并且可能由于过于频繁地将进程移动到SWAP
而出现问题,导致 cpu 峰值和系统性能下降。
kswapd0 的高 CPU 使用率表示内存不足并且正在进行内存交换。
系统检查
Swappiness
查看文件cat /proc/sys/vm/swappiness
This control is used to define how aggressive the kernel will swap
memory pages. Higher values will increase aggressiveness, lower values
decrease the amount of swap. A value of 0 instructs the kernel not to
initiate swap until the amount of free and file-backed pages is less
than the high water mark in a zone.
The default value is 60.
谷歌翻译下:
此控件用于定义内核交换的积极程度内存页。较高的值会增加侵略性,较低的值减少交换量。值为 0 指示内核不要启动交换,直到空闲页面和文件备份页面的数量减少高于区域中的高水位线。默认值为 60。
说明:设置为 0 可以防止不必要的交换活动。
vfs_cache_pressure
查看文件cat /proc/sys/vm/vfs_cache_pressure
default value is 100, when set to 0, it will never reclaim dentries and inodes due to memory pressure and this can easily lead to out-of-memory conditions. With vfs_cache_pressure=1000, it will look for ten times more freeable objects than there are.
谷歌翻译下:
默认值为 100,当设置为 0 时,由于内存压力,它永远不会回收 dentry 和 inode,这很容易导致内存不足的情况。当 vfs_cache_pressure=1000 时,它会寻找比现在多十倍的可释放对象。
transparent_hugepage
查看文件cat /sys/kernel/mm/transparent_hugepage/enabled
简而言之,它应该设置为always
。
故障修复
关闭 swappiness
echo vm.swappiness=0 | tee -a /etc/sysctl.conf
清理缓存
echo 1 > /proc/sys/vm/drop_caches