В Linux, как узнать, сколько процессов памяти используют? - PullRequest
58 голосов
/ 04 октября 2010

Я думаю, что у меня может быть утечка памяти в моем приложении LAMP (память израсходована, своп начинает привыкать и т. Д.).Если бы я мог видеть, сколько памяти используют различные процессы, это могло бы помочь мне решить мою проблему.Есть ли способ увидеть эту информацию в * nix?

Ответы [ 13 ]

91 голосов
/ 04 октября 2010

Правильное использование памяти сложнее, чем можно подумать. Лучший способ, который я смог найти, это :

echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc

Где «ПРОЦЕСС» - это имя процесса, который вы хотите проверить, а «ТИП» - один из:

  • Rss: использование резидентной памяти, вся память, используемая процессом, включая всю память, которую этот процесс делит с другими процессами. Не включает своп;
  • Shared: память, которую этот процесс делит с другими процессами;
  • Private: частная память, используемая этим процессом, вы можете найти утечки памяти здесь;
  • Swap: память подкачки, используемая процессом;
  • Pss: Размер пропорционального набора, хороший показатель общего объема памяти. Это Rss, скорректированное на совместное использование: если процесс имеет частное 1 МБ и 20 МБ, совместно используемое другими 10 процессами, Pss составляет 1 + 20/10 = 3 МБ

Другие допустимые значения: Size (т. Е. Виртуальный размер, который почти не имеет смысла) и Referenced (объем памяти, в настоящее время помеченный как ссылка или доступ к которому).

Вы можете использовать watch или какой-либо другой bash-script-fu, чтобы следить за этими значениями для процессов, которые вы хотите отслеживать.

Для получения дополнительной информации о smaps: http://www.kernel.org/doc/Documentation/filesystems/proc.txt.

44 голосов
/ 29 ноября 2013

Я не знаю, почему ответ кажется таким сложным ... Это довольно просто сделать с помощью ps:

mem()
{                                                                                                      
    ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i $@ | awk '{printf $1/1024 "MB"; $1=""; print }'
}

Пример использования:

$ mem mysql
0.511719MB 781 root /bin/sh /usr/bin/mysqld_safe
0.511719MB 1124 root logger -t mysqld -p daemon.error
2.53516MB 1123 mysql /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
34 голосов
/ 04 октября 2010

Используйте ps, чтобы найти идентификатор процесса для приложения, затем используйте top -p1010 (замените 1010 на реальный идентификатор процесса). Столбец RES - это используемая физическая память, а столбец VIRT - используемая виртуальная память, включая библиотеки и подкачанную память.

Более подробную информацию можно найти, используя "man top"

15 голосов
/ 16 апреля 2013

Сначала получите pid:

ps ax | grep [process name]

А потом:

top -p PID

Вы можете смотреть различные процессы одновременно:

top -p PID1 -p PID2 
13 голосов
/ 19 декабря 2012

Вы можете использовать pmap , чтобы сообщить об использовании памяти.

Сводка:

pmap [ -x | -d ] [ -q ] pids... 
7 голосов
/ 04 июня 2014

Более элегантный подход:

echo "Memory usage for PID <>:"; for mem in {Private,Rss,Shared,Swap,Pss};do grep $mem /proc/<pid>/smaps | awk -v mem_type="$mem" '{i=i+$2} END {print mem_type,"memory usage:"i}' ;done
6 голосов
/ 28 июля 2011

Спасибо.Я использовал это для создания этого простого сценария bash, который можно использовать для наблюдения за процессом и его использованием памяти:

$ watch watchmypid.sh

#!/bin/bash
#

PROCESSNAME=changethistoyourprocessname
MYPID=`pidof $PROCESSNAME`

echo "=======";
echo PID:$MYPID
echo "--------"
Rss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Rss | awk '{print $2}' | sed 's#^#+#') | bc;`
Shared=`echo 0 $(cat /proc/$MYPID/smaps  | grep Shared | awk '{print $2}' | sed 's#^#+#') | bc;`
Private=`echo 0 $(cat /proc/$MYPID/smaps  | grep Private | awk '{print $2}' | sed 's#^#+#') | bc;`
Swap=`echo 0 $(cat /proc/$MYPID/smaps  | grep Swap | awk '{print $2}' | sed 's#^#+#') | bc;`
Pss=`echo 0 $(cat /proc/$MYPID/smaps  | grep Pss | awk '{print $2}' | sed 's#^#+#') | bc;`

Mem=`echo "$Rss + $Shared + $Private + $Swap + $Pss"|bc -l`

echo "Rss     " $Rss
echo "Shared  " $Shared
echo "Private " $Private
echo "Swap    " $Swap
echo "Pss     " $Pss
echo "=================";
echo "Mem     " $Mem
echo "=================";
4 голосов
/ 23 марта 2017

Если у вас нет текущего или длительного процесса для отслеживания, вы можете использовать /usr/bin/time.

Это не то же самое, что Bash time (как вы увидите).

Например,

# /usr/bin/time -f "%M" echo

2028

Это "Максимальный размер резидентного набора процесса за время его жизни, в килобайтах" (цитируется со страницы руководства).То есть, так же, как RES в top и др.

Вы можете получить намного больше от /usr/bin/time.

# /usr/bin/time -v echo

Command being timed: "echo"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1988
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 77
Voluntary context switches: 1
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
4 голосов
/ 17 сентября 2013

Вы можете использовать pmap + awk.

Скорее всего, нас интересует память RSS, которая является 3-м столбцом в последней строке примера вывода pmap ниже(82564).

$ pmap -x <pid>

Address           Kbytes     RSS   Dirty Mode   Mapping

....

00007f9caf3e7000       4       4       4 r----  ld-2.17.so
00007f9caf3e8000       8       8       8 rw---  ld-2.17.so
00007fffe8931000     132      12      12 rw---    [ stack ]
00007fffe89fe000       8       8       0 r-x--    [ anon ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB          688584   82564    9592

Затем для извлечения этого значения используется Awk.

$ pmap -x <pid> | awk '/total/ { print $4 "K" }'

Значения pmap даны в килобайтах.Если бы мы хотели это в мегабайтах, мы могли бы сделать что-то вроде этого.

$ pmap -x <pid> | awk '/total/ { print $4 / 1024 "M" }'
4 голосов
/ 18 декабря 2012

Инструмент, который вы хотите, это пс.Чтобы получить информацию о том, что делают Java-программы:

ps -F -C java 

Чтобы получить информацию о http:

ps -F -C httpd

Если ваша программа заканчивается до того, как вы получите возможность ее запустить, откройтетерминал и пробег:

while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...