понедельник, 12 ноября 2012 г.

Сколько вешать в граммах?

Введение

Есть такой вопрос: сколько выделить оперативной памяти для виртуальной машины, в которой "крутится" серверная ОС с (фиксированным) серверным приложением (AKA appliance)? Этот вопрос возникает регулярно, чаще всего при создании этой самой ВМ.
Как я понимаю, к этому вопросу, как правило, сисадмины подходят либо чисто механически — находят в документации по главному приложению минимальные и рекомендуемые требования по памяти, и выставляют обозначенное количество, либо интуитивно, "на глаз".
Но у скрупулёзных представителей нашего вида может возникнуть желание (и даже зуд!) узнать точно, сколько памяти необходимо и достаточно данному приложению. Тут уже нужен научный подход!
(На всякий случай, поясню, что этот параметр тянет вверх такое бытовое соображение, что "чем больше памяти, тем лучше", а вниз — реальное количество памяти на физических машинах и бюджет виртуальной инфраструктуры.)

Задача и предполагаемое решение

Итак, имеем виртуальную машину с серверным приложением, работающую в нормальном режиме. Требуется узнать, какой минимальный объём оперативной памяти обеспечит её нормальное функционирование.
Решать задачу можно по-разному:
  • найти формулу, подставив в которую параметры текущей системы, можно получить нужное число. Я такой формулы не знаю, и думаю, что она сродни "серебряной пуле", и в природе не существует
  • выяснить эмпирически
Для экспериментального решения нужны методы измерения "нормального функционирования" и, желательно, хорошая экспериментальная установка. Если экспериментальная установка будет плохой, то сам эксперимент превратится из удовольствия в тяжкий труд.

Параметр нормальной работы в условиях ограниченной ОЗУ

В современных системах недостаток оперативной памяти восполняется разделом подкачки (swap). А свободное место в оперативной памяти используется под кэши дисков. Поэтому ориентироваться на объём свободной ОЗУ — весьма неточный подход. В самом деле, в наше время большинство систем, включая даже некоторые встраиваемые системы, в режиме нормальной работы "отсвопливают" часть памяти, принадлежащей работающим программам и файловым системам, размещающимся в ОЗУ (AKA Tmpfs).
Системы, которым не хватает ОЗУ отличаются интенсивной работой с разделом подкачки. Такие системы "задыхаются", постоянно работая с диском, записывая и читая куски памяти, часто одни и те же.
Посмотреть интенсивность работы с подкачкой можно простой командой (Linux):
iostat `tail -n +2 /proc/swaps | cut -d\  -f1`
Возможно даже, что параметра tps хватит, чтобы провести "достаточно научный" эксперимент.

Экспериментальная установка

Чтобы проводить реальные эксперименты, необходимо:
  • иметь возможность запускать ВМ с разным кол-вом памяти (в идеале — возможность автоматически перезапускать)
  • измерять и фиксировать рабочий параметр
Как говорится, "начать и закончить".
Кроме того, чтобы добавить наукообразия, замечу, что для эффективного экспериментирования нужно выработать алгоритм выбора входного параметра (объём RAM). По сути, это задача нахождения корня функции (второй производной воображаемой функции нормального функционирования от кол-ва ОЗУ). Соответственно кандидатами для алгоритма будут метод Ньютона и тому подобные, изучаемые на первом или втором курсе профильного ВУЗа.

Заключение

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