среда, 22 января 2014 г.

Анализ использования памяти :: Solaris swap

Эта статья является копией моей статьи из локальной WIKI организации. Статья была написана при разборе и анализе проблем потребления swap-раздела системой на сервере. В большей степени, данная статья, является компиляцией из различных источников методов и определений, хотя и писана своими словами

Общее определение SWAP

SWAP - определяет один из механизмов виртуальной памяти, позволяющей осуществлять перемещение неактивных фрагментов RAM, называемых страницами памяти, на внешний носитель, обычно жёсткий диск, для освобождения RAM под исполняемые участки кода. Когда код страницы памяти размещенный на SWAP будет востребован разместившей его в RAM программой, то произойдет обратное перемещение его с внешнего носителя в свободную область RAM. Такой процесс, обычно, называют свопингом.
По своей природе SWAP может являться как файлом (swap-file), так и быть RAW разделом внешнего носителя (swap-partition).


Мониторинг Swap ресурса

Для управления swap-областью используется команда Solaris /usr/sbin/swap, которая производит необходимые действия в зависимости от заданных ключей.

Идентификация системной области swap

Для идентификации подключенного swap в системе и его использовании применяем ключ -l:
root@host # swap -l
swapfile             dev  swaplo blocks   free
/dev/md/dsk/d1      85,1      16 8405360 5622320
Как же читать данный вывод? Прежде всего стоит запомнить, что:
swap -l возвращает данные в блоках, где размер блока составляет 512 byte.
Таким образом, мы видим, что у нас задействован RAW swap-раздел на RAID (d1).
Этот раздел занимает:
SWAP=512byte⋅8405360blocks=4303544320byte;
SWAP=4Gb;
Колонка free показывается оставшееся число блоков в SWAP. Если SWAP не используется, то blocks = free. При значениях SWAP<50%, считается, что происходит утечка swap-области виртуальной памяти и необходим анализ ситуации.

Анализ использования swap области

Для осуществления мониторинга за SWAP областью, то есть за распределением этой виртуальной памяти, используется ключ -s:
root@host # swap -s
total: 5558768k bytes allocated + 399584k reserved = 5958352k used, 4189208k available
У swap -s размер блока составляет 1024 byte.
Поля данного вывода можно свести к следующей таблице:
Вывод команды swap -s
КлючОписание
bytes allocated   Общий размер SWAP области в 1024-byte блоках выделенных для сохранения.
reservedОбщий размер области в 1024-byte блоках не выделенный, но зарезервированный для использования (анонимная память) в дальнейшем.
usedОбщий размер используемой SWAP области в 1024-byte блоках с учетом выделенной и анонимной памяти.
availableОбщий размер SWAP области в 1024-byte блоках, который может быть сейчас назначен или зарезервирован для использования в дальнейшем.
Следует помнить, что сумма used + available вывода swap -s будет больше перевода в Kb страниц из swap -l, объясняется это тем фактом, что вывод swap -l не учитывает расчет физической памяти участвующей в образовании SWAP области. То есть, следует помнить, что часть физической памяти (RAM) всегда используется ядром OS Solaris для SWAP.

Анализ активности SWAP области

Самым простым случаем для анализа активности использования SWAP области является просмотр вывода команды:
vmstat -S 3
Данный вывод показывает нам наглядное использование SWAP, осуществляя запросы каждые 3 секунды. Нас, в первую очередь, будет интересовать вывод si (swap-ins) и so (swap-outs) полей. Значения вывода в этих полях отличные от 0 говорят о активном swap-процессе, что может являться как результатом нехватки физической памяти для системы в целом (то есть необходимо наращивание RAM), так и результатом утечки памяти в каком-либо процессе.
root@host # vmstat -S 3
 kthr      memory            page            disk          faults      cpu
 r b w   swap  free   si  so pi po fr de sr m0 m1 m3 m6   in   sy   cs us sy id
 0 0 0 5935216 3535904 0  0 42  8  4  0  0 36  0  0 36 1758 213674 2630 10 4 86
 0 0 0 4365168 2443136 0  0  0  0  0  0  0  0  0  0  3 1024 9668 1438  5  3 93
 0 0 0 4356776 2442912 0  0  0 11  3  0  0  6  0  0  6 1185 11503 1791 5  1 94
 0 0 0 4350432 2443296 0  0  0 11  3  0  0  3  0  0  4 1110 13947 1664 10 1 90
 0 0 0 4351416 2443904 0  0  0 29  3  0  0  8  0  0  4 1303 15001 2079 8  2 90
