Поддержи Openmeetings

пятница, 28 февраля 2014 г.

Технология KSM (Kernel SamePage Merging)

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

Технология KSM (Kernel SamePage Merging) представляет собой новую возможность в Linux, которая использует понятие разделяемой памяти наоборот. KSM даёт возможность ядру исследовать две и более уже запущенных программы, чтобы сравнить их память. Если некоторые области памяти или страницы идентичны, то KSM сводит их в одну (см. Рисунок 1). После этого данная страница помечается флагом «копирование при записи». Если теперь одной из программ нужно изменить содержимое, то для этого создаётся новая страница.

Рисунок 1. Сервис KSM

Данная возможность полезна при виртуализации с использованием KVM. Гостевая виртуальная машина при запуске наследует только память от родительского процесса qemu-kvm. После того, как гостевая виртуальная машина запущена, содержимое образа её операционной системы можно разделить с другими гостевыми машинами, которые используют такую же операционную систему или те же приложения. KSM определяет и объединяет только те страницы памяти, которые не влияют на работу гостевой виртуальной машины и не компрометируют безопасность как физической машины-гипервизора, так и других гостевых машин. KSM позволяет KVM требовать, чтобы идентичные области памяти гостевых виртуальных машин были общими. Экспериментальная реализация KSM от Red Hat показала, что 52 виртуальных экземпляра Windows XP с 1 Гб памяти могут работать на компьютере с 16 Гб оперативной памяти.

KSM обеспечивает лучшее использование памяти и ускоряет её работу. При использовании KSM общие данные реже вымываются из кэша процессора и из основной памяти. Это сокращает количество «промахов» кэша при работе гостевых машин, за счёт чего увеличивается производительность приложений и операционных систем. Кроме того, совместное использование памяти уменьшает общий объем памяти, необходимый гостевым машинам, что позволяет «плотнее» использовать существующие ресурсы.

KSM и NUMA

Начиная с Red Hat Enterprise Linux 6.5, KSM работает с NUMA (Non-Uniform Memory Access). Данная возможность позволяет KSM при объединении страниц принимать в расчёт топологию NUMA. Это предотвращает случаи, когда страницы размещаются на удалённых узлах, и связанные с удалённым размещением проблемы производительности.

Red Hat рекомендует не выполнять объединение одинаковых страниц, если эти страницы находятся на разных узлах NUMA. Для этого необходимо установить настраиваемый параметр /sys/kernel/mm/ksm/merge_nodes в 0. Почему? Внутренние счетчики ядра могут начать противоречить друг другу после большого количества межузловых слияний. В результате, демон numad может запутаться. Если ваша система имеет большое количество свободной памяти, можно достичь более высокой производительности за счет отключения и деактивации демона KSM. Обратитесь к Руководству по настройке производительности Red Hat Enterprise Linux для получения дополнительной информации о NUMA.

Сервисы KSM

Для управления KSM в Red Hat Enterprise Linux есть два сервиса:

  • Сервис ksm запускает и останавливает тред KSM ядра.
  • Сервис ksmtuned контролирует сервис ksm, динамически управляя слиянием страниц. Сервис ksmtuned запускает сервис ksm и останавливает его, если памяти и так достаточно. Для поднастройки KSM, например, когда создаётся или уничтожается гостевая машина, следует вызвать service ksmtuned retune.

Оба этих сервиса контролируются с помощью стандартных инструментов управления сервисами.

Сервис KSM

Сервис ksm входит в состав пакета qemu-kvm. По умолчанию KSM отключен в Red Hat Enterprise Linux 6. Однако, при использовании Red Hat Enterprise Linux 6 в качестве хоста KVM, он, как правило, включается сервисами ksm и ksmtuned.

Когда сервис ksm не запущен, KSM использует не более 2000 разделяемых страниц. Значение по умолчанию невелико и даёт лишь незначительный выигрыш в сохранении памяти.

Когда же сервис ksm запущен, то KSM будет разделять до половины основной памяти системы той физической машины, на которой он размещён. Запустите сервис ksm, чтобы KSM использовал больше разделяемых страниц памяти.

# service ksm start
Starting ksm:                                         [  OK  ]

Сервис ksm может быть добавлен в автозагрузку по умолчанию. Сделайте сервис ksm постоянным с помощью команды chkconfig.

# chkconfig ksm on

Сервис настройки KSM

У сервиса ksmtuned нет никаких опций. Сервис ksmtuned зацикливает и регулирует ksm. Сервис ksmtuned уведомляется процессом libvirt, когда создаётся или уничтожается гостевая виртуальная машина.

# service ksmtuned start
Starting ksmtuned:                                    [  OK  ]

