Как увидеть топ процессы отсортированы по фактическому использованию памяти?

240

У меня есть сервер с 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.

user3111525
источник

Ответы:

280

Во-первых, повторите эту мантру немного: «неиспользованная память - это потерянная память». Ядро Linux хранит огромное количество файловых метаданных и файлов, которые были запрошены, пока что-то, что выглядит более важным, не вытолкнет эти данные. Вот почему вы можете запустить:

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

и второй findэкземпляр работает на нелепой скорости.

Linux только оставляет немного «свободной» памяти для обработки скачков в использовании памяти без особых усилий.

Во-вторых, вы хотите найти процессы, которые пожирают всю вашу память; в topиспользовании Mкоманды для сортировки по использованию памяти. Не стесняйтесь игнорировать VIRTстолбец, который просто говорит вам, сколько виртуальной памяти было выделено, а не сколько памяти использует процесс. RESсообщает, сколько памяти является резидентной или в настоящее время находится в оперативной памяти (в отличие от подкачки на диск или вообще не выделяется в первую очередь, несмотря на запрос).

Но, поскольку RESподсчитывается, например, /lib/libc.so.6память один раз почти для каждого процесса, это не совсем хороший показатель того, сколько памяти использует процесс. В SHRстолбце указывается, сколько памяти используется совместно с другими процессами, но нет никакой гарантии, что другой процесс на самом деле делится - это может быть совместное использование, просто никто больше не хочет делиться.

Этот smemинструмент предназначен для того, чтобы помочь пользователям лучше оценить, сколько памяти действительно нужно винить в каждом отдельном процессе. Он делает некоторую умную работу, чтобы выяснить, что действительно уникально, что является общим, и пропорционально соотносит общую память с процессами, разделяющими ее. smemможет помочь вам понять, где ваша память идет лучше, чем topбудет, но topэто отличный первый инструмент.

sarnold
источник
Так что, если отбрасывается только «свободная» статистика по столбцам, top не показывает ничего иного, мы можем заключить, что память выделена ядром linux для хранения файловых файлов и даст память другим процессам, когда это необходимо?
Al2O3
@Rubby, это, вероятно, правда; /proc/meminfoи /proc/slabinfoфайлы подробно , что ядро использует для хранения данных - slabtopпрограмма очень похож top, но показывает , какие из плит распределителей выделили сколько, каковы их отношения похожи, и т.д.
sarnold
Спасибо за подсказку о «smem» - я хочу, чтобы Linux «тратил» немного оперативной памяти, чтобы моя машина могла работать быстро. Если «найти» занимает больше времени на втором проходе, это нормально. Застрявшая мышь и зависшие окна, в то время как Linux решает, какую оперативную память (которую она излишне перегружала), нужно очистить и перераспределить для того, что я делаю СЕЙЧАС - или даже перезаписать на диск - не вариант. У меня есть 16 ГБ оперативной памяти на этой коробке, и я ожидаю, что несколько ГБ этого будут свободными и доступными для запущенных приложений.
JosephK
@JosephK, перемещение мыши больше связано с приоритетами и алгоритмами планирования; если для перемещения указателя мыши требуется выделение памяти, значит, что-то не так с программным обеспечением, которое вы используете. :)
sarnold
2
@JosephK На самом деле ядру требуется меньше времени для переназначения памяти от одного использования к другому, чем для использования свободной памяти. Один требует принятия и изменения свободного списка, другой нет. К сожалению, это вопрос XY. Проблема связана с производительностью и может быть совершенно не связана с потреблением памяти (несмотря на доказательства того, что освобождение памяти помогает ей, что может быть по более сложным причинам, чем подозревает OP), но вместо этого они спрашивают об анализе использования памяти. Это дает менее полезные ответы, чем вопрос о реальной проблеме.
Дэвид Шварц
321

используйте быстрый совет, используя команду 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. Вы увидите активный процесс, упорядоченный по использованию памяти

risnandar
источник
71
Или вы можете просто нажать M( Shift+ m)
Патрик
8
@risnandar есть способ показать память в МБ, а не%
codecowboy
2
Привет codecowboy, возможно, вы можете посмотреть на commandlinefu.com/commands/view/3/… для получения более подробной памяти, используемой на моем сервере, я использую стороннее приложение, такое как newrelic.com
risnandar
6
или просто top -o mem -O cpu
пропустить
В Ubuntu 16 мне нужно было top -o RES«нераспознанное имя поля« mem »»
AdamS
37
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10

(Добавление -n числового флага для команды сортировки.)

Angelinux
источник
3
Также рассмотрите, ps aux --sort '%mem'как объяснено в моем ответе
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
28

Сначала вы должны прочитать объяснение на выходеfree . Итог: у вас есть как минимум 10,7 ГБ памяти, легко используемой процессами.

Затем вы должны определить, что такое «использование памяти» для процесса (это не просто и не однозначно, поверьте мне).

Тогда мы могли бы помочь больше :-)

thkala
источник
Откуда вы взяли 10,7? Из буферов / кеша [бесплатно]? Спасибо за ссылку, я ее прочитаю.
user3111525
3
Да. Дело в том, что большая часть памяти используется буферами и кешем. Эта память может быть "сброшена" сразу же, если какой-либо процесс требует больше памяти. Когда вы вычитаете объем памяти, используемой для буферов / кеша из суммы USED, или добавляете ее к количеству FREE, вы получаете числа во второй строке, что подразумевает, что реально используется только 1,3 гига , или, если смотреть с другой стороны. под углом у вас есть 10,7 гигабайта легко доступной памяти (поскольку буферы и кеш могут быть выгружены по требованию).
stolsvik
21

Список и сортировка процессов по использованию памяти:

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS
Томир Шмит-младший
источник
7
Или:ps -e -orss=,args= | sort -nr | head
kenorb
17

ps aux --sort '%mem'

ps из procps (по умолчанию в 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'
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
4

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

шаги:
* верхняя
* Shift + F
* выберите столбец из списка
    например, n означает сортировку по памяти,
* нажмите Ввод
* хорошо
Эрик Ван
источник
1
Дубликат ответа Риснандара выше.
Benjaoming
3

Вы можете увидеть использование памяти, выполнив этот код в своем терминале:

$ watch -n2 free -m
$ htop
Cubiczx
источник
3

Как подсчитать использованную память по имени процесса:

Иногда, даже глядя на самые большие отдельные процессы, все еще остается много неиспользованной памяти. Чтобы проверить, существует ли много таких же меньших процессов, использующих память, вы можете использовать команду, подобную следующей, которая использует 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
gaoithe
источник
0

В этот самый второй раз

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

Постоянно обновляемый

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

Я также добавил несколько вкусностей, которые вы можете оценить (или игнорировать).

-n 1 смотреть и обновлять каждую секунду

-U $(whoami)Чтобы показать только ваши процессы. $ (некоторая команда) оценивает сейчас

| head -n4 Чтобы показывать только заголовок и 3 процесса одновременно, часто требуются позиции с высокой загрузкой

${1-4}говорит, что мой первый аргумент, $1я хочу по умолчанию 4, если я не предоставлю его

Если вы используете Mac, вам может потребоваться установить часы

В качестве альтернативы вы можете использовать функцию

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}
jasonleonhard
источник
И вы можете легко отсортировать по процессору, если вы -m-r
перейдете
-1

У вас есть эта простая команда:

$ free -h
Кристиан IC
источник