Очевидно - решение в тонкой настройке демона ksmd, который занимается поиском и слиянием (merging) страниц памяти с одинаковым содержимым для высвободжения памяти. Настройки демона хранятся в файле /etc/ksmtuned.conf.
Помогает увеличение интервала KSM_SLEEP_MSEC до 100 милисекунд:
KSM_SLEEP_MSEC=100
Значение остальных параметров:
KSM_MONITOR_INTERVAL - временной интервал в секундах между сканированиями.
KSM_SLEEP_MSEC - временной интервал в милисекундах между сканированиями кусков по 16Gb. текущее значение можно найти тут: /sys/kernel/mm/ksm/sleep_millisecs
KSM_NPAGES_BOOST - число страниц, на которое будет увеличено количество сканируемых страниц при достижении порогов заданных параметрами KSM_THRES_*
KSM_NPAGES_DECAY - число страниц, на которое будет уменьшено количество сканируемых страниц при достижении порогов заданных параметрами KSM_THRES_*
KSM_NPAGES_MIN - минимальное число страниц памяти, которое сканируется всегда.
KSM_NPAGES_MAX - максимальное число сканируемых страниц
KSM_THRES_COEF - порог количества свободной памяти в процентах, при достижении которого запускается процесс сканирования и слияния.
KSM_THRES_CONST - порог количества свободной памяти в килобайтах, при достижении которого запускается процесс сканирования и слияния.
Текущий размер страницы памяти можно получить так:
getconf PAGE_SIZE
На сервере с объемом памяти 32Gb я использую такие значения:
KSM_SLEEP_MSEC=1000
KSM_THRES_COEF=50
Перезапустить демон ksmd можно такой командой:
sudo service ksmtuned restart