Этот вопрос остается одним из большинства самых задаваемых для тех, кто только начал администрировать Solaris. Для примера рассмотрим график orca(см.ниже), на котором хорошо видно, как сервер, имея после загрузки около 2 с лишним Gb свободной памяти, в середине ночи теряет около 1Gb и память освобождается только после перезагрузки сервера (следующий подъем на графике). Виновником этого, судя по всему, является скрипт бэкапа системы (с помощью tar архивируются все наиболее важные директории). Скрипт запускается в 3:30 (как раз в это время на графике начинается падение) и работает всего около 5-7 минут. Почему же система по окончании работы скрипта не освобождает память?
Ответ кроется в механизме управления памятью
Solaris. Если запустить архивацию заново, мы заметим, что теперь скрипт отработает быстрее, чем в первый раз, и с меньшей дисковой активностью. Прикладной код и файлы данных процесса архивации находятся все еще в памяти, даже при том, что они не активны. Память, которую они занимают, не является "свободной". Если мы перезапускаем скрипт, он использует страницы, которые уже содержатся в памяти. Если запустить другое приложение, и системе в этот момент будет нехватать свободной памяти, то ядро будет искать страницы, незадействованные в течение долгого времени, и "освобождать" их. Ядро старается избегать дисковых чтений, кэшируя так много файлов, насколько позволяет память, и это оправдано - обращение к странице в памяти приблизительно в 1000 раз быстрее, чем чтение с диска. Впервые такой механизм работы с памятью был опробован в 1988, в
SunOS 4.0, а начиная с
Solaris 8, он был значительно усовершенствован.
Кому интересно, эта тема более развернуто освещается в
статье Эдриана Кокрофта, в которой к тому же подробно разбирается жизненный цикл отдельной физической страницы памяти.