Виртуальная память в Solaris
https://www.thegeekdiary.com/category/solaris/ Solaris Guide 13-16 <----- PDF ст. 15 Solaris guade 1-3.pdf <----- PDF ст. 2
Сколько физической памяти в системе: prtconf | grep Mem
Размер страницы: pagesize -a [a - Prints out all possible hardware address translation sizes supported by the system.]
https://docs.oracle.com/pagesize-1.html <-----man pages section 1: User Commands
[15:16@solaris]~ # prtconf | grep Mem
Memory size: 2682 Megabytes
[15:22@solaris]~ # pagesize
4096
[15:22@solaris]~ #
Linux:
$ cat /proc/meminfo | grep Mem*
MemTotal: 3895124 kB
MemFree: 182084 kB
MemAvailable: 1227176 kB
$
[17:16@solaris]~ # sar -r
SunOS solaris 5.10 Generic_147148-26 i86pc
16:00:00 freemem freeswap
17:00:00 475423 5155328
[17:16@solaris]~ #
[15:16@solaris]~ # sar -r 1 3
SunOS solaris 5.10 Generic_147148-26 i86pc
15:18:32 freemem freeswap
15:18:33 478189 5176424
15:18:34 478188 5176416
15:18:35 478287 5177208
Average 478221 5176683
[15:18@solaris]~ # bc
478221*4096 5176683*512 1958793216+2650461696
= 1 958 793 216 = 2 650 461 696 = 4 609 254 912
[15:18@solaris]~ #
-b показывает информацию о буферах и эффективности использования буфера в сравнении с диском.
-c показывает вызовы самых популярных системных методов, таких как fork(), exec(), read() и write(). Частое создание процессов приводит к уменьшению производительности и может потребовать перемещения некоторых приложений на другой компьютер.
параметры -g, -p и -w показывают активность подкачки (своппинг). Высокий уровень использования подкачки говорит о нехватке памяти. Особенность параметра -w состоит в том, что он показывает число переключений между процессами. Большое число переключений означает, что на компьютере запущено много других процессов, и больше времени тратится на переключения, чем на работу.
-q показывает размер очереди исполнения, который определяется как средняя загрузка за время.
-r показывает свободную память и количество свободного места в подкачке на данный момент.
-w активность свопинга
=====================
freemem
The average number of memory pages that are available to user processes over the intervals sampled by the command. Page size is machine-dependent.
freeswap
The number of 512-byte disk blocks that are available for page swapping.
![](https://www.google.com/images/icons/product/drive-32.png)
![](https://www.google.com/images/icons/product/drive-32.png)
![](https://www.google.com/images/icons/product/drive-32.png)
Модульный отладчик (MDB - Modular Debugger Overview) - это инструмент отладки общего назначения для ОС Solaris, основной функцией которого является его расширяемость. MDB предоставляет обширный набор функций для анализа ядра Solaris и другие целевые программы.
Чтобы запустить mdb, используйте команду mdb, как описано на справочной странице mdb (1). Чтобы запустить kmdb, загрузите систему, как описано на странице справки kmdb (1), или выполните команду mdb с опцией -K #mdb -k
Solaris 10 and OpenSolaris Kernel Architecture <------------
MDB Features:
В следующих примерах показаны некоторые задачи, которые вы можете выполнять с помощью MDB:
Выполнять посмертный анализ аварийных дампов ядра Solaris и дампов пользовательских процессов. MDB включает в себя набор модулей отладчика, которые облегчают сложный анализ состояние ядра и процесса, в дополнение к стандартным возможностям отображения и форматирования данных. Эти отладочные модули позволяют формулировать сложные запросы для исследования ядра и обработать состояние следующими способами:
Найдите всю память, выделенную конкретным потоком
Распечатайте визуальную картинку ядра STREAM
Определите, к какому типу структуры относится конкретный адрес
Найти утечки блоков памяти в ядре
анализировать память, чтобы найти следы стека
Используйте первоклассный API-интерфейс для реализации собственных команд отладчика и инструменты анализа без необходимости перекомпиляции или изменения MDB. В MDB поддержка отладки реализован в виде набора загружаемых модулей (общих библиотек, с которыми можно открыть отладчик функция dlopen, каждая из которых предоставляет набор команд, расширяющих возможности MDB. MDB предоставляет API основных служб, таких как способность читать и запись в память и доступ к информации таблицы символов. MDB обеспечивает основу для вас реализовать поддержку отладки для ваших собственных драйверов и модулей. Ваша команда и инструменты может быть сделан доступным для всех.
Научитесь использовать MDB, если вы уже знакомы с устаревшими средствами отладки adb и crash. MDB обеспечивает обратную совместимость с этими существующими решениями отладки. MDB язык является надмножеством языка adb. Все существующие макросы и команды adb работают в пределах MDB. Таким образом, разработчики, использующие adb, могут сразу использовать MDB, не зная любые специфичные для MDB команды. MDB также предоставляет команды, которые превосходят функциональность доступно из утилиты аварийного завершения.
Воспользуйтесь преимуществами улучшенных юзабилити. MDB предоставляет множество функций удобства использования, включая следующие:
Редактирование командной строки
История команд
Встроенный выходной пейджер
Проверка и обработка синтаксических ошибок
онлайн помощь
Интерактивная регистрация сеансов
swap -l Вывести список текущих своп-устройств
swap -s Вывод доступного пространства
[00:04@solaris]~ # swap -l
swapfile dev swaplo blocks free
/dev/zvol/dsk/rpool/swap 181,1 8 2097144 2097144
[00:07@solaris]~ # swap -s
total: 291540k bytes allocated + 74656k reserved = 366196k used, 2554688k available
[00:08@solaris]~ # https://unix.stackexchange.com
Как оценить общее распределение RAM echo "::memstat" | mdb -k https://www.unix.com
prstat -s rss https://www.thegeekdiary.com/how-to-check-and-analyze-memory-usage-in-solaris/
[13:30@solaris]~ # echo "::dcmds" | mdb -k https://docs.oracle.com
[21:23@solaris]~ # mdb -k
Loading modules: [ unix krtld genunix specfs dtrace uppc cpu.generic zfs sata ipc sockfs ip hook neti dls sctp arp usba fcp fctl nca lofs md cpc random crypto fcip logindmux ptm ufs sppp nfs ]
> ::memstat
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 128741 502 19%
Anon 75850 296 11%
Exec and libs 10453 40 2%
Page cache 2143 8 0%
Free (cachelist) 9783 38 1%
Free (freelist) 457460 1786 67%
Total 684430 2673
>
[22:14@solaris]~ # echo "::memstat" | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 128894 503 19%
Anon 77371 302 11%
Exec and libs 10452 40 2%
Page cache 2143 8 0%
Free (cachelist) 9784 38 1%
Free (freelist) 455786 1780 67%
Total 684430 2673
[22:17@solaris]~ # MDB, "без шуток" это язык программирования, SUN подходил ко всему основательно, это к тому что изучить его и не пользоваться, безсмысленно, но можно выписать себе наиболее подходящие шаблоны типа выше приведенного и с успехом их использовать, это как с AWK кто знает "идеально" AWK? - никто (и не надо), но все им пользуются.
Просмотреть ресурсы потребляющие память: ps -eo pid,pmem,vsz,rss,comm | sort -rnk2 | head или prstat -s rss -Z -c 1 1
Как быстро посмотреть, кто сейчас активно использует SWAP: ps -eo pid,pmem,vsz,rss,comm | sort -rnk4 | grep -v "PID %MEM" | tail
Как подсчитать, сколько процесс занял места в swap: pmap -S | tail -1
Как найти процессы, наиболее сильно выгруженные в 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
Использование пользовательской памяти: проверка использования / tmp
[18:03@solaris]~ # df -kl /tmp
Filesystem kbytes used avail capacity Mounted on
swap 2586644 40 2586604 1% /tmp
[18:04@solaris]~ # du -akd /tmp/ | sort -n | tail -10
4 /tmp/.iiim-user
4 /tmp/.removable
4 /tmp/.X0-lock
4 /tmp/.X11-pipe
4 /tmp/.X11-unix
4 /tmp/hsperfdata_root
4 /tmp/userswup.trc.x4aGCc
32 /tmp/hsperfdata_noaccess/815
36 /tmp/hsperfdata_noaccess
72 /tmp
[18:05@solaris]~ #
http://www.iakovlev.org/index.html?p=888
https://www.osp.ru/os/2004/11/184782/
https://ru.bmstu.wiki/Oracle_Solaris_Studio
Виртуальная память в Solaris
Поскольку процессам, запущенным в системе, обычно в сумме требуется больше места, чем размер оперативной памяти, в любой системе UNIXсуществует механизм виртуальной памяти. Объем виртуальной памяти складывается из объема оперативной памяти и объема пространства свопинга (swap space). Подсистема виртуальной памяти в ядре заботится о том, чтобы с точки зрения процесса память была непрерывна и всегда доступна. В действительности страницы памяти, выделенные процессу, могут быть как угодно распределены в оперативной памяти или быть выгруженными на диск в пространство свопинга.
Вся виртуальная память разбита на страницы объемом 4 Кб(или кратно 2). Некоторые компьютеры в силу их аппаратной реализации используют страницы памяти по 8Кб. К ним относятся компьютеры с микропроцессорами DEC Alpha, первыми процессорами Sun SPARC (например, Ross RT601/Cypress CY7C601/Texas Instruments TMS390C601A, устанавливавшиеся в SPARCstation 2) и модели Sun UltraSPARC. В Solaris для определения фактического размера страницы памяти следует использовать программу /usr/bin/pagesize или функцию getpagesize.
Потребителями виртуальной памяти в Solaris являются ядро системы, кэши файловой системы, тесно разделяемая память (intimately shared memory) и процессы. Тесно разделяемая память специфична для Solaris и представляет собой область разделяемой памяти, которую нельзя выгружать на диск. Тесно разделяемую память используют такие программы, как Oracle, Sybase, Informix. Виртуальная память построена на четырех принципах, реализованных в системе.
Во-первых, каждый процесс получает отдельное виртуальное адресное пространство (virtual address space). Это значит, что процессу доступен определенный диапазон ячеек памяти. Максимальный размер этого диапазона памяти определяется длиной слова адреса в компьютере (https://ru.wikipedia.org). Процесс, запущенный в 32-разрядной системе, будет иметь виртуальное адресное пространство размером 4 гигабайта (232 байт). Подсистема виртуальной памяти соотносит (отображает) пользовательский кусочек виртуального адресного пространства и реальные страницы физической памяти.
Во-вторых, адресные пространства нескольких процессов могут перекрываться незаметно для процессов, если они используют общий код. Например, одновременно могут быть запущены три экземпляра одного и того же командного процессора (пусть это будет bash ). Они имеют отдельные виртуальные адресные пространства. В каждом виртуальном пространстве находится экземпляр процесса командного интерпретатора, копия библиотеки libc и (возможно) копии других разделяемых процессами ресурсов. Подсистема виртуальной памяти незаметно для процессов отображает эти разделяемые куски памяти в одну и ту же область физической памяти так, что в физической памяти содержится всего один экземпляр разделяемого ресурса. Похоже на создание жестких ссылок на файл, верно?
В-третьих, подсистема виртуальной памяти выгружает наименее используемые страницы памяти на диск, когда физической памяти не хватает для всех процессов.
В-четвертых, подсистема виртуальной памяти запрещает процессу обращаться к ячейкам памяти из чужого адресного пространства, причем это делается на аппаратном уровне – посредством механизма диспетчеризации.
Виртуальная память не является "бесплатным приложением", разными способами реализации повышает накладные расходы операционной системы как то: структуры данных управления памятью размещаются в оперативной памяти, уменьшая ее размер; управление виртуальной памятью процесса может требовать ресурсоемких операций ввода/вывода и для системы со средней загрузкой, неменее 7% процессорного времени приходится на подсистему управления памятью. Поэтому от эффективности реализации и работы этой подсистемы во многом зависит производительность операционной системы в целом.
В целом смысл виртуальной памяти заключается в том, что каждый процесс выполняется в собственном виртуальном адресном пространстве. Можно сказать, что каждый процесс в операционной системе UNIX выполняется на собственной виртуальной машине, где все ресурсы принадлежат исключительно ему, и такую иллюзию предаставляет ему подсистема управления памятью в отношении к физической памяти.
Оценка необходимого размера оперативной памяти
Для оценки памяти, занимаемой каждым из процесов, можно использовать как уже известные top и ps, так и pmap (последняя дает более подробное распределение памяти процесса по типам – разделяемая память и т.п.): pmap –х
В Solaris существует целое семейство так называемых процессных утилит (proc tools) или p -команд, которые работают с файловой системой /proc, в которую отображаются многие структуры ядра, в частности, таблица процессов. Эти программы позволяют получать самую разную информацию о процессах, а некоторые из них могут также проанализировать завершившийся аварийно процесс, если от него остался файл core1.
Помните, что память потребляется не только процессами, но и кэшем файловой системы, тесно разделяемой памятью и ядром! Если в системе не запускается СУБД Oracle или другое подобное приложение, скорее всего, тесно разделяемая память в системе не используется. В Solaris 8 и Solaris 9 для ядра и обязательно запускающихся системных приложений следует заранее предусмотреть не менее 32 MB памяти и еще 16 MB, если CDE (Common Desktop Environment) тоже запускается. Рекомендованным для Solaris 9 объемом памяти (не считая память, которая требуется для специфических приложений – СУБД, почтового сервера и т.п.) считается 64 Мб, но оптимальным для системы, в которой работают с графическим интерфейсом, будет 128 Мб. Если планируется одновременно запускать несколько ресурсоемких графических приложений, например, Mozilla и OpenOffice, следует по крайней мере удвоить этот рекомендованный объем.
Если пользователи обращаются только к нескольким сотням мегабайт данных, но делают это часто, то для кэширования всех этих данных должно хватать оперативной памяти. Это радикально ускорит их работу.
Список свободных страниц (free list)
Список свободных страниц – это набор страниц, из которого страницы извлекаются по запросу процессов. Управление распределением памяти между процессами основано на этом списке. Процессы берут память из него и возвращают ее обратно по завершении. Сканер страниц также возвращает память в список свободных страниц.
Каждый раз, когда процесс запрашивает память, происходит так называемая страничная ошибка (page fault). Страничные ошибки делятся на три типа.
Легкая страничная ошибка (minor page fault) Процесс попытался получить доступ к странице, которая была изъята сканером страниц, но пока еще не использована повторно другим процессом.
Значительная страничная ошибка (major page fault) Процесс пытается получить доступ к странице, изъятой сканером страниц, использованной повторно и в данный момент уже отданной другому процессу.
Ошибка копирования при записи (copy-on-write fault) Процесс пытается записать данные в страницу памяти, которая используется совместно с другими процессами
После загрузки системы вся виртуальная память распределяется между процессами постранично. Кроме того, в ядре инициализируется специальная таблица, в которой хранятся состояния страниц. Несколько мегабайт памяти ядро резервирует для себя, а оставшееся пространство отходит списку свободных страниц. В какой-то момент, когда процесс запрашивает память, из списка свободных страниц извлекается одна страница, которая поступает в распоряжение процесса. Такая схема, при которой память выдается по принципу "когда потребуется", называется выделением страниц по запросу (demand paging).
Если список свободных страниц уменьшается до размера lotsfree, ядро запускает специальный поток внутри себя – сканер страниц. Он начинает искать страницы, которые можно выгрузить на диск, чтобы увеличить размер свободной памяти и пополнить списоксвободных страниц. Дабы не выгрузить страницы, к которым часто обращаются, сканер страниц работает по двухшаговому алгориму. Просматривая оперативную память в порядке возрастания адресов, он очищает бит MMU – memory management unit (бит "используемости") для каждой страницы. Этот бит устанавливается, когда идет обращение к странице. Затем сканер страниц ведет просмотр далее, но через некоторое время проверяет бит используемости ранее просмотренных страниц, ожидая доступа к этим страницам и установки их битов используемости. Параметры slowscanи fastscan определяют то время, которое пройдет между очисткой бита MMU и его повторной проверкой, а именно:
slowscan – первоначальная частота сканирования. При увеличении этого значения сканер страниц выполняет меньше ненужных заданий, но делает больше работы;
fastscan – частота сканирования в ситуации, когда свободной памяти не осталось.
Далее демон страниц снова просматривает память. Если ссылочный бит какой-то страницы по-прежнему в исходном состоянии, то значит, к этой странице не обращались.
Те страницы, чей бит "используемости" не был изменен в течение некоторого времени, выгружаются на диск и освобожденная память пополняет список свободных страниц.
Некоторые страницы (например, принадлежащие разделяемым библиотекам) могут разделяться между многими процессами, и при записи в такую страницу возникает ошибка копирования при записи (copy-on-write fault). Как только это произойдет, из списка свободных страниц извлекается чистая страница и создается копия первоначальной разделяемой страницы для того процесса, который требовал записать данные; в дальнейшем процесс работает именно со своей копией разделяемой страницы. Когда процесс завершается, все его страницы, за исключением тех, которые он делил с другими процессами, возвращаются в список свободных страниц.
Как минимум мы должны представлять себе, что если программа vmstat сообщает о постоянной активности устройства свопинга, а частота сканирования страниц высока (а в Solaris 8 и более новых версиях она вообще должна быть близка к нулю в обычной ситуации), то следует подумать об уменьшении числа одновременно запущенных процессов или увеличении объема оперативной памяти.
![](https://www.google.com/images/icons/product/drive-32.png)
![](https://www.google.com/images/icons/product/drive-32.png)
![](https://www.google.com/images/icons/product/drive-32.png)