null

Где бы взять свободной памяти?!

Даже администратор-пионер знает, что пейджинг и свопинг — это основные способы операционной системы использовать оперативную память эффективно. Цель — замещать редко используемые страницы процессов и процессы целиком, другими, более нужными в данный момент. В Solaris для пейджинга все еще используется алгоритм, который получил название Clock Algoritm.

 

Суть его в следующем: c одинаковой скоростью на расстоянии handspreadpage по структурам страниц памяти (struct page) двигаются две стрелки fronthand и backhand. Если стрелка fronthand встречает страницу, у которой бит обращения установлен в 1 то она сбрасывает его в 0. Когда, позднее, стрелка backhand доходит до этой страницы, то она проверяет  бит обращения, если он установлен в 1 (то есть, процесс активно использует эту страницу) то страница исключается из данного цикла пейджинга. Если же бит остался равным нулю, то значит, что страница не так уж необходима в данный момент.

 

 

Ядро проверит не является ли данная страница блокированной в памяти, страницей ядра, shared-страницей, и освободит ее если она не была модифицирована или запишет в swap-область в противном случае.

 

Данный алгоритм опирается на значение следующих переменных: 

  • lotsfree — если количество свободной памяти (freemem) меньше этого значения (в страницах), то запускается процесс сканирования страниц
  • desfree — если freemem падает этого значения, то запускается механизм soft-swaping (выгрузка процесса целиком из памяти в случае его бездействия или ожидания более maxslp секунд)
  • minfree — минимальное количество памяти при котором система может нормально функционировать
  • throttlefree — если значение свободной памяти опустилось ниже throttlefree — то OC перестает выделять память пользователю и некритичным запросам ядра
  • pageout_reserve — все запросы на выделения памяти кроме запросов подсистемы пейджинга и свопинга блокируются
  • handspreadpages — расстояние в страницах между стрелками

Скорость сканирования и загрузка процессора сканера варьируется линейной интерполяцией от lotsfree до 0 при помощи следующих параметров:

  • slowscan — количество сканируемых страниц в секунду при свободной памяти > lotsfree

  • fastscan — количество сканируемых страниц в секунду при свободной памяти ~ 0

  • min_percent_cpu — минмальный процент загрузки CPU

  • max_percent_cpu — максимальный процент загрузки CPU

  • maxpgio — максимальное количество страниц выгруженных на диск в секунду

     

От версии к версии Solaris начальные значения этих переменных менялись, алгоритм подсчета находится в функции setupclock. Пионер-администратор может воспользоваться готовыми формулами расчетов здесь. Можно посмотреть текущие значения при помощи следующих команд (64 битное ядро):

 

#mdb -k << EOF
freemem?E
lotsfree?E
desfree?E
minfree?E
throttlefree?E
pageout_reserve?E
handspreadpages?E
deficit?E
slowscan?E
fastscan?E
min_percent_cpu?D
max_percent_cpu?D
EOF

 

В заключение, хочется отметить, что этот алгоритм хорошо себя показывал в течении 20 лет. Однако, в современных системах объем оперативной памяти серьезно вырос, появились новые типы дисков, и теперь старый добрый алгоритм не удовлетворяет новым требованиям. Основные проблемы - однопоточность и низкая скорость работы. Ждем изменений в новых версиях Solaris!