在Linux系统中,当我们想查看系统内存使用情况的时候,可能首先会想到“free”。查看内存的整体使用情况,“free”命令可以胜任,如果要查看某个指定进程的内存占用,可以选择使用“top”或它的升级版命令“htop”,但你会发现这些命令显示的结果都不直观。比如下面这样:
htop命令显示
难道有这么多进程都占用了101G“RES”内存吗?显示不是的,这样的话251GB内存早都撑爆了,这里显示的PID都是线程(可以使用“pstree”命令查看进程和线程的关系图)。再进一步,查看指定进程对“swap”空间的占用情况,这时上面给出的命令就有点力不从心了。
好了,主角“smem”命令登场
“smem”可以直观简洁的显示进程(不是线程)对内存和“swap”空间的占用情况。比如,对进程按对内存的占用大小从高往低排序,仅显示前5个:
aneirin@host-1:~$ sudo smem -r -k | head -6 PID User Command Swap USS PSS RSS 3752 presto java -cp /home/presto/prest 0 101.9G 101.9G 102.0G 85199 hbase /usr/lib/jvm/java-8-openjdk 7.7G 13.8G 13.8G 13.8G 77009 hdfs j -Dproc_datanode - 86.8M 12.5G 12.6G 12.6G 139749 clickhouse /usr/bin/clickhouse-server 6.7G 5.6G 5.6G 5.6G 81533 yarn /usr/lib/jvm/java-8-openjdk 207.2M 2.7G 2.7G 2.7G
核心参数解释:
USS:Unique Set Size,进程的非共享(Unshared memory)内存占用
PSS:Proportional Set Size,上面的USS加上进程在共享内存中占用的部分
RSS:Resident set size,进程对物理内存的占用,这个值加上“Swap”中的值(被交换到外部文件系统的数据)就是进程整体的内存占用情况
使用“smem”命令可以非常快速的找到占用内存最多的进程,从而在内存吃紧时,对进程做出调整。
工作中常会收到“Swap”空间占用过大导致的告警,使用下面命令让惹祸的进程无处藏身:
sudo smem -s swap -r -k | head -10
注意,如果不使用“sudo”命令仅显示自己创建的进程内存使用情况。
希望这篇文档能帮到正在努力的你,欢迎关注和评论!