列出swap交换内存中的服务详情

来自:互联网
时间:2020-03-18
阅读:

在Linux中服务内存占用比较常用的命令是top -p 进程号ps -aux | grep 进程名cat /proc/进程号/status 三种方式,相信大家都对跑在swap交换内存的服务和占用比较感兴趣,无意间在网上发现一个脚本,试了一下很好用,分享出来。

列出swap交换内存中的服务详情

脚本主要列出swap交换内存的服务名称/PID/交换内存占用


#!/bin/bash

SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null | awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
if (( $SUM > 0 )); then
echo "PID=$PID swapped $SUM KB ($PROGNAME)"
fi
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "Overall swap used: $OVERALL KB"


显示效果如下:


[root@HKcdn001 ~]# ./s.sh 
PID=1 swapped 264 KB (systemd)
PID=1280 swapped 188 KB (systemd-journal)
PID=1303 swapped 312 KB (lvmetad)
PID=1316 swapped 996 KB (systemd-udevd)
PID=2427 swapped 336 KB (auditd)
PID=2451 swapped 3908 KB (polkitd)
PID=2452 swapped 276 KB (dbus-daemon)
PID=2453 swapped 560 KB (ntpd)
PID=2455 swapped 124 KB (lsmd)
PID=2459 swapped 152 KB (systemd-logind)
PID=2460 swapped 136 KB (acpid)
PID=2648 swapped 516 KB (crond)
PID=2649 swapped 188 KB (atd)
PID=2837 swapped 2372 KB (tuned)
PID=2838 swapped 872 KB (sshd)
PID=2841 swapped 184 KB (rsyslogd)
Overall swap used: 11384 KB

这个命令也比较好玩:cat /proc/进程号/status



[root@HKcdn001 ~]# ps -ef |grep varnish
root     20741 20162  0 23:42 pts/0    00:00:00 grep --color=auto varnish
varnish  24263     1  0 Jun11 ?        00:00:26 /usr/sbin/varnishd -a 10.144.84.134:6081 -f /etc/varnish/default.vcl -s malloc,512m
varnish  24273 24263  0 Jun11 ?        00:03:17 /usr/sbin/varnishd -a 10.144.84.134:6081 -f /etc/varnish/default.vcl -s malloc,512m


[root@HKcdn001 ~]# cat /proc/24263/status
Name:	varnishd
Umask:	0022
State:	S (sleeping)
Tgid:	24263
Ngid:	0
Pid:	24263
PPid:	1
TracerPid:	0
Uid:	0	994	0	994
Gid:	0	993	0	993
FDSize:	64
Groups:	
VmPeak:	   34092 kB
VmSize:	   34092 kB
VmLck:	      88 kB
VmPin:	       0 kB
VmHWM:	    1792 kB
VmRSS:	    1404 kB
RssAnon:	     400 kB
RssFile:	    1004 kB
RssShmem:	       0 kB
VmData:	    8312 kB
VmStk:	     132 kB
VmExe:	    1132 kB
VmLib:	    3840 kB
VmPTE:	      80 kB
VmSwap:	       0 kB
Threads:	1
SigQ:	0/3883
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000001001
SigCgt:	0000000180004002
CapInh:	0000000000000000
CapPrm:	0000001fffffffff
CapEff:	0000000000000000
CapBnd:	0000001fffffffff
CapAmb:	0000000000000000
Seccomp:	0
Speculation_Store_Bypass:	vulnerable
Cpus_allowed:	1
Cpus_allowed_list:	0
Mems_allowed:	00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_Switches:	704208
nonvoluntary_ctxt_switches:	14

###参数说明:


VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页 
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm) 
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss) 
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm) 
VmStk(KB) 任务在用户态的栈的大小 (stack_vm) 
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code) 
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib) 
VmPTE 该进程的所有页表的大小,单位:kb 
Threads 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符

1、VmRSS是真实正在占用的内存,而VmData是虚拟内存,大小差异大并没有什么问题。 
2、VmData是指数据段的内存大小,存放初始化了的数据; (total_vm-shared_vm-stack_vm) 
3、不调动态库的时候是不计算的(dlopen方式) 
4、静态库会编译为程序本身的一部分,不在VmLib的统计之内。 
5、参考上面的说明 
6、除非有非常明显的内存泄露,如内存一直大幅度增长并长时间不释放,否则单纯以来这些值是很判断真正的内在泄露。
返回顶部
顶部