你可能没有好好用过top命令(2)

你可能没有好好用过top命令(2)

你可能没有好好用过top命令(1)中,我们介绍了top命令的基本知识,你已经可以基本上了解了top的主要结构和默认输出的指标,这一节的内容,我们进行一些拓展,看看top还能获取哪些有用且非常关键的信息。

一、我的进程到底消耗多少内存

通过 top -mc 将返回如下结果

你可能没有好好用过top命令(2)

这里增加了 -mc参数后,额外返回了以下内容:

  • -m: 使用USED 替换了VIRT,这里USED=进程物理内存占用+SWAP占用,相当于进程对物理内存的占用,对于排查进程是否存在内存溢出,占用是否过高非常有意义
  • -c:在COMMAND处,直接显示了该进程的部分运行命令信息,方便迅速定位进程用途

二、哪个进程占用了系统SWAP空间

当我们的系统大量使用了SWAP时,需要对消耗SWAP的进程进行排查 使用的方法是:

1.将每个进程的SWAP占用情况显示出来,执行top之后按f->p->Enter ,SWAP将会出现在COMMAND列之前

2.将显示结果按照SWAP进行排序,按F->p->Enter,输出结果将按照SWAP进行排序,将消耗最大的进程放在第一列

你可能没有好好用过top命令(2)

在这个案例中,可以看到PID为10121的java进程消耗了45MB的SWAP空间。

这里有些同学一定遇到过,实际服务器还有大量内存剩余,但为什么还是使用了大量SWAP空间呢。

那么你需要排查以下两点:

  • 内核参数vm.swappiness,默认为60,使用sysctl -a|grep swappiness可获取该值,意思是在进程在申请内存时,系统将内存分配到swap的积极性。一般建议修改为1,让操作系统尽量不适用swap。 修改方式: 在/etc/sysctl.conf文件中增加vm.swappiness=1,使用sysctl -p使配置生效。 注意:修改只对之后的内存申请有效,所以没办法释放已经分配在swap中的内存,可以使用进程重启的方式进行释放。
  • numactl –hardware,查看内存bind的情况,这涉及到SMP/NUMA架构,已远超过本主题要讨论的范围,大家可以自行查询相关知识,解决方法可以通过调整BIOS,不再使用NUMA架构,或者使用在启动进程时,增加numactl –interleave=all的方式,避免NUMA架构带来的进程使用SWAP的问题。

仔细思考,你一定会有所收获。

欢迎关注:云架构那些事儿,专注实用性云架构分享与IT技术分享。

你可能没有好好用过top命令(2)


分享到:


相關文章: