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

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

Ответы на вопрос(13)

почему ответ кажется таким сложным ... Кажется, довольно просто сделать это сps:

mem()
{                                                                                                      
    ps -eo rss,pid,euser,args:100 --sort %mem | grep -v grep | grep -i [email protected] | 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
 rogerdpack02 мая 2018 г., 18:51
"кажется довольно простым" ... понял ...
 watzon21 окт. 2017 г., 02:01
Удивительное использование функции. Добавил этот в мой.zshrc
 THESorcerer27 февр. 2018 г., 22:04
это ответ, не знаю, почему другой был помечен как правильный, все, что я получаю от него, это результат "0", этот показывает точно, что мне нужно ...Благодарю вас
 AlexT16 февр. 2018 г., 06:13
Удобная функция. Стоит отметить, чтоrss Столбец, используемый для расчета (Resident Set Size), включает в себя память из общих библиотек, поэтому скину числа. В моем случае процессы использовали больше памяти, чем было доступно системе.

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

$ 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 "=================";
 Timothée Groleau24 июн. 2013 г., 05:47
скорее всего потому, что скрипт вычисляет данные за 5 проходов файла smaps. Должно быть достаточно просто, чтобы awk выполнял разбор и вычисления за один проход.
 Sonny17 мая 2012 г., 18:19
Почему это было отвергнуто? Это кажется вполне приемлемым!
 erm3nda22 мая 2015 г., 09:10
@ TimothéeGroleau Согласитесь, с awk к производительности, в любом случае, сценарий выглядит круто, и кто-то может извлечь из него уроки. Может быть, Пол Рубинштейн хочет обновить свой сценарий: D. Благодарю.
Решение Вопроса

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

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.

 Anup Ash21 окт. 2016 г., 17:38
Верх улучшенияps -ef | grep -i $NAME_OF_PROCESS | grep -v grep | gawk '{print "-p "$2 }'
 A. Binzxxxxxx11 июл. 2017 г., 11:41
Вам не нужно суммировать его, в большинстве случаев его суммируют для вас / proc / [pid] / status
 Giuseppe Cardone20 мар. 2015 г., 18:59
Брайан: хорошая идея, я обновил пост
 Glen Solsberry28 нояб. 2017 г., 17:43
Почему бы не сделать все это вawk вместо того, чтобы перейти кbc? awk 'BEGIN { used=0 }; /TYPE/ { used += $2 } END { print used }' /proc/PID/smaps даст вам размер в КБ.
 UtahJarhead08 февр. 2016 г., 22:44
Если вы замените:`pidof PROCESS` с фактическим PID, он будет проверять использование оперативной памяти одного процесса.
 zwol17 сент. 2013 г., 18:44
Спустя годы, и, вероятно, уже не актуально, но фактическое распределение памяти всегда кратно физическому размеру страницы, который в современных системах всегда кратен 1024 байтам. Так что просто умножьте размер в КБ на 1024 для байтов; ошибки округления нет. (Ядро в большинстве случаев не заразилось болезнью iB: если нет явных доказательств обратного, предположим, что K = 1024, а не 1000.)
 Calmarius28 авг. 2015 г., 19:42
Он не работает, когда запущено несколько экземпляров одной и той же программы (например, Chrome).
 Matt Phillips20 июн. 2013 г., 03:56
Это потрясающе, однако похоже, что оно возвращает память в килобайтах (в любом случае для Rss и Private). Вы знаете, как получить память в байтах?
 ylluminate14 июн. 2014 г., 00:39
Какой будет «общая» память, используемая для сценария, такого как этот:gist.github.com/9bbd0ce953143b67c038 ?
 Bryan09 мар. 2015 г., 16:38
Вы можете сделать cat + grep + awk + sed просто с помощью awk:echo 0 $(sudo awk '/TYPE/ {print "+", $2}' /proc/PID/smaps) | bc

вы можете использовать/usr/bin/time.

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

Например

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

2028

Это «Максимальный размер резидентного набора процесса за время его жизни, в килобайтах» (цитируется на странице руководства). То есть так же, как ВИЭ в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
 voxobscuro16 июл. 2018 г., 18:09
Macos / usr / bin / time не способен на этот уровень анализа, но homebrew действительно обеспечивает правильную полезность черезgnu-time пакет. Устанавливает утилиту под названиемgtime который делает то, о чем ты говоришь.

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

 UtahJarhead08 февр. 2016 г., 22:45
Большинство людей, использующих командную строку, заинтересованы в том, чтобы понять это программно. В некоторых случаях они просто хотят научиться понимать это, используя ядро ​​вместо процесса предварительной сборки.

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

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

 AAAfarmclub22 авг. 2015 г., 23:50
$ top -p $ (pgrep <имя вашего процесса> | xargs | tr '' ',')
 StackOverflowNewbie04 окт. 2010 г., 10:56
к тому времени, когда я смогу выполнить top -pXXXX, процесс уже завершен. Итак, я ничего не получаю. Предложения?
 Gunther Piez04 окт. 2010 г., 12:15
Относительно "VIRT": размер виртуального образа почти для всех практических целей ничего не говорит - почти каждая система Linux настроена на перегрузку памяти, а многие приложения фактически перегружены.
 Trevor Boyd Smith06 авг. 2013 г., 17:28
Вот одна строка, которая позволяет вам указать имя процесса (предполагается, что существует только один процесс, который соответствует имени):top -p`ps -ef | grep -i $NAME_OF_PROCESS | grep -v grep | gawk '{print $2}'`

ps u `pidof $ TASKS_LIST` или жеps u -C $ TASKps xu - сортировать% memps h -o pmem -C $ TASK

Пример:

ps-of()
{
 ps u `pidof "[email protected]"`
}

$ 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

top или жеhtop и обратите внимание на столбец «RES» (размер резидентной памяти).

 StackOverflowNewbie04 окт. 2010 г., 10:57
Я вижу RES, но я не думаю, что мне это нужно. Мой подержанный Мем и подержанный своп продолжают расти. Мне нужно знать, что заставляет их идти вверх. Идеи?
 Gunther Piez04 окт. 2010 г., 12:12
Резидентная память - это память, используемая вашими процессами. Если ни один из процессов не использует много памяти, несмотря на увеличение общего объема используемой памяти, память может использоваться только ядром. Попробуйте отсортировать после столбца RES. Другой момент, возможно, слишком высокая перестановка, когда у вас тяжелый дисковый ввод-вывод.

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

ps -F -C java 

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

ps -F -C httpd

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

while true; do ps -F -C myCoolCode ; sleep 0.5s ; done

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" }'

ртар сообщить об использовании памяти.

Сводка:

pmap [ -x | -d ] [ -q ] pids... 
 TiCPU28 февр. 2016 г., 22:42
Хороший, вот пример использования:pmap $(pgrep -f -u username /usr/bin/gnome-shell) | sed -n -e 's/ total \+//p' | numfmt --from=iec 1724678144

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

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

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

ps ax | grep [process name]

А потом:

top -p PID

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

top -p PID1 -p PID2 

Ваш ответ на вопрос