Select Page

Как измерить использования памяти в Linux

Как измерить использования памяти в Linux

Вам, как системному администратору или разработчику, иногда нужно рассмотреть вопрос об использовании памяти в GNU/Linux процессах и программах. Память является жизненно важным ресурсом, и ограниченный объем памяти, а также процессы, которые используют много памяти, могут привести к ситуации out of memory (ООМ). В этом состоянии Linux активизирует процесс убийцы OOM ядра, который пытается восстановить систему путем прекращения одного процесса или процесса с более низким приоритетом. Причем, никто не может предсказать, какие процессы системы будут убиты. А он может прибить и нужные процессы, что может вызвать проблемы в предоставлении услуг.

В этой статье мы рассмотрим три утилиты, которые выдают информацию о памяти, используемой на GNU/Linux системах. Каждая имеет свои сильные и слабые стороны. Я буду использовать CentOS 6.4 как демо-систему, но эти программы доступны на любом Linux распределении.

Содержание

ps

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

Запуск ps aux показывает каждый процесс в системе. Обычно результат выглядит примерно так:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19228 1488 ? Ss 18:59 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 18:59 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 18:59 0:00 [migration/0]
...
...
root 742 0.0 0.0 0 0 ? S 19:00 0:00 [ext4-dio-unwrit]
root 776 0.0 0.0 0 0 ? S 19:00 0:00 [kauditd]
root 785 0.0 0.0 0 0 ? S 19:00 0:00 [flush-253:0]
root 939 0.0 0.0 27636 808 ? S<sl 19:00 0:00 auditd
root 955 0.0 0.0 255416 1624 ? Sl 19:00 0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
root 1080 0.0 0.1 78720 3272 ? Ss 19:00 0:00 /usr/libexec/postfix/master
postfix 1088 0.0 0.1 78800 3236 ? S 19:00 0:00 pickup -l -t fifo -u
postfix 1089 0.0 0.1 78972 3284 ? S 19:00 0:00 qmgr -l -t fifo -u
root 1090 0.0 0.0 117244 1420 ? Ss 19:00 0:01 crond
root 1103 0.0 0.0 56760 1680 ? Ss 19:00 0:00 login -- root 
root 1105 0.0 0.0 4060 572 tty2 Ss+ 19:00 0:00 /sbin/mingetty /dev/tty2
root 1107 0.0 0.0 4060 576 tty3 Ss+ 19:00 0:00 /sbin/mingetty /dev/tty3
root 1109 0.0 0.0 4060 572 tty4 Ss+ 19:00 0:00 /sbin/mingetty /dev/tty4
root 1111 0.0 0.0 4060 572 tty5 Ss+ 19:00 0:00 /sbin/mingetty /dev/tty5
root 1116 0.0 0.0 4060 568 tty6 Ss+ 19:00 0:00 /sbin/mingetty /dev/tty6
root 1129 0.0 0.0 19400 952 ? Ss 19:01 0:00 /usr/sbin/anacron -s
root 1135 0.0 0.1 108296 1932 tty1 Ss+ 19:14 0:00 -bash
root 1205 0.0 0.0 9116 688 ? Ss 19:15 0:00 dhclient eth0
root 1234 0.0 0.2 97864 3912 ? Ss 19:16 0:00 sshd: root@pts/0 
root 1238 0.0 0.0 108300 1904 pts/0 Ss 19:18 0:00 -bash
root 1283 0.0 0.0 64116 1152 ? Ss 19:20 0:00 /usr/sbin/sshd
root 18990 7.0 0.0 110224 1160 pts/0 R+ 19:32 0:00 ps aux

Если вы ищете глюки памяти, вы, вероятно, хотите, отсортировать выходные данные. –sort аргумент принимает ключевые значения, которые указывают, что вы хотите получить на выходе. Например, ps aux –sort -rss – сортирует по размеру, который представляет собой non-swapped физической памяти. Тем не менее, RSS может ввести в заблуждение и может показать более высокое значение, чем реально, если несколько страниц разделяются, например, на несколько потоков или динамически подключаемые библиотеки.

Вы также можете использовать -vsz – виртуальный размер набора – но он не отражает фактическое количество памяти, используемой приложениями, а лишь объем памяти, зарезервированный для них, который включает в себя значение RSS. Обычно вы не хотите использовать его при поиске процессов, которые едят память.

ps -aux самой по себе не достаточно, чтобы сказать вам, если процесс битый, но если ваша система будет бита, оно поможет вам определить процессы, в которых возникают самые большие проблемы.

top

Команда top отображает динамическую информацию режима реального времени о системе и запущенных задач, которые управляется Linux ядром. Статистика использования памяти включает реальное время в общее, занятую и свободную физическую память и подкачку памяти, с буферами и кэшами. Впишите top в командную строку, чтобы увидеть как постоянно обновляется статистика на странице:

top – 19:56:33 up 56 min, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 67 total, 1 running, 66 sleeping, 0 stopped, 0 zombie
Cpu(s): 4.4%us, 1.7%sy, 0.2%ni, 88.7%id, 5.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1922680k total, 851808k used, 1070872k free, 19668k buffers
Swap: 4128760k total, 0k used, 4128760k free, 692716k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
1 root 20 0 19228 1488 1212 S 0.0 0.1 0:01.29 init 
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 
4 root 20 0 0 0 0 S 0.0 0.0 0:00.17 ksoftirqd/0 
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 
6 root RT 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0 
7 root 20 0 0 0 0 S 0.0 0.0 0:01.27 events/0 
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup 
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper 
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns 
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr 
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm 
....

В top памяти отображается как VIRT, RES и SHR:

  • VIRT – это виртуальный размер процесса, который является суммой фактически используемой памяти, памяти, которая переходит в себя (например, ОЗУ видеокарты для сервера Х), файлов на диске, которые были сопоставлены с ним (особенно разделяемые библиотеки), и памяти, совместно с другими процессами. VIRT показывает сколько памяти процесс может получить в настоящий момент.
  • RES – резидентом размера, который дает точное представление о том, сколько памяти реально потребляет физический процесс. (Это число находится в колонке top‘s %MEM) Это число будет практически всегда меньше размера VIRT, так как большинство программ зависит от библиотеки C.
  • SHR показывает сколько VIRT размера занято на самом деле, потому что он включает в себя память и библиотек, которые можно использовать совместно с другими процессами. В случае библиотеки, это не обязательно означает, что вся библиотека является резидентом. Например, если программа использует только несколько функций в библиотеке, вся библиотека отображается и подсчитывается в VIRT и SHR, но только те части файла библиотеки, которые содержат функции, которые фактически загружены и подсчитывались под RES.

Некоторые из этих чисел могут немного вводить в заблуждение. Например, если у вас есть сайт, использующих PHP, и, в частности PHP-FPM, вы могли видеть что-то вроде:

top – 14:15:34 up 2 days, 12:38, 1 user, load average: 0.97, 1.03, 0.93
Tasks: 124 total, 1 running, 123 sleeping, 0 stopped, 0 zombie
Cpu(s): 4.9%us, 0.3%sy, 0.0%ni, 94.6%id, 0.0%wa, 0.0%hi, 0.1%si, 0.1%st
Mem: 1029508k total, 992140k used, 37368k free, 150404k buffers
Swap: 262136k total, 2428k used, 259708k free, 551500k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6695 www-data 20 0 548m 307m 292m S 0 30.6 8:06.55 php-fpm
6697 www-data 20 0 547m 306m 292m S 0 30.4 7:59.64 php-fpm
6691 www-data 20 0 547m 305m 291m S 2 30.4 8:04.96 php-fpm
6689 www-data 20 0 547m 305m 291m S 2 30.3 8:07.55 php-fpm
6696 www-data 20 0 540m 298m 292m S 1 29.7 8:13.43 php-fpm
6705 www-data 20 0 540m 298m 292m S 0 29.7 8:17.24 php-fpm
6699 www-data 20 0 540m 298m 291m S 4 29.7 8:07.39 php-fpm
6701 www-data 20 0 541m 297m 289m S 0 29.6 7:59.87 php-fpm
6700 www-data 20 0 540m 297m 290m S 0 29.5 8:09.92 php-fpm
6694 www-data 20 0 541m 296m 288m S 2 29.5 8:05.18 php-fpm
6707 www-data 20 0 541m 296m 288m S 0 29.5 8:09.40 php-fpm
6692 www-data 20 0 541m 296m 289m S 0 29.5 8:14.23 php-fpm
6706 www-data 20 0 541m 296m 289m S 3 29.5 8:07.59 php-fpm
6698 www-data 20 0 541m 295m 288m S 4 29.4 8:04.85 php-fpm
6704 www-data 20 0 539m 295m 289m S 2 29.4 8:13.58 php-fpm
6708 www-data 20 0 540m 295m 288m S 1 29.4 8:14.27 php-fpm
6802 www-data 20 0 540m 295m 288m S 3 29.3 8:11.63 php-fpm
6690 www-data 20 0 541m 294m 287m S 3 29.3 8:14.54 php-fpm
6693 www-data 20 0 539m 293m 287m S 2 29.2 8:16.33 php-fpm
6702 www-data 20 0 540m 293m 286m S 0 29.2 8:12.41 php-fpm
8641 www-data 20 0 540m 292m 285m S 4 29.1 6:45.87 php-fpm
8640 www-data 20 0 539m 291m 285m S 2 29.0 6:47.01 php-fpm
6703 www-data 20 0 539m 291m 285m S 2 29.0 8:17.77 php-fpm

Это значит, что все эти процессы используют около 30 процентов от общего объема памяти в системе? Да, это так, потому что они используют много разделяемой памяти – и это то, почему вы не можете просто добавить число% MEM для всех процессов, чтобы увидеть, сколько от общего объема памяти они используют.

smem

В то время как ps и top есть в любом дистрибутиве, smem вам придется установить самостоятельно. Эта команда создает рапорты физической памяти, принимая во внимание общие страницы памяти. В ее выходных данных неразделенная оперативная память в качестве уникального размера набора (USS). Общая память делится поровну между процессами, которые совместно используют память. USS плюс доля процесса разделяемой памяти, как сообщается, пропорциональна размеру набора (PSS).

USS PSS и включает только физическую память. Они не включают в себя память, которая была выгружена на диск.

Чтобы установить smem под Debian/Ubuntu Linux, введите следующую команду:

$ sudo apt-get install smem

Тут нет smem пакета в стандартном репозитории для CentOS или других Red Hat на основе Linux, но вы можете получить его с помощью следующих команд:

# cd /tmp
# wget http://www.selenic.com/smem/download/smem-1.3.tar.gz
# tar xvf smem-1.3.tar.gz
# cp /tmp/smem-1.3/smem /usr/local/bin/
# chmod +x /usr/local/bin/smem

После установки, наберите smem в командной строке, чтобы получить результаты, подобные этим:

PID User Command Swap USS PSS RSS 
1116 root /sbin/mingetty /dev/tty6 0 76 110 568 
1105 root /sbin/mingetty /dev/tty2 0 80 114 572 
1109 root /sbin/mingetty /dev/tty4 0 80 114 572 
1111 root /sbin/mingetty /dev/tty5 0 80 114 572 
1107 root /sbin/mingetty /dev/tty3 0 84 118 576 
939 root auditd 0 336 388 808 
1205 root dhclient eth0 0 564 571 688 
1103 root login -- root 0 532 749 1680 
1090 root crond 0 704 784 1420 
1 root /sbin/init 0 736 813 1488 
1238 root -bash 0 380 856 1924 
1283 root /usr/sbin/sshd 0 676 867 1152 
1135 root -bash 0 392 868 1932 
426 root /sbin/udevd -d 0 948 973 1268 
955 root /sbin/rsyslogd -i /var/run/ 0 996 1069 1628 
1080 root /usr/libexec/postfix/master 0 984 1602 3272 
1089 postfix qmgr -l -t fifo -u 0 1032 1642 3284 
1234 root sshd: root@pts/0 0 1772 2328 3912 
19319 postfix pickup -l -t fifo -u 0 2376 2738 3276 
19352 root python ./smem 0 5756 6039 6416

Как вы видите, для каждого процесса smem показаны четыре интересных области:

  • Swap – пространство подкачки в результате этого процесса.
  • USS – количество уникальной неразделенной памяти в этом процессе. Он не включает разделяемую память, так что занижает объем памяти используя процесс, но эта колонка полезна, когда вы хотите проигнорировать общую память. Этот столбец показывает, сколько оперативной памяти освободится, когда этот процесс завершился.
  • PSS – это самая ценная колонка. Она складывает уникальную память (USS) и долю общей памяти и получает путем деления общей совместно используемой памяти на количество других процессов обмена этой памяти. Таким образом, это даст вам точное представление о том, сколько реально физической памяти используется для процесса, а общая память действительно представлена в виде общей.
  • RSS – Resident Set Size, которая является объемом разделяемой памяти, плюс неразделенная память, используемая каждым процессом. Если процессы памяти разшарить, то это будет завышать объем памяти, фактически используемой, потому что та же совместно используемая память будет подсчитываться только один раз, снова появляеться в каждом другом процессе, который разделяет те же памяти. Таким образом, это ненадежные числа, особенно когда у процессов памяти есть много вилок.

About The Author

Leave a reply

Ваш адрес email не будет опубликован.