Как измерить использования памяти в 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, которая является объемом разделяемой памяти, плюс неразделенная память, используемая каждым процессом. Если процессы памяти разшарить, то это будет завышать объем памяти, фактически используемой, потому что та же совместно используемая память будет подсчитываться только один раз, снова появляеться в каждом другом процессе, который разделяет те же памяти. Таким образом, это ненадежные числа, особенно когда у процессов памяти есть много вилок.
Свежие комментарии