Page Sharing в VMware vSphere
Одно из преимуществ виртуализации, возможность совместного использования физических ресурсов разными задачами, в том числе памяти.
Механизм Page Sharing в VMware vSphere позволяет экономить память за счет совместного использования идентичных страниц памяти.
Методика очень простая. Если две или более страниц памяти абсолютно совпадают, то в физической памяти остается только одна страница. Естественно, если гостевая ОС захочет изменить этот фрагмент памяти, то ей будет создана копия, в которой и будут произведены изменения.
Превосходное решение. Учитывая, что гостевые ОС чаще всего однотипные, с одинаковыми ядрами, драйверами, иногда и приложениями, то зачем все это дублировать в физической памяти, которой никогда не бывает много.
Однако есть одно но. По умолчанию, гипервизор выделяет память большими блоками (Large Pages). Естественно, найти совпадающие блоки размером в 1 МБ в гостевых ОС практически нереально, что и видно на практике. Подобное решение понятно, задачи бывают разные, а от гипервизора требуется максимальная производительность, и использование больших страниц позволяет более эффективно использовать ресурсы процессоров хоста. Однако, что делать, если на хосте оказалось больше свободных ресурсов процессора, чем памяти?
В случае, если на хосте процессор нагружен слабо, но виден явный недостаток памяти, можно отключить режим Large Pages в гипервизоре.
Для этого, нужно изменить настройку хоста:
Mem.AllocGuestLargePage = 0
Настройку можно изменить как в vSpere Client, так и через CLI интерфейс.
~ # esxcfg-advcfg --get /Mem/AllocGuestLargePage
Value of AllocGuestLargePage is 1
~ # esxcfg-advcfg --set 0 /Mem/AllocGuestLargePage
Value of AllocGuestLargePage is 0
Или настройку конкретной виртуальной машины:
monitor_control.disable_mmu_largepages = TRUE
Естественно, не стоит ждать моментального увеличения shared памяти у виртуалок. Память им уже выделена, да и TPS нужно время для сканирования памяти. Если очень хочется увидеть изменения побыстрее, то можете мигрировать машины с хоста и вернуть их обратно, в случае кластера проще всего просто перезагрузить хост. Но не забывайте, что даже после этого, гипервизору нужно время на сканирование всей памяти виртуалок.
И здесь тоже есть настройки, которые могут ускорить этот процесс. В некоторых конфигурациях, например в случае виртуализированных десктопов, имеет смысл пересмотреть дефолтные настройки:
Mem.ShareScanTime
— desired time in minutes to scan entire VM. Т.е. периодичность полного сканирования всей памяти в виртуальной машине. Значение по умолчанию 60, диапазон возможных значений 10-600.
Mem.ShareScanGHz
— max page scan rate in MB/sec per GHz of host CPU, 0 to disable. Скорость сканирования. Значение по умолчанию 4, диапазон возможных значений 0-32.
Mem.ShareRateMax
— per-VM upper limit on pshare scan/check rate in pages/sec. (0 to disable). Значение по умолчанию 1024, диапазон возможных значений 0-32768.
Подробности здесь и здесь. Абсолютно монументальная статья: Memory management. Подобнее о TPS.
Дополнение.
Механизм TPS будет отключен по-умолчанию:
- ESXi 5.5 Update release – Q1 2015
- ESXi 5.1 Update release – Q4 2014
- ESXi 5.0 Update release – Q1 2015
- VMware ESX 6.x и более поздние версии.
Но можно будет включить в ручную:
Для хоста нужно установить Mem.ShareForceSalting = 1
, и для каждой VM установить одинаковый sched.mem.pshare.salt
отличный от нуля.
Либо установить Mem.ShareForceSalting = 0
и тогда TPS будет включен для всех VM на хосте.
Дополнительная информация тут Additional Transparent Page Sharing management capabilities and new default settings (2097593).