В анализе вывода данной команды следует обратить так же на значения поля sr (scan rate) показывающее число отсканированных в памяти страниц в секунду. Если в течении продолжительного периода времени там не нулевые значения, значит нам не хватает физической RAM. Если же мы увидим непрерывные значения этого поля вывода порядка 200 страниц/секунду, то у нас однозначно системе не хватает памяти для нормального функционирования и дальнейший анализ, без наращивания RAM, практически уже бессмыслен.

Сколько физической памяти в системе

Несмотря на то, что этот вопрос не совсем об SWAP, тем не менее необходимо знать количество выделенной физической памяти на конкретной аппаратной платформе для общего анализа. Выполнить это в ОС Solaris представляется простой командой:
/usr/sbin/prtdiag | grep size

Как оценить общее распределение RAM

Для того, чтобы точно понять как системой используется физическая память в OS Solaris, необходимо выполнить следующий запрос с использованием отладчика:
echo "::memstat" | mdb -k

Как оценить процент неиспользованного SWAP

Для быстрой оценки, сколько у нас осталось SWAP области можно использовать
/usr/sbin/swap -l | tail -1 | awk '{ printf("Swap free: %.2f%\n", 100 * ($5/$4))}'

Просмотреть ресурсы потребляющие память

Вывести ТОР ресурсоёмких приложений
ps -eo pid,pmem,vsz,rss,comm | sort -rnk2 | head
Аналогично:
prstat -s rss -Z -c 1 1
Здесь нас интересует кто съедает основную память, пожиратели RAM. Однако из-за использования sharing memory вывод не дает 100% объективной картины, в особенности он не показывает, кто активно использует SWAP.

Как быстро посмотреть, кто сейчас активно использует SWAP

Для определения, кто в данный момент сбрасывает страницы на SWAP можно построить запрос по-другому:
ps -eo pid,pmem,vsz,rss,comm | sort -rnk4 | grep -v "PID %MEM" | tail
В данном случае сортируем по размеру RSS (Resident segment size). Хвостовик нам нужен для определения у кого RSS равен 0, что является показателем проходящего swaping. Однако, из этого утверждения надо исключить такие процессы как: sched (zsched), pageout, fsflush у которых RSS всегда 0.

Как подсчитать, сколько процесс занял места в swap

Что бы проанализировать сколько памяти занимает процесс:
pmap -S  | tail -1
В выводе надо будет обратить внимание на то, что первое число - это количество памяти в Kb занимаемое процессом, а второе - собственно указывает на количество использованного swap (в выводе эти подписи отсутствуют, так как интересующая нас информационная часть - это последняя строка).
             Kbytes       Swap
total Kb    4111904       2944

Как найти процессы, наиболее сильно выгруженные в swap

