108

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

Я использую 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 Мб подкачки. Та же картина, когда я пытаюсь запустить другие сервисы или приложения - все идут в swap, 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).

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

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

7 ответов7

96

В 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
58

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

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

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

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

2

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

ps aux | less
1

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

Я ссылаюсь на это и Общая память, используемая процессом 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

Ссылка

0

Создайте скрипт с именем 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") }
 '

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .