在Linux中服务内存占用比较常用的命令是top -p 进程号
、ps -aux | grep 进程名
、cat /proc/进程号/status
三种方式,相信大家都对跑在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、除非有非常明显的内存泄露,如内存一直大幅度增长并长时间不释放,否则单纯以来这些值是很判断真正的内在泄露。