В Linux, как сказать, сколько используют процессы памяти?

Я думаю, что у меня может быть утечка памяти в моем приложении ЛАМПЫ (память привыкает, подкачка начинает привыкать, и т.д.). Если бы я видел, сколько памяти различные процессы используют, она могла бы помочь мне разрешить свою проблему. Существует ли способ для меня видеть, что эта информация в *отклоняет?

62
задан 4 October 2010 в 12:27

12 ответов

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

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 .

92
ответ дан 31 October 2019 в 13:06

Используйте

  • пикосекунда u 'pidof $TASKS_LIST' или пикосекунда u-C $TASK
  • пикосекунда xu - вид %mem
  • пикосекунда h-o pmem-C $TASK

Пример:

ps-of()
{
 ps u `pidof "$@"`
}

$ ps-of firefox
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const    18464  5.9  9.4 1190224 372496 ?      Sl   11:28   0:33 /usr/lib/firefox/firefox

$ alias ps-mem="ps xu --sort %mem | sed -e :a -e '1p;\$q;N;6,\$D;ba'"
$ ps-mem 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
const     3656  0.0  0.4 565728 18648 ?        Sl   Nov21   0:56 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon
const    11361  0.3  0.5 1054156 20372 ?       Sl   Nov25  43:50 /usr/bin/python /usr/bin/ubuntuone-control-panel-qt
const     3402  0.0  0.5 1415848 23328 ?       Sl   Nov21   1:16 nautilus -n
const     3577  2.3  2.0 1534020 79844 ?       Sl   Nov21 410:02 konsole
const    18464  6.6 12.7 1317832 501580 ?      Sl   11:28   1:34 /usr/lib/firefox/firefox

$ ps h -o pmem -C firefox
12.7
1
ответ дан 31 October 2019 в 13:06

Почему все эти сложные ответы с различными сценариями оболочки? Используйте htop, он автоматически изменяет размеры, и можно выбрать, какую информацию Вы хотите показанный, и он работает в терминале, таким образом, он не требует рабочего стола. Пример: htop-d8

2
ответ дан 31 October 2019 в 13:06

Можно использовать 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
ответ дан 31 October 2019 в 13:06

Используйте top или htop и обратите внимание на "RES" (резидентная емкость памяти) столбец.

4
ответ дан 31 October 2019 в 13:06

Инструмент, который Вы хотите, является PS Для получения информации о том, что делают программы Java:

ps -F -C java 

Для получения информации о http:

ps -F -C httpd

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

while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
4
ответ дан 31 October 2019 в 13:06

Более изящный подход:

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
7
ответ дан 31 October 2019 в 13:06

Можно использовать pmap для создания отчетов об использовании памяти.

Резюме:

pmap [ -x | -d ] [ -q ] pids... 
13
ответ дан 31 October 2019 в 13:06

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

ps ax | grep [process name]

И затем:

top -p PID

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

top -p PID1 -p PID2 
16
ответ дан 31 October 2019 в 13:06

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

[еще 113] информация может быть найдена с помощью "вершину человека"

35
ответ дан 31 October 2019 в 13:06

Я не знаю, почему ответ кажется настолько сложным... Кажется довольно простым сделать это с 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
46
ответ дан 31 October 2019 в 13:06

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

$ наблюдают 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 "=================";
6
ответ дан 31 October 2019 в 13:06

Другие вопросы по тегам:

Похожие вопросы: