Общая информация

Дедупликация — метод сжатия массива данных, основанный на исключении копий повторяющихся данных. Он может применяться для уменьшения объемов передаваемой информации и оптимизации использования имеющихся ресурсов. В системах виртуализации на базе KVM дедупликация реализована функцией ядра Linux — Kernel Same-page Merging (KSM). 

KSM позволяет ядру проверять две или более уже запущенные ВМ и побитово сравнивать используемые ими страницы памяти. Если какие-либо страницы идентичны, например общие библиотеки, то KSM сводит их к одной. Затем эта страница помечается как copy-on-write. Если содержимое страницы изменяется гостевой ВМ, то для этой ВМ создается новая страница.

Объединение страниц и хранение их в кэше или основной памяти позволяет KSM снизить количество промахов кэша и оптимизировать объем общей используемой ВМ памяти, что повышает производительность некоторых приложений и эффективность использования имеющихся ресурсов.

Важно помнить, что побитовое сравнение страниц памяти это задача, которая увеличивает нагрузку на процессор. Поэтому нужно учитывать рабочую нагрузку при настройке периодичности сканирования памяти KSM.

В Astra Linux запуск и настройка конфигураций KSM осуществляются службой ksmtuned. Кроме того, служба ksmtuned может получать уведомления от libvirt о создании или уничтожении гостевых ВМ, для запуска принудительной дедупликации памяти.

Установка службы ksmtuned

  1. Подключить к серверу управления образ установочного носителя Astra Linux. 
  2. Установить пакет ksmtuned командой:

    sudo apt install ksmtuned

  3. При необходимости в файле /etc/ksmtuned.conf можно настроить следующие параметры:

    ПараметрОписание
    KSM_MONITOR_INTERVALпромежуток между сканированиями в секундах
    KSM_SLEEP_MSECпромежуток между сканированием блоков данных в миллисекундах (сканирование происходит блоками по 16 ГБ)
    KSM_NPAGES_BOOSTколичество сканируемых страниц, которое будет прибавлено к текущему значению при превышении порога оставшейся свободной памяти
    KSM_NPAGES_DECAYшаг уменьшения количества страниц, когда свободной памяти окажется больше, чем установлено в пороговых значениях
    KSM_NPAGES_MINминимальное количество страниц, которые будут просканированы и объединены
    KSM_NPAGES_MAXмаксимальное количество страниц, которые будут просканированы и объединены
    KSM_THRES_COEF

    значение объема оставшейся оперативной памяти для запуска KSM в процентах

    KSM_THRES_CONSTзначение объема оставшейся оперативной памяти для запуска KSM в мегабайтах

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

    В выводе отображены тестовые значения параметров. При настройке дедупликации памяти значения параметров необходимо планировать и рассчитывать индивидуально, исходя из ресурсов системы.

    KSM_MONITOR_INTERVAL=60
    KSM_SLEEP_MSEC=10
    KSM_NPAGES_BOOST=300
    KSM_NPAGES_DECAY=-50
    KSM_NPAGES_MIN=64
    KSM_NPAGES_MAX=1250
    KSM_THRES_COEF=20
    KSM_THRES_CONST=2048
    LOGFILE /var/log/ksmtuned
    DEBUG=1
    CODE
  4. Проверить результат установки службы ksmtuned командой:

    сat /sys/kernel/mm/ksm/run
    Пример вывода после успешного выполнения команды:

    1
    CODE
  5.  Проверить результат работы службы ksmtuned можно выполнив команду:

    watch virsh node-memory-tune
    Пример вывода после выполнения команды:

    Совместно используемая память:
    		shm_pages_to_scan 300
     		shm_sleep_millisecs 02
     		shm_pages_shared 121
     		shm_pages_sharing 10819
     		shm_pages_unshared 64
     		shm_pages_volatile 306551
     		shm_full_scans 1
     		shm_merge_across_nodes 1
    CODE
    ПараметрОписание

    shm_pages_to_scan

    количество страниц в очереди на сканирование
    shm_sleep_millisecsвремя ожидания до следующего сканирования
    shm_pages_shared количество используемых объединенных страниц
    shm_pages_sharing количество дедуплицированных страниц
    shm_pages_unsharedколичество уникальных страниц, выявленных при сканировании
    shm_pages_volatileколичество быстро изменяющихся страниц, непопадающих в дерево
    shm_full_scansколичество выполненных полных сканирований
    shm_merge_across_nodesпараметр, указывающий могут ли страницы из разных узлов NUMA быть объединены