Як бачити топ-процеси, відсортовані за фактичним використанням пам'яті?


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.


Відповіді:


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є чудовим першим інструментом.


Отже, якщо тільки "вільна" статистика стовпців крапель, топ показує нічого іншого, ми можемо зробити висновок, що пам'ять виділяється ядром Linux для зберігання файлових речей і надасть пам'ять іншим процесам, коли це необхідно?
Al2O3

@Rubby, це, мабуть, правда; /proc/meminfoі /proc/slabinfoфайли докладно , що ядро використовує для зберігання даних - slabtopпрограма дуже схожий top, але показує , які з плит розподільників виділили скільки, які їхні відносини схожі, і т.д.
sarnold

Дякую за пораду щодо "smem" - я хочу, щоб Linux "витратив" деяку оперативну пам'ять, щоб моя машина могла працювати швидко. Якщо "знайти" займе трохи більше часу на другому проході, це нормально. Миша з застряглими мишами та заморожені вікна, в той час як Linux вирішує, яку оперативну пам’ять (яку вона без зайвих зусиль) потрібно очистити та перерозподілити на те, що я зараз роблю - або навіть міняти на диск - не є варіантом. У мене є 16 ГБ оперативної пам’яті на цьому вікні, і я очікую, що кілька ГБ цього буде вільним і доступним для запущених програм.
JosephK

@JosephK, переміщення миші має більше спільного з плануванням пріоритетів та алгоритмів; якщо для переміщення вказівника миші потрібні виділення пам'яті, то з програмним забезпеченням, яке ви використовуєте, щось серйозно не так. :)
sarnold

2
@JosephK Насправді у ядра потрібно менше часу, щоб змінити пам'ять з одного використання на інше, ніж використовувати вільну пам'ять. Один вимагає доступу та зміни вільного списку, інший - не. На жаль, це питання XY. Проблема пов'язана з продуктивністю і може бути абсолютно не пов'язана зі споживанням пам'яті (незважаючи на докази того, що створення більшої кількості вільної пам'яті допомагає їй, що може бути з більш складних причин, ніж підозрювані в ОП), але натомість вони запитували про аналіз використання пам'яті. Це отримує менш корисні відповіді, ніж запитання про актуальну проблему.
Девід Шварц

321

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


71
Або ви можете просто натиснути M( Shift+ m)
Патрик

8
@risnandar є спосіб показати пам'ять у МБ, а не%
codecowboy

2
привіт codecowboy, можливо, ви можете подивитися на commandlinefu.com/commands/view/3/… для більш детальної пам’яті, що використовується на моєму сервері, я використовую стороннє додаток, як newrelic.com
risnandar

6
або просто top -o mem -O cpu
skipy

У Ubuntu 16 мені потрібно було top -o RESінакше "нерозпізнана назва поля" mem ""
AdamS


28

Спочатку слід прочитати пояснення на виходіfree . Підсумок: у вас є щонайменше 10,7 Гб оперативної пам’яті, яку можна легко використовувати.

Тоді слід визначити, що таке "використання пам'яті" для процесу (це не просто і однозначно, повірте мені).

Тоді ми можемо допомогти більше :-)


Звідки ти взяв 10,7? З буферів / кешу [безкоштовно]? Дякую за посилання, я прочитаю його.
користувач3111525

3
Так. Справа в тому, що більша частина пам'яті використовується буферами та кешем. Цю пам'ять можна "скинути" відразу, якщо будь-який процес потребує більше пам'яті. Коли ви віднімаєте об'єм пам'яті, який використовується для буферів / кешу, від USED кількості або додаєте її до БЕЗКОШТОВНОЇ кількості, ви отримуєте цифри у другому рядку, який потім реалізує, що реально використовується лише 1,3 гіга , або, як видно з іншого Кут, у вас є доступна пам'ять 10,7 гіга (оскільки буфери та кеш можна встановити на вимогу).
stolsvik


17

ps aux --sort '%mem'

з psps 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 означає сортування за пам'яттю,
* натисніть Enter
* гаразд

1
Дублікат відповіді різанара вище.
benjaoming

3

Ви можете бачити використання пам'яті, виконавши цей код у своєму терміналі:

$ watch -n2 free -m
$ htop

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

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 Щоб відображати лише заголовок і три процеси за один раз за часом, просто потрібні позиції з високим рівнем використання

${1-4}говорить, що мій перший аргумент $1я хочу за замовчуванням до 4, якщо я його не надаю

Якщо ви використовуєте Mac, можливо, спочатку вам доведеться встановити годинник

brew install watch 

Крім того, ви можете використовувати функцію

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

І ви можете легко сортувати за процесором, якщо ви перейдете -mна-r
Jasonleonhard

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.