Понятие разделяемой памяти является общеизвестным в мире современных операционных систем. Например, когда программа запускается впервые, она разделяет всю свою память с родительской программой. Если же дочерняя или родительская программа пытается внести изменения в эту общую память, то ядро выделяет для этого новую область памяти, куда копирует изначальное содержимое и даёт возможность программе вносить изменения уже в эту новую область. Подобная технология известна, как копирование при записи.
Технология 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 комментария :
Извините за дилетанский вопрос, но рекомендуете ли вы использовать KSM для высоконагруженных серверов с большим числом одновременно активных пользователей?
Павел, KSM - это, всё-таки, технология для виртуализации, и её удобно применять, когда мы имеем дело с набором однородных и относительно стабильных ресурсов. Только в этом случае суммарный размер идентичных участков памяти может быть существенным и на нём можно провести оптимизацию.
В высоконагруженной системе стабильности скорее всего нет (опять же смотря какой характер нагрузки) и пользователи, которых, как Вы пишите, большое количество будут постоянно что-то менять (опять же не обязательно, ведь пользователи могут обращаться к какому-то статическому контенту).
Если Ваши сервера виртуальные, то, возможно, получите какой-то выигрыш за счёт слияния на операционных системах.
Отправить комментарий