linux下查詢程式佔用的記憶體方法總結

weixin_33806914發表於2015-12-15

linux下查詢程式佔用的記憶體方法總結

假設現在有一個「php-cgi」的程式 ,程式id為「25282」。現在想要查詢該程式佔用的記憶體大小。linux命令列
下有很多的工具進行檢視,現總結常見的幾種方式:

通過程式的 status

[root@web3_u ~]# cat /proc/25282/status
Name:    php-cgi
State:    S (sleeping)
Tgid:    25282
Pid:    25282
PPid:    27187
TracerPid:    0
Uid:    99    99    99    99
Gid:    99    99    99    99
Utrace:    0
FDSize:    256
Groups:    99
VmPeak:      496388 kB
VmSize:      438284 kB
VmLck:           0 kB
VmHWM:      125468 kB
VmRSS:      113612 kB
VmData:       92588 kB
VmStk:         100 kB
VmExe:        6736 kB
VmLib:       18760 kB
VmPTE:         528 kB
VmSwap:           0 kB
Threads:    1
SigQ:    0/46155
SigPnd:    0000000000000000
ShdPnd:    0000000000000000
SigBlk:    0000000000000000
SigIgn:    0000000000001000
SigCgt:    0000000184000004
CapInh:    0000000000000000
CapPrm:    0000000000000000
CapEff:    0000000000000000
CapBnd:    ffffffffffffffff
Cpus_allowed:    f
Cpus_allowed_list:    0-3
Mems_allowed:    00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:    0
voluntary_ctxt_switches:    68245
nonvoluntary_ctxt_switches:    15751

VmRSS: 113612 kB 表示佔用的實體記憶體

通過 pmap


[root@web3_u ~]# pmap -x 25282
25282:   /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000    6736    2692       0 r-x--  php-cgi
0000000000c93000     264     196     120 rw---  php-cgi
0000000000cd5000      60      48      48 rw---    [ anon ]
. . .
00007fd6226bc000       4       4       4 rw---  ld-2.12.so
00007fd6226bd000       4       4       4 rw---    [ anon ]
00007fff84b02000      96      96      96 rw---    [ stack ]
00007fff84bff000       4       4       0 r-x--    [ anon ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB          438284  113612  107960

關鍵資訊點

  • 程式ID

  • 啟動命令「/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf」

  • RSS :佔用的實體記憶體 113612KB

通過 smaps

[root@web3_u ~]# cat /proc/25282/smaps | grep '^Rss:' \
| awk '{sum +=$2} END{print sum}'
113612

求和得到實際佔用實體記憶體為 113612

通過 ps 命令

[root@web3_u ~]#  ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'  \
| awk '$1 ~ /25282/'
25282 php-cgi         /usr/local/php/bin/php-cgi   0.0 113612 438284 Oct09 nobody     99

awk 過濾 25282 程式號,得到第5列「rsz」的記憶體大小為「113612」

輸出php-cgi程式佔用的實體記憶體,並從高到低進行排序

[root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'  \
| grep php-cgi | sort -k5nr

輸出結果

23946 php-cgi         /usr/local/php/bin/php-cgi   0.0 129540 440000 Oct06 nobody     99
24418 php-cgi         /usr/local/php/bin/php-cgi   0.0 129336 437684 Oct06 nobody     99
18973 php-cgi         /usr/local/php/bin/php-cgi   0.0 129268 440176 Oct06 nobody     99
17219 php-cgi         /usr/local/php/bin/php-cgi   0.0 126588 439840 Oct06 nobody     99
 6996 php-cgi         /usr/local/php/bin/php-cgi   0.0 124876 438104 Oct09 nobody     99
23850 php-cgi         /usr/local/php/bin/php-cgi   0.0 122984 440036 Oct09 nobody     99
28310 php-cgi         /usr/local/php/bin/php-cgi   0.0 122920 436456 Oct09 nobody     99

其中rsz為實際記憶體,上例實現按記憶體排序,由大到小

TOP 命令輸出的列

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
25282 nobody    20   0  428m 110m  93m S  0.0  1.9   0:34.42 php-cgi

輸出列資訊

  • PID 25282

  • 使用者 nobody

  • 虛擬記憶體 428M

  • 實體記憶體 110M 110*1024= 112640 「和前面計算出來的值基本一致」

  • 共享記憶體 93M

  • 程式使用的實體記憶體和總記憶體的百分比 1.9 %

PID:程式的ID
USER:程式所有者
PR:程式的優先順序別,越小越優先被執行
NInice:值
VIRT:程式佔用的虛擬記憶體
RES:程式佔用的實體記憶體
SHR:程式使用的共享記憶體
S:程式的狀態。S表示休眠,R表示正在執行,Z表示僵死狀態,N表示該程式優先值為負數
%CPU:程式佔用CPU的使用率
%MEM:程式使用的實體記憶體和總記憶體的百分比
TIME+:該程式啟動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。
COMMAND:程式啟動命令名稱

按P

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16036 root      20   0 8902m 8.6g  480 R 100.0 36.6   0:33.15 redis-server
12934 root      20   0 8902m 8.6g 1072 S  5.5 36.6 285:37.81 redis-server
969 root      20   0     0    0    0 D  4.2  0.0 277:14.85 flush-252:16
1304 root      23   3 1689m  50m 3264 S  4.2  0.2   1445:03 xs-searchd
1294 root      20   0 14928  928  584 S  3.5  0.0 635:05.31 xs-indexd
1287 nobody    20   0 12884  772  576 S  2.8  0.0 833:11.42 dnsmasq
1302 root      23   3 1113m  39m 3244 S  0.7  0.2   1437:57 xs-searchd
4444 www       20   0  280m  43m  884 S  0.7  0.2  27:43.92 nginx
  1 root      20   0 19232 1160  868 S  0.0  0.0   0:06.75 init

按 P .表示按cpu排序,預設也是按cpu排序

按M

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
12934 root      20   0 8902m 8.6g 1072 S  6.0 36.6 285:39.77 redis-server
16036 root      20   0 8902m 8.6g  480 R 100.0 36.6   1:11.42 redis-server
1236 www       20   0 1053m 209m 6556 S  0.0  0.9   4:40.70 php-cgi
1231 www       20   0 1034m 146m 6536 S  0.0  0.6   4:20.82 php-cgi
1184 www       20   0 1043m 119m 6584 S  0.0  0.5   4:21.85 php-cgi

按M 。 表示按佔用記憶體排序。 第一列 redis伺服器佔用了8.6G的記憶體 。 這個記憶體和redis info

[root@img1_u ~]# redis-cli info memory
# Memory
used_memory_human:8.32G

基本相同。

[root@img1_u ~]# top -u www
top - 22:09:01 up 67 days, 14:16,  1 user,  load average: 0.61, 0.90, 0.98
Tasks: 283 total,   2 running, 281 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.9%us,  1.0%sy,  0.5%ni, 89.7%id,  4.6%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:  24542176k total, 21130060k used,  3412116k free,  1750652k buffers
Swap:   524280k total,        0k used,   524280k free,  4039732k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  681 www       20   0  855m  25m 5796 S  0.0  0.1   0:47.00 php-cgi
 1181 www       20   0  887m  57m 6484 S  0.0  0.2   4:41.66 php-cgi
 1183 www       20   0  864m  34m 6320 S  0.0  0.1   3:52.39 php-cgi
 1184 www       20   0 1043m 119m 6584 S  0.0  0.5   4:21.85 php-cgi
 1185 www       20   0  869m  39m 6376 S  0.0  0.2   3:57.84 php-cgi
 1186 www       20   0  886m  56m 6244 S  0.0  0.2   3:44.75 php-cgi
 1187 www       20   0  926m  66m 6480 S  0.0  0.3   4:16.12 php-cgi
 1188 www       20   0  890m  60m 6288 S  0.0  0.3   4:13.35 php-cgi
 1189 www       20   0  892m  62m 6408 S  0.0  0.3   4:06.60 php-cgi

-u 指定使用者。 php-cgi佔用的記憶體在60M左右

按程式消耗記憶體多少排序的方法

通過 ps 命令

第一種方法

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr

第二種方法

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz

輸出結果

[root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user' | sort -k5nr
23946 php-cgi         /usr/local/php/bin/php-cgi   0.0 129540 440000 Oct06 nobody
24418 php-cgi         /usr/local/php/bin/php-cgi   0.0 129336 437684 Oct06 nobody
18973 php-cgi         /usr/local/php/bin/php-cgi   0.0 129268 440176 Oct06 nobody
17219 php-cgi         /usr/local/php/bin/php-cgi   0.0 126588 439840 Oct06 nobody
 6996 php-cgi         /usr/local/php/bin/php-cgi   0.0 125056 438104 Oct09 nobody
23850 php-cgi         /usr/local/php/bin/php-cgi   0.0 122984 440036 Oct09 nobody

引數解析:

  • -e 顯示所有程式

  • -o 定製顯示資訊

  • pid 程式ID

  • comm 程式名

  • args 啟動命令

  • pcpu 佔用CPU 百分比

  • rsz 佔用實體記憶體大小

  • vsz 佔用虛擬記憶體大小

  • stime 程式啟動時間

  • user 啟動使用者

以第一行為例

  • 程式ID 23946

  • 程式名 php-cgi

  • 啟動命令 /usr/local/php/bin/php-cgi

  • 佔用CPU 0

  • 佔用實體記憶體 129540

  • 佔用虛擬記憶體 440000

  • 啟動時間 Oct06

  • 啟動使用者 nobody

ps 命令

通過 top 命令

top命令預設是以CPU排序輸出的,按字母「M」,可以按記憶體佔用大小進行排序顯示

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
23946 nobody    20   0  429m 126m 107m S  0.0  2.2   1:15.01 php-cgi
24418 nobody    20   0  427m 126m 109m S  0.0  2.2   1:19.56 php-cgi
18973 nobody    20   0  429m 126m 107m S  0.0  2.2   1:20.18 php-cgi
17219 nobody    20   0  429m 123m 104m S  0.0  2.1   1:23.60 php-cgi
6996 nobody    20   0  427m 122m 105m S  0.0  2.1   1:05.27 php-cgi
23850 nobody    20   0  429m 120m 101m S  0.0  2.1   1:02.43 php-cgi

輸出引數介紹

  • PID:程式的ID

  • USER:程式所有者

  • VIRT:程式佔用的虛擬記憶體

  • RES:程式佔用的實體記憶體

  • SHR:程式使用的共享記憶體

  • S:程式的狀態。S表示休眠,R表示正在執行,Z表示僵死狀態,N表示該程式優先值為負數

  • %CPU:程式佔用CPU的使用率

  • %MEM:程式使用的實體記憶體和總記憶體的百分比

  • TIME+:該程式啟動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。

通過比較程式ID 「23946」,top 命令和 ps 命令輸出的結果基本保持一致

相關文章