Задача немного расширяет предыдущую. Предположим, мы провели все перечисленные выше операции для анализа SWAP раздела виртуальной памяти, но нас смущает, что swap используется, например, больше чем на половину и активного свопинга нет. Как же найти, что за процесс/процессы наиболее сильно выгружены в swap?
Здесь опять на помощь к нам приходит команда pmap -S. Делаем выгрузку адресных пространств всех процессов в системе:
pmap -S /proc/* > /var/tmp/pmap-s.out
Далее производим анализ при помощи следующей командной строки:
egrep "[0-9]:|^[ ]*total" /var/tmp/pmap-s.out|nawk 'NR%2==1{pid=$1;pro=$2};NR%2==0{print $4,"Kb PID",pid,pro}'|sort -n
Получаем вывод типа:
. . . 
10936 Kb PID 256: /usr/lib/rcap/rcapd
11120 Kb PID 7: /lib/svc/bin/svc.startd
13688 Kb PID 10948: /usr/lib/nfs/nfslogd
14600 Kb PID 6865: screen
20080 Kb PID 11443: /usr/lib/nfs/nfsmapid
20408 Kb PID 11356: /usr/pkg/bin/less
26832 Kb PID 531: /usr/lib/fm/fmd/fmd
52480 Kb PID 11720: /usr/local/bin/mc
root@host #
который и анализируем.

Как посмотреть, что за процессы используют SWAP в данный момент

Командная строка, с помощью которой можно подсмотреть какие процессы используют SWAP в данный момент времени.
 echo "::walk thread | ::print kthread_t t_schedflag t_procp" | mdb -k | while
 read line; do key=${line%% =*}; val=${line##*= }; if [[ "$key" = "t_schedflag"
 ]] && [[ "$(($val))" -eq "$(($val | 0x1))" ]]; then skip=1; continue; fi; if [[
 "$key" = "t_procp" ]]; then if [[ $skip -ne 1 ]]; then echo "$val::ps" | mdb -k;
 else skip=0; fi; fi; done
Эта шайтан-строка была найдена тут.

Факты

Считается, что swap и tmpfs это одно и тоже

Действительно, это так. Такая конструкция имеет ряд преимуществ, хотя для управления tmpfs имеется свой механизм. Следует помнить, что в контексте tmpfs понятие swap рассматривается как область состоящая из объединения физической памяти и физической дисковой области (swap). Так как tmpfs использует выгружаемую память ядра ОС Solaris, то при необходимости эта часть может быть выгружена в SWAP. На практике это можно наблюдать при размещении на tmpfs данных занимающих по объему места больше, чем есть физической памяти на аппаратной платформе.

Использование swap плохо сказывается на производительности

И опять, данное утверждение, является истиной. Все дело в разнице скорости обмена данными в области RAM и скорости современных дисковых накопителей.
Здесь следует различать один нюанс. Если SWAP используют неактивные процессы системы, то это нормальное явление, практически ни как не сказывающееся на производительности системы в целом. Однако картина резко меняется, если SWAP начинает использовать активный процесс, заставляющий перемещаться страницы памяти с RAM области на дисковую область и наоборот. Мониторинг командой vmstat -S 3, показывает, в такой ситуации, исчерпание значения поля вывода free, которое отвечает за свободную физическую память в Solaris версии 8 и выше. Как только значение этого поля станет достаточно малым начнется процесс сканирования страниц памяти, это будет видно по полю sr данной команды. Любое не нулевое число в колонке sr в течении продолжительного периода времени, показывает на необходимость увеличения количества физической памяти (RAM).

Мифы

Swap всегда должен быть равен 2xRAM

Истоки этого мифа лежат в основах организации виртуальной памяти SunOS 4.X (4.3BSD with System V IPC) 1988 года, которая только с ветки SunOS 4.1.1 стала именоваться Solaris 1.0.
Сейчас виртуальная память в Solaris складывается из суммы объемов физической памяти системы (RAM) и файла подкачки на дисковой системе (swap). Концепция организации виртуальной памяти в Solaris не требует организации swap-раздела вообще. Однако, если полностью отказаться от swap-раздела, то в случае исчерпания RAM в системе не возможно будет запустить новые процессы. Поэтому существуют различные рекомендации по организации swap в документации к ОС Solaris в зависимости от целевого использования системы, но общее правило - swap должен быть около 30% от RAM.

Swap требует только RAW-раздел диска

Это не совсем так. Можно сделать swap-файл на UFS файловой системе, который легко подключить к общему swap-пулу системы, без необходимости перезагрузки ОС Solaris. Подключенный swap-файл сразу же будет задействован виртуальной памятью.
На UFS системе можно создавать любое число swap-файлов, любого размера, ограниченного только свободным пространством.
Имеются некоторые разногласия в плане какой тип SWAP области (swap-раздел или swap-файл) обеспечивают наибольшую производительность системы. Оба сценария имеют преимущество, однако, в для организации swap-раздела имеются следующие причины:
  • Раздел swap занимает непрерывное пространство и может располагаться в области цилиндров диска, где скорость I/O обмена будет наивысшей, с точки зрения производительности.
  • Файл swap работает через файловую систему по мере поступления обновлений, в то время как swap-раздел записывает данные на низком уровне доступа, минуя взаимодействия с файловой системой. Это делает swap-раздел немного быстрее, чем swap-файл.
Sun (позиция от Oracle не известна, но думаю такая же) рекомендовал использовать swap-файлы только как временное решение до тех пор пока не появится возможность добавить swap-разделы в систему.

Нельзя контролировать swap в Solaris containers (zones)

Отчасти правда до версии Solaris 10 08/07, в которой обновили управление ресурсами и сделали возможным управлять swap пространством. Это было сделано для устранения отказа в обслуживании вызываемым утечкой памяти.
  • zone.max-locked-memory
  • zone.max-msg-ids
  • zone.max-sem-ids
  • zone.max-shm-ids
  • zone.max-shm-memory
  • project.max-locked-memory - Replaces project.max-device-locked-memory
  • zone.max-swap - Provides swap capping for zones through the capped-memory resource

Swap раздел используется для дампа системы


С момента появления в ОС Solaris 8 команды dumpadm, дамп системы можно сохранять на файловую систему.
Dump device - которое обычно представлено как swap является временным хранилищем дампа. Если у нас Dump device не является SWAP областью, то запускается процесс savecore в фоне, который ускоряет загрузку ОС Solaris.

Комментариев нет: