操作系统都用分页机制来管理物理内存,操作系统将磁盘的一部分划出来作为虚拟内存,由于内存的速度要比磁盘快得多,所以操作系统要按照某种换页机制将不需要的页面换到磁盘中,将需要的页面调到内存中,由于内存持续不足,这个换页动作持续进行,kswapd0是虚拟内存管理中负责换页的,当服务器内存不足的时候kswapd0会执行换页操作,这个换页操作是十分消耗主机CPU资源的。
通过top发现该进程持续处于非睡眠状态,且运行时间较长,可以初步判定系统在持续的进行换页操作,可以将问题转向内存不足的原因来排查。
问题描述:kswapd0 进程占用了系统大量 CPU 资源。
处理办法:Linux 系统通过分页机制管理内存的同时,将磁盘的一部分划出来作为虚拟内存。而 kswapd0 是 Linux 系统虚拟内存管理中负责换页的进程。
当系统内存不足时,kswapd0 会频繁的进行换页操作。
而由于换页操作非常消耗 CPU 资源,所以会导致该进程持续占用较高 CPU 资源。
通常是由于系统在持续的进行换页操作所致。则可以通过 free 、ps 等指令进一步查询系统及系统内进程的内存占用情况,做进一步排查分析。
或者您可通过调整vm.swappiness 这个内核参数控制交换空间的大小。
/proc/sys/vm/swappiness
该参数从0到100,当该参数=0,表示只要有可能就尽力避免交换进程移出物理内存;该参数=100,这告诉内核最大化将数据移出物理内存移到swap缓存中。
您可尝试修改该参数进行核实下。
设置vm.swappiness=0 后并不代表禁用swap分区,只是告诉内核,能少用到swap分区就尽量少用到,设置vm.swappiness=100的话,则表示尽量使用swap分区。
在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快
#可以看到内存非常高
[root@VM_0_2_centos ~]# top
top - 21:01:16 up 20 days, 11:09, 1 user, load average: 2.29, 2.55, 2.69
Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie
%Cpu(s): 63.1 us, 1.1 sy, 0.0 ni, 35.2 id, 0.1 wa, 0.0 hi, 0.6 si, 0.0 st
KiB Mem : 8009440 total, 149276 free, 4821064 used, 3039100 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2816192 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13415 root 20 0 2432940 263452 752 S 199.7 3.3 8504:44 kswapd0
4953 root 20 0 6328844 26612 1720 S 50.0 0.3 70:08.88 tsm
查看参数值:
cat /proc/sys/vm/swappiness
临时调整
sysctl vm.swappiness=0 cat /proc/sys/vm/swappiness
永久调整
vim /etc/sysctl.conf #最后一行加上 vm.swappiness=0 #然后加载参数 sysctl -p
最后:
[root@VM_0_2_centos ~]# kill -9 13415
[root@VM_0_2_centos ~]#