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

127

Прежде чем на самом деле спросить, просто чтобы прояснить: да, я знаю о дисковом кеше, и нет, это не мой случай :) Извините, за эту преамбулу :)

Я использую CentOS 5. Все приложения в системе сильно меняются, и система работает очень медленно. Когда я это сделаю free -m, вот что я получил:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Таким образом, у меня есть только 42 Мб для использования! Насколько я понимаю, на -/+ buffers/cacheсамом деле дисковый кеш не учитывается, поэтому у меня действительно только 42 Мб, верно? Я подумал, что могу ошибаться, поэтому я попытался отключить кеширование диска, но это не дало эффекта - картина осталась прежней.

Итак, я решил выяснить, кто использует всю мою оперативную память, и я использовал topдля этого. Но, по-видимому, он сообщает, что ни один процесс не использует мою оперативную память. Единственный процесс в моем топе - это MySQL, но он использует 0,1% ОЗУ и 400 МБ подкачки. Та же картина, когда я пытаюсь запустить другие сервисы или приложения - все идут подкачкой, topпоказывает, что MEM не используется (максимум 0.1% для любого процесса).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Перезапуск не помогает, и, кстати, он очень медленный, чего я обычно не ожидаю на этой машине (4 ядра, 4 ГБ ОЗУ, RAID1).

Итак, с этим - я почти уверен, что это не дисковый кеш, который использует ОЗУ, потому что обычно его следует уменьшить и позволить другим процессам использовать ОЗУ, а не переходить в режим подкачки.

Итак, наконец, вопрос в том, есть ли у кого-нибудь идеи, как выяснить, какой процесс на самом деле так интенсивно использует память?

Тимур
источник
1
Вы когда-нибудь находили ответ на это?
Хакерон
@ Хакерон: ОП принял этот ответ . Я знаю, что ответ не отвечает на ваш вопрос , хотя. Мне удалось воспроизвести вашу проблему на одном из моих серверов, и в настоящее время я изучаю, есть ли способ ее устранения.
Deltik
@ Делтик Ах, хорошо. Спасибо :) - У меня есть 2 сервера, которые пропускают всю доступную память в течение примерно 12 часов, дайте мне знать, если я могу что-нибудь сделать, чтобы помочь диагностировать это. Я доступен как ник "хакерон" на IRC (irc.freenode.org).
Хакерон
@Хакерон: Я не смог найти тебя как "хакерона" irc.freenode.org. Я создал чат для расширенного обсуждения здесь .
Дельтик
Стоит отметить, что в ARCH (и / или L2ARC) кэш ZFS не отображается free -m, но в Linux его можно запросить с помощью его размера cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

Ответы:

112

В Linux в topпроцессе вы можете нажать <клавишу, чтобы сдвинуть сортировку вывода влево. По умолчанию он сортируется по значению, %CPUпоэтому, если вы нажмете клавишу 4 раза, вы отсортируете ее по VIRTразмеру виртуальной памяти, дающей вам ответ.

Еще один способ сделать это:

ps -e -o pid,vsz,comm= | sort -n -k 2

должен выдавать и выводить отсортированные по процессам виртуальные размеры.

Вот длинная версия:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
Карлсон
источник
Это дает мне Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlна сервере Ubuntu 11.10.
Der Hochstapler
1
@OliverSalzburg Вопрос в -oвариантах. RHEL4 это работает. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2работает. Я попробую 11.10 позже вечером, но если вы найдете правильные варианты сортировки, пожалуйста, дайте мне знать. ps -e -o pid,vsz,comm | sort -n -k 2может работать, но у меня нет места, чтобы проверить в данный момент.
Карлсон
2
Я не очень знаком с этим -efвариантом. Но это, кажется, дает разумный результат:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler
1
Тай, мне нравится главное предположение, что <я не знал, что это возможно, fedora
SSH This
2
Слегка измененная версия, чтобы получить процессы, которые занимают оперативную память и показывает полную команду:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
сенгс
72

Показать память процессов в мегабайтах и ​​путь процесса.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n
ненулевой
источник
8
Добро пожаловать в Супер пользователя. Можете ли вы расширить свой ответ, чтобы объяснить, что делает этот код и как он решает проблему? Необъяснимый код не рекомендуется , потому что он не учит решению. Благодарю.
fixer1234
9
Я удивлен, что этот ответ недооценен и имеет комментарий с просьбой объяснить это .. он достаточно короткий, чтобы было ясно, что он делает (передает ps aux в awk, а затем сортирует), и в контексте вопроса он показывает какие процессы используют больше всего оперативной памяти. Я думаю, что это хороший ответ.
Джон
14

Просто примечание на сервере, показывающее те же симптомы, но все еще показывающее исчерпание памяти. В итоге был обнаружен файл sysctl.conf из коробки с 32 ГБ ОЗУ и установкой для БД с огромными страницами, настроенными на 12000. В этом блоке есть только 2 ГБ ОЗУ, поэтому он назначал всю свободную ОЗУ огромным страницам (только 960 из них). Установка огромных страниц на 10, так как ни одна из них не использовалась, освобождает всю память.

Быстрая проверка / proc / meminfo для поиска настроек HugePages_ может стать хорошим началом для устранения неполадок, по крайней мере, одного неожиданного сбоя памяти.

Всадник смерти
источник
2
У меня недавно был другой сервер, где была эта проблема. Если в вашей организации есть бывшие сотрудники Oracle, этот параметр может быть вашим виновником.
поля
5

В моем случае проблема заключалась в том, что сервер был виртуальным сервером VMware с vmw_balloonвключенным модулем:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Бег:

$ vmware-toolbox-cmd stat balloon
5189 MB

Таким образом, около 5 ГБ памяти было фактически восстановлено хостом. Таким образом, несмотря на то, что на моей виртуальной машине было 8 ГБ «официально», на практике это было намного меньше:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816
Mitar
источник
2

Вы также можете использовать команду ps, чтобы получить больше информации о процессе.

ps aux | less
Атула
источник
Из любопытства, как правильно избежать этой команды? Он показывает END ocne, я достигаю последней строки, он не убивает процесс, когда я Ctrl + C его.
KingsInnerSoul
1
@KingsInnerSoul нажмите «q»
энобайрам
2

Я ссылаюсь на это и Общая память, используемая процессом Python? - Переполнение стека , вот мой ответ. Теперь я получаю специальный инструмент для подсчета процессов (python).

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Прикрепить мой список процессов.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Ссылка

Чу-Саинг Лай
источник
1

Создайте скрипт show-memory-usage.shс содержимым:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '
Фелипе
источник
6
Почему? Что это делает? Как это работает? Не говорите людям запускать случайный код; объясните его цель и как это работает.
CVn
2
Рисунок Я объясню код для тех, кто не понимает, так как он кажется безопасным для запуска, но пониженное голосование может отразить те, к которым было бы полезно. Он запускает ту же команду, что и в ответах выше , но добавляет форматирование с помощью AWK. Я лично не запускал скрипт, так как он мне бесполезен, но объяснение его помогает тем, кто нуждается в некотором форматировании.
Dooley_labs
1
Я прочитал код и запустил его. Он выравнивает поля подобно таблице и форматирует потребляемую резидентную память с помощью префиксов (например, 1,12 ГБ, 582,79 МБ).
Стефан Гурихон
0

Это также берет идентификатор процесса, сортирует по используемому МБ и выделяет команду (которая создала процесс):

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n

прости
источник
0

Мой сервер Ubuntu DISTRIB RELEASE = 18.04 на Hyper-V использовал большую часть памяти, но все процессы были в порядке. (Допустим, я удалил пакеты snapd и unattended-upgr, но 95% памяти все еще использовалось.)

Ответ заключается в том, что Hyper-V имеет динамическую память, поэтому он использовал память для основного использования системы и ubuntu пометил ее как использованную.

Надеюсь, это кому-нибудь поможет.

Водяников Андрей Анатольевич
источник