Если вызвать service ksmtuned retune, сервис ksmtuned перечитает конфигурационный файл и перезапустит настройку. Перед тем, как приступить к описанию параметров в файле, необходимо прояснить термины:

  • npages — сколько страниц ksm будет сканировать до того, как ksmd уйдёт в спящий режим, устанавливается в /sys/kernel/mm/ksm/pages_to_scan;
  • rsz — сумма памяти всех процессов qemu-kvm, в Кбайтах;
  • thres — порог активации, в Кбайтах; цикл KSM срабатывает, когда сумма thres + rsz превышает общий объём системной памяти.

Файл /etc/ksmtuned.conf является конфигурационным файлом для сервиса ksmtuned. Ниже представлено содержимое файла ksmtuned.conf по умолчанию (с переведенными для удобства русскоязычного читателя комментариями).

# Конфигурационный файл для ksmtuned.

# Сколько секунд ksmtuned ждет между корректировками
# KSM_MONITOR_INTERVAL=60

# Ожидание в миллисекундах между сканированиями для 16Gb сервера.
# Меньший сервер ожидает больше, больший сервер ожидает меньше.
# KSM_SLEEP_MSEC=10

# KSM_NPAGES_BOOST добавляется к значению `npages`,
# когда `free memory` меньше чем `thres`
# KSM_NPAGES_BOOST=300

# KSM_NPAGES_DECAY вычитается из `npages`, 
# когда `free memory` больше, чем `thres`
# KSM_NPAGES_DECAY=-50

# KSM_NPAGES_MIN нижний предел для значения `npages`
# KSM_NPAGES_MIN=64

# KSM_NAGES_MAX верхний предел для значения `npages`
# KSM_NPAGES_MAX=1250

# KSM_TRES_COEF – процент оперативной памяти, 
# которому полагается равным `thres`
# KSM_THRES_COEF=20

# На системах с небольшим количеством памяти
# KSM_THRES_CONST - нижняя граница для `thres`
# KSM_THRES_CONST=2048

# раскомментируйте следующее, 
# чтобы включить информацию об отладке ksmtuned 
# LOGFILE=/var/log/ksmtuned
# DEBUG=1

Переменные KSM и мониторинг

KSM сохраняет данные мониторинга в директории: /sys/kernel/mm/ksm/. Файлы в этой директории обновляются ядром и представляют точную картину использования KSM. Каждый из следующих файлов содержит одно числовое значение, позволяющее определить текущий статус сервиса:

  • full_scans — число запусков полного сканирования;
  • pages_shared — общее количество слитых страниц;
  • pages_sharing — число слитых страниц на текущий момент.
  • pages_to_scan — число страниц, которые еще не были просканированы;
  • pages_unshared — общее число слитых страниц, которые разделили в связи с записью новых данных;
  • pages_volatile — число слитых страниц, которые был разделены, на текущий момент;
  • run — запущен ли сервис KSM;
  • sleep_millisecs — сколько миллисекунд KSM ожидает следующего запуска.

Результаты деятельности по настройке KSM сохраняются в лог /var/log/ksmtuned, если строка DEBUG=1 добавлена в файл /etc/ksmtuned.conf. Местоположение лог-файла можно изменить с помощью параметра LOGFILE. Изменение местоположения лог-файла не рекомендуется и может потребовать особой конфигурации SELinux.

Остановка KSM

KSM снижает производительность, что может оказаться важным, например, при недостаточной мощности процессора. Этот сервис можно деактивировать, остановив сервисы ksmtuned и ksm. Остановка сервисов деактивирует KSM до момента перезагрузки.

# service ksmtuned stop
Stopping ksmtuned:                                     [  OK  ]
# service ksm stop
Stopping ksm:                                          [  OK  ]

Чтобы деактивировать KSM с сохранением этого статуса после перезагрузки, используйте команду chkconfig:

# chkconfig ksm off
# chkconfig ksmtuned off

Не экономьте на файле подкачки

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

Перевод с английского Chapter 8. Red Hat Enterprise Linux 6 Virtualization Administration Guide

2 комментария :

Alexei комментирует...

Извините за дилетанский вопрос, но рекомендуете ли вы использовать KSM для высоконагруженных серверов с большим числом одновременно активных пользователей?

Alexei комментирует...

Павел, KSM - это, всё-таки, технология для виртуализации, и её удобно применять, когда мы имеем дело с набором однородных и относительно стабильных ресурсов. Только в этом случае суммарный размер идентичных участков памяти может быть существенным и на нём можно провести оптимизацию.
В высоконагруженной системе стабильности скорее всего нет (опять же смотря какой характер нагрузки) и пользователи, которых, как Вы пишите, большое количество будут постоянно что-то менять (опять же не обязательно, ведь пользователи могут обращаться к какому-то статическому контенту).
Если Ваши сервера виртуальные, то, возможно, получите какой-то выигрыш за счёт слияния на операционных системах.

Отправить комментарий