今天发现一起swap过高的问题,最后定位到有三个进程(同属于一个父进程)占用cpu达到100%。虽然最后没有得到厂家回复,不敢轻易杀死进程,但是整个过程值得分享一下,算是排查思路。
swap过高,即是物理内存不足时,使用交换分区(Swap Space)的虚拟内存。这对这个现象笔者第一时间是使用free -h(free -m)指令来查看物理内存和虚拟内存的使用情况。也可以参考笔者以前的文章-Linux 下的 60 秒分析的检查清单,一步步检查。检查发现16G的物理内存,buff/cache占了14G,可用内存只有300多M,虽然如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来响应内存请求。但是这不是一个正常的现象, swap正常应该是零。
考虑到这台linux服务器是trace日志机,需要保存日志或查询日志,频繁的文件访问(特别是数据备份、大文件操作等等)会导致系统的Cache使用量大增。于是笔者查看服务器的定时任务,没有定时清理缓存的脚本,于是笔者手动将缓存清理了。参考文章-让Linux系统保持活力的优化脚本。脚本如下:
clear_ buffcache.sh:
#!/bin/bash
#运行 sync 将脏页的内容写回硬盘,防止数据丢失
/usr/bin/sudo /usr/bin/sync
/usr/bin/sudo /sbin/sysctl vm.drop_caches=3
清理缓存后,再次使用free -h查看,缓存释放到4G。但是过了一会,buff/cache又在慢慢增加,大概一个钟后可用内存又只有300多M,可用通过“vmstat 1”指令来查看虚拟内存统计。说明buff/cache并不是累计下来的,而是有进程有问题。
然后笔者运行万能的top指令,实时显示 process 的动态。load average中最近1分钟的,最近5分钟的,最近15分钟的平均负载达到2.8-2.9之间,影响负载高低主要是 CPU使用、内存使用、IO消耗三部分构成。查看cpu信息, cat /proc/cpuinfo,服务器是2个物理处理器,每个处理器10核,超线程就是40核,2.8-2.9就说明有快三个核被占满了。查看top下半部分的process项目,确实有三个进程占用cpu超过100%,在top界面下按下1会显示40个核的具体使用信息。
定位到三个进程的原因导致 CPU使用过高,最后还是使用 iostat 来排除磁盘IO问题。定位到这三个进程,使用ps -ef查看进程信息,这三个进程长时间没有自动释放,因为不知道进程的作用和原理,也不敢轻易杀死进程。但是笔者怀疑是不是三个相同进程抢夺资源导致的 CPU内存较高呢,待解决之后才分享探讨吧。
2021年3月31日,厂家排查为调试遗留进程,杀死删除后恢复正常。但是free指令查看后可用内存还是只剩300多M,估计是杀死进程后buff/cache没有释放的原因,用上面的脚本清除缓存后,过了一段时间后缓存稳定在8G左右,对于16G的内存来说可以接受。但是建议日志服务器定时清理一下缓存,特别是操作大文件,比如24小时后日志gzip打包处理等等。
网友评论