Опубликован: 19.10.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Европейский Университет в Санкт-Петербурге
Лекция 1:

Оптимизация работы процессов

Лекция 1: 1234 || Лекция 2 >

Список свободных страниц (free list)

Список свободных страниц - это набор страниц, из которого страницы извлекаются по запросу процессов. Управление распределением памяти между процессами основано на этом списке. Процессы берут память из него и возвращают ее обратно по завершении. Сканер страниц также возвращает память в список свободных страниц так, как это описано в лекции 7 в разделе "Алгоритм пейджинга ".

Каждый раз, когда процесс запрашивает память, происходит так называемая страничная ошибка2Перевод термина page fault дан по книге [ 3 ] (page fault). Страничные ошибки делятся на три типа:

  1. Легкая страничная ошибка (minor page fault) - процесс попытался получить доступ к странице, которая была изъята сканером страниц, но пока еще не использована повторно другим процессом.
  2. Значительная страничная ошибка (major page fault) - процесс пытается получить доступ к странице, изъятой сканером страниц, которая использована повторно и в данный момент уже отдана другому процессу.
  3. Ошибка копирования при записи (copy-on-write fault) - процесс пытается записать данные в страницу памяти, которая используется совместно с другими процессами.

О том, как реализовано управление списком свободных страниц в Solaris, говорится в лекции 7. Сейчас нам важны некоторые основные моменты, связанные с производительностью процессов.

После загрузки системы вся виртуальная память распределяется между процессами постранично. Кроме того, в ядре инициализируется специальная таблица, в которой хранятся состояния страниц. Несколько мегабайт памяти ядро резервирует для себя, а оставшееся пространство отходит списку свободных страниц. В какой-то момент, когда процесс запрашивает память, из списка свободных страниц извлекается одна страница, которая и поступает в распоряжение процесса. Такая схема, при которой память выдается по принципу "когда потребуется", называется выделением страниц по запросу (demand paging).

Если список свободных страниц уменьшается до размера lotsfree (см. лекцию 7), ядро запускает специальный поток внутри себя - сканер страниц. Он начинает искать страницы, которые можно выгрузить на диск с тем, чтобы увеличить размер свободной памяти и пополнить список свободных страниц. Дабы не выгрузить страницы, к которым часто обращаются, сканер страниц работает по двухшаговому алгориму. Просматривая оперативную память в порядке возрастания адресов, он очищает бит MMU (бит "используемости") для каждой страницы. Этот бит устанавливается, когда идет обращение к странице. Сканер страниц ведет просмотр далее, но через некоторое время проверяет бит используемости ранее просмотренных страниц, ожидая доступа к этим страницам и установки их битов используемости. Параметры slowscan и fastscan определяют то время, которое пройдет между очисткой бита MMU и его повторной проверкой так, как это описано в лекции 7, а именно:

  • slowscan - первоначальная частота сканирования. При увеличении этого значения сканер страниц выполняет меньше ненужных заданий, но делает больше работы.
  • fastscan - частота сканирования в ситуации, когда свободной памяти не осталось.

Если при повторном просмотре ссылочный бит какой-то страницы по-прежнему в исходном состоянии, это значит, что к данной странице не обращались.

Те страницы, чей бит "используемости" не был изменен в течение некоторого времени, выгружаются на диск, и освобожденная память пополняет список свободных страниц.

Некоторые страницы (например, принадлежащие разделяемым библиотекам) могут разделяться между многими процессами, и при записи в такую страницу возникает ошибка копирования при записи (copy-on-write fault). Как только это произойдет, из списка свободных страниц извлекается чистая страница и создается копия первоначальной разделяемой страницы для того процесса, который требовал записать данные; в дальнейшем процесс работает именно со своей копией разделяемой страницы. Когда процесс завершается, все его страницы, за исключением тех, которые он делил с другими процессами, возвращаются в список свободных страниц.

О статистических показателях пейджинга и свопинга, говорящих о нехватке памяти в системе, речь пойдет в лекции 7. Сейчас же мы должны представлять себе, что если программа vmstat сообщает о постоянной активности устройства свопинга, а частота сканирования страниц высока (в Solaris 8 и более новых версиях она вообще должна быть близка к нулю в обычной ситуации), то следует подумать об уменьшении числа одновременно запущенных процессов или об увеличении объема оперативной памяти.

Рекомендации по запуску демонов

Всегда запускайте ровно столько демонов, сколько требуется. Например, если компьютер не является сервером NFS, не следует создавать файл /etc/dfs/dfstab, так как при его наличии автоматически запускается некоторое количество сетевых демонов. Мало того, что ненастроенные демоны могут дать злоумышленнику незапланированный доступ к компьютеру, так они еще и память занимают. Всегда используйте

ps -ef

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

Некоторые программы, такие как web-сервер Apache или прокси-сервер squid, запускают несколько процессов, размножая самих себя или вспомогательные службы для увеличения производительности. По умолчанию количество запускаемых ими процессов сделано "средним", т.е. для слабо нагруженной системы оно слишком велико, а для перегруженной внешними запросами - слишком мало. Постарайтесь установить оптимальное значение - так вы сможете выиграть от нескольких мегабайт до нескольких десятков мегабайт памяти.

Лекция 1: 1234 || Лекция 2 >
Алексей Антипин
Алексей Антипин
Россия, Томск, ТУСУР, 2010
Игорь Тарасенко
Игорь Тарасенко
Россия