Как увидеть топ процессы отсортированы по фактическому использованию памяти?
У меня есть сервер с 12G памяти. Фрагмент вершины показан ниже:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12979 frank 20 0 206m 21m 12m S 11 0.2 26667:24 krfb
13 root 15 -5 0 0 0 S 1 0.0 36:25.04 ksoftirqd/3
59 root 15 -5 0 0 0 S 0 0.0 4:53.00 ata/2
2155 root 20 0 662m 37m 8364 S 0 0.3 338:10.25 Xorg
4560 frank 20 0 8672 1300 852 R 0 0.0 0:00.03 top
12981 frank 20 0 987m 27m 15m S 0 0.2 45:10.82 amarok
24908 frank 20 0 16648 708 548 S 0 0.0 2:08.84 wrapper
1 root 20 0 8072 608 572 S 0 0.0 0:47.36 init
2 root 15 -5 0 0 0 S 0 0.0 0:00.00 kthreadd
free -m
показывает следующее:
total used free shared buffers cached
Mem: 12038 11676 362 0 599 9745
-/+ buffers/cache: 1331 10706
Swap: 2204 257 1946
Если я правильно понимаю, система имеет только 362 МБ доступной памяти. Мой вопрос: как я могу узнать, какой процесс потребляет большую часть памяти?
Так же, как справочная информация, система работает под управлением 64bit OpenSuse 12
.
Ответы
Ответ 1
Во-первых, повторите эту мантру немного: "неиспользуемая память - это потерянная память". Ядро Linux хранит огромное количество метаданных и файлов файлов, которые были запрошены, до тех пор, пока что более важное значение не вытеснит эти данные. Это почему вы можете запустить:
find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'
и второй экземпляр find
запускается со смешной скоростью.
Linux оставляет лишь немного свободной памяти для обработки всплесков в использовании памяти без особых усилий.
Во-вторых, вы хотите найти процессы, которые едят всю вашу память; в top
используйте команду M
для сортировки по использованию памяти. Не стесняйтесь игнорировать столбец VIRT
, который просто говорит вам, сколько виртуальной памяти было выделено, а не сколько памяти использует этот процесс. RES
сообщает, сколько памяти является резидентной или в настоящее время находится в ram (в отличие от обмена на диск или никогда не назначаемого в первую очередь, несмотря на то, что запрашивается).
Но, так как RES
будет считаться, например. /lib/libc.so.6
память раз почти для каждого процесса, это не совсем удивительная мера того, сколько памяти используется процессом. Столбец SHR
сообщает, сколько памяти используется совместно с другими процессами, но нет никакой гарантии, что другой процесс действительно используется - он может быть доступен для совместного доступа, просто никто не хочет делиться.
Инструмент smem
предназначен для того, чтобы помочь пользователям лучше измерить, сколько памяти действительно должно быть обвинено в каждом отдельном процессе. Он делает какую-то умную работу, чтобы выяснить, что действительно уникально, что является общим, и пропорционально сопоставляет общую память процессам, совместно использующим ее. smem
может помочь вам понять, где ваша память лучше, чем top
, но top
- отличный первый инструмент.
Ответ 2
используйте быстрый совет, используя команду top в linux/unix
$ top
а затем нажмите Shift + m (т.е. напишите капитал M
).
От man top
SORTING of task window
For compatibility, this top supports most of the former top sort keys.
Since this is primarily a service to former top users, these commands do
not appear on any help screen.
command sorted-field supported
A start time (non-display) No
M %MEM Yes
N PID Yes
P %CPU Yes
T TIME+ Yes
Или, наоборот: нажмите Shift + f, затем выберите отображение для заказа по использованию памяти, нажав клавишу n, затем нажмите Enter. Вы увидите активный процесс, упорядоченный по использованию памяти
Ответ 3
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10
(Добавление -n числового флага для сортировки команды.)
Ответ 4
Сначала вы должны прочитать объяснение на выходе free
. Итог: у вас есть как минимум 10,7 ГБ памяти, легко доступной для использования процессами.
Затем вы должны определить, что такое "использование памяти" для процесса (это не просто или недвусмысленно, поверьте мне).
Тогда мы могли бы помочь больше: -)
Ответ 5
Список и сортировка процессов по использованию памяти:
ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS
Ответ 6
ps aux --sort '%mem'
из procps 'ps (по умолчанию на Ubuntu 12.04) генерирует вывод, например:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
tomcat7 3658 0.1 3.3 1782792 124692 ? Sl 10:12 0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root 1284 1.5 3.7 452692 142796 tty7 Ssl+ 10:11 3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro 2286 0.3 3.8 1316000 143312 ? Sl 10:11 0:49 compiz
ciro 5150 0.0 4.4 660620 168488 pts/0 Sl+ 11:01 0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb
ciro 5147 0.0 4.5 660556 170920 pts/0 Sl+ 11:01 0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb
ciro 5142 0.1 6.3 2581944 239408 pts/0 Sl+ 11:01 0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]
ciro 2386 3.6 16.0 1752740 605372 ? Sl 10:11 7:38 /usr/lib/firefox/firefox
Таким образом, Firefox является главным потребителем с 16% моей памяти.
Вас также может заинтересовать:
ps aux --sort '%cpu'
Ответ 7
вы можете указать, какой столбец будет сортироваться, выполнив следующие шаги:
steps:
* top
* shift + F
* select a column from the list
e.g. n means sort by memory,
* press enter
* ok
Ответ 8
Вы можете увидеть использование памяти, выполнив этот код в вашем терминале:
$ watch -n2 free -m
$ htop
Ответ 9
Как подсчитать использованную память по имени процесса:
Иногда, даже глядя на самые большие отдельные процессы, все еще остается много неиспользованной памяти. Чтобы проверить, существует ли много таких же меньших процессов, использующих память, вы можете использовать команду, подобную следующей, которая использует awk для суммирования общего объема памяти, используемой процессами с одинаковым именем:
ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n
например, выход
9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7
Ответ 10
У вас есть эта простая команда:
$ free -h