问题
最近一台 Linux 服务器经常出现 cpu 过高,导致服务器卡顿,其他进程不能顺利进行。通过 top 命令查看资源的占用情况,可以看到 Kswapd0 进程 消耗了大量的 cpu 资源。
原因及解决
通过搜索得知,Kswapd0 进程是用来管理虚拟内存的。
一般的 Linux 都会有 RAM,swap, 和 EXT4 这几个部分,EXT4 分区就是用来存放一般的文件,可以在机械硬盘或者 SSD 上划分出 ext4 分区来保存文件,相对 RAM(内存)来说要稍微慢一些,RAM 就是日常所说的内存,用来做程序运行时的高速缓存,而 SWAP 是交换分区,一般在物理内存比较小的机器上会划分一块物理磁盘来作为 swap 分区。
swap 分区是一款虚拟的 RAM,一般在 HDD/SSD 上,当物理内存比较小的时侯,可能经常缺内存,那么系统就会使用 swap 分区,将物理内存中的内容搬迁到 swap 分区中暂存。当可用物理内存比较小的时候,kswapd0 进程就会将相对比较不常用的程序移动到 swap 分区中,这个时候就可能造成这些程序比较卡顿。例如一台机器的内存是 4G,而要运行一个需要 5G 内存的程序,那么至少有 1G 的内存会放到 swap 分区中。kswapd0 移动内存的过程就会造成 CPU 的大量使用。要解决这个问题有这样几个方式。
1 修改 /etc/sysctl.conf 文件
echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf
这里 0 表示物理内存还剩余的百分比,这个值的取值范围是 0-100,配置 0 也就意味着只有当没有物理内存可用时再执行 kswapd0.
2 关闭一些不使用的程序
3 增加内存
4 增加 swap 分区
小结
本文主要是介绍我遇到的 kswapd0 使用 cpu 资源过高的问题,以及如何解决这个问题。