Я думаю, что у меня может быть утечка памяти в моем приложении LAMP (память израсходована, swap начинает привыкать и т.д.). Если бы я мог видеть, сколько памяти используют различные процессы, это может помочь мне решить мою проблему. Есть ли способ увидеть эту информацию в * nix?
В Linux, как определить, сколько процессов памяти используется?
Ответ 1
Получение правильного использования памяти сложнее, чем можно подумать. Лучший способ, которым я мог найти::
echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
Где "ПРОЦЕСС" - это имя процесса, который вы хотите проверить, и "ТИП" является одним из:
-
Rss
: использование резидентной памяти, вся память, которую использует процесс, включая всю память, которую этот процесс разделяет с другими процессами. Он не включает swap; -
Shared
: память, которую этот процесс разделяет с другими процессами; -
Private
: частная память, используемая этим процессом, вы можете искать здесь утечки памяти; -
Swap
: память подкачки, используемая процессом; -
Pss
: Пропорциональный размер набора, хороший общий индикатор памяти. Это Rss настроено для совместного использования: если процесс имеет 1MiB private и 20MiB, разделяемый между 10 другими процессами, Pss равен 1 + 20/10 = 3MiB
Другие допустимые значения: Size
(т.е. виртуальный размер, что почти бессмысленно) и Referenced
(объем памяти, отмеченный в данный момент как ссылка или доступ).
Вы можете использовать watch
или некоторые другие bash - script -fu, чтобы следить за этими значениями для процессов, которые вы хотите контролировать.
Для получения дополнительной информации о smaps
: http://www.kernel.org/doc/Documentation/filesystems/proc.txt.
Ответ 2
Используйте ps
, чтобы найти идентификатор процесса для приложения, затем используйте top -p1010
(замените 1010 для реального идентификатора процесса).
Столбец RES - это используемая физическая память, а столбец VIRT - используемая виртуальная память - включая библиотеки и измененную память.
Более подробную информацию можно найти, используя "man top"
Ответ 3
Я не знаю, почему ответ кажется таким сложным... Кажется, это довольно просто сделать с помощью 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
Ответ 4
Вы можете использовать pmap для отчета об использовании памяти.
Описание:
pmap [ -x | -d ] [ -q ] pids...
Ответ 5
Сначала получите pid:
ps ax | grep [process name]
И затем:
top -p PID
Вы можете смотреть различные процессы в одно и то же время:
top -p PID1 -p PID2
Ответ 6
Спасибо. Я использовал это для создания этого простого bash script, который можно использовать для просмотра процесса и использования его памяти:
$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 "=================";
Ответ 7
Более элегантный подход:
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
Ответ 8
Используйте top
или htop
и обратите внимание на столбец "RES" (резидентная память).
Ответ 9
Инструмент, который вам нужен, - ps. Чтобы получить информацию о том, что делают java-программы:
ps -F -C java
Чтобы получить информацию о http:
ps -F -C httpd
Если ваша программа заканчивается, прежде чем вы получите возможность ее запуска, откройте другой терминал и запустите:
while true; do ps -F -C myCoolCode ; sleep 0.5s ; done
Ответ 10
Вы можете использовать pmap
+ awk
.
Скорее всего, нас интересует память RSS
, которая является третьим столбцом в последней строке примера 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" }'
Ответ 11
Почему все эти сложные ответы с различными сценариями оболочки? Используйте htop, он автоматически изменяет размеры и вы можете выбрать, какую информацию вы хотите показать, и она работает в терминале, поэтому для нее не требуется рабочий стол. Пример: htop -d8
Ответ 12
Если у вас нет текущего или длительного процесса для отслеживания, вы можете использовать /usr/bin/time
.
Это не то же самое, что Bash time
(как вы увидите).
Например,
# /usr/bin/time -f "%M" echo
2028
Это "Максимальный размер резидентного набора для процесса в течение его жизни, в Kilobytes" (цитируется на странице руководства). То есть, как 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
Ответ 13
Используйте
- ps u `pidof $TASKS_LIST` или ps u -C $TASK
- ps xu --sort% mem
- ps 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