1. 程式人生 > >linux如何查詢程序佔用的記憶體

linux如何查詢程序佔用的記憶體

1. ps aux命令

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

lizhibin  32986  0.0 13.8 916276 534748 ?       Ssl  10:12   0:00 /usr/local/php_5.4.45/bin/php -c /usr/local/php_5.4.45/etc/php-swoole.ini /www/service.gamechat.37.com/server.php

lizhibin  32988  0.0 13.8 768812 534272 ?       S    10:12   0:00 /usr/local/php_5.4.45/bin/php -c /usr/local/php_5.4.45/etc/php-swoole.ini /www/service.gamechat.37.com/server.php

lizhibin  32993  0.0 13.8 764704 534752 ?       S    10:12   0:00 /usr/local/php_5.4.45/bin/php -c /usr/local/php_5.4.45/etc/php-swoole.ini /www/service.gamechat.37.com/server.php

lizhibin  32994  0.0 13.8 764704 534752 ?       S    10:12   0:00 /usr/local/php_5.4.45/bin/php -c /usr/local/php_5.4.45/etc/php-swoole.ini /www/service.gamechat.37.com/server.php

lizhibin  32995  0.0 13.8 764704 534752 ?       S    10:12   0:00 /usr/local/php_5.4.45/bin/php -c /usr/local/php_5.4.45/etc/php-swoole.ini /www/service.gamechat.37.com/server.php

lizhibin  32996  0.0 13.8 764704 534752 ?       S    10:12   0:00 /usr/local/php_5.4.45/bin/php -c /usr/local/php_5.4.45/etc/php-swoole.ini /www/service.gamechat.37.com/server.php

VSZ:表示程序佔用多少虛擬記憶體(kb)

RSS:表示程序佔用多少實體記憶體(kb)

我們來簡化一下命令:

ps aux | grep swoole | grep -v grep | awk -F ' ' '{print $5,$6}'

916276 534748

768812 534272

764704 534752

764704 534752

764704 534752

764704 534752

可以看到每個swoole的程序佔用了月500+MB的實體記憶體。

2.使用pmap命令

pmap -d 32988

32988:   /usr/local/php_5.4.45/bin/php -c /usr/local/php_5.4.45/etc/php-swoole.ini /www/service.gamechat.37.com/server.php

Address           Kbytes Mode  Offset           Device    Mapping

0000000000400000   10272 r-x-- 0000000000000000 0fd:00000 php

0000000001007000       4 r---- 0000000000a07000 0fd:00000 php

0000000001008000      60 rw--- 0000000000a08000 0fd:00000 php

0000000001017000     140 rw--- 0000000000000000 000:00000   [ anon ]

0000000002a69000  301936 rw--- 0000000000000000 000:00000   [ anon ]

00007fcec91e4000  224380 rw--- 0000000000000000 000:00000   [ anon ]

命令輸出第一行:執行程式以及引數。

Address: 記憶體開始地址

Kbytes: 佔用記憶體的位元組數(KB)

RSS: 保留記憶體的位元組數(KB)

Dirty: 髒頁的位元組數(包括共享和私有的)(KB)

Mode: 記憶體的許可權:read、write、execute、shared、private (寫時複製)

Mapping: 佔用記憶體的檔案、或[anon](分配的記憶體)、或[stack](堆疊)

Offset: 檔案偏移

Device: 裝置名 (major:minor)

我們使用awk命令,計算Kbytes列的和

pmap -dq 32988 | awk -F ' ' 'BEGIN{sum=0}{sum+=$2}END{print sum}'

結果輸出:768812KB,這個結果是ps命令中的虛擬記憶體大小。接下來過濾掉so的共享記憶體。

pmap -dq 32988 | awk -F ' ' 'BEGIN{sum=0}{if($6!~/\.so/)sum+=$2}END{print sum}'

結果輸出:672284KB,和ps命令得出的實體記憶體資料不同。對命令進行調整:

pmap -dq 32988 | awk -F ' ' 'BEGIN{sum=0}{if($6~/\[/)sum+=$2}END{print sum}'

結果輸出:539684KB,和ps命令得出的實體記憶體已經比較接近了。上面的命令,主要統計出程序[ anon ]、[ stack ]所佔用的記憶體(堆疊)