Математическое моделирование изменения рабочего набора процесса для интегральной живой миграции (1187402), страница 6
Текст из файла (страница 6)
Проблема overrunПри восстановлении posix-таймеров найдена проблема восстановления overrun. То-есть не существует системного интерфейса чтобы во первых узнать точное количество итераций таймера когда сигналы заблокированы, во вторых нет интерфейса для восстановления этого значения,по этому для некоторых ситуаций одно измерение таймера попадающеена момент сохранения и восстановления может быть фальсифицировано,но далее таймер будет работать как и должен. Для исправления ситуации в будущем необходимо изменить интерфейсы ядра для работы сoverrun.4.1.4.
ТестированиеТестирование реализации поддержки таймеров стандарта POSIX проводилось с помощью специального теста из пакета ZDTM, который былнаписан для подобной функциональности реализованной в OpenVZ иадаптирован с учетом проблемы overrun.4.2. ДедупликацияДля осуществления живой миграции в CRIU предусмотрен механизмсоздания итеративных снимков.
При создании итеративных снимков памяти в CRIU, на каждой итерации накапливаются новые данные, то-естьсуммарный объем занимаемый итеративными снимками все время увеличивается. Что по прохождении большого количества итераций может35привести к росту объема снимков на порядок.
Так как живая миграция подразумевает максимальную оптимальность передачи, сохраненияи восстановления, для хранения снимков предлагается использовать оперативную память. Но указанный рост объема памяти занимаемого снимками препятствует этому решению. Для решения проблемы нехватки памяти и вследствие не оптимальности процесса миграции был предложени реализован алгоритм дедупликации итеративных снимков. Для осуществления этой функциональности использован API Sparce file.4.2.1. Разряженный файлРазряженный файл(Sparce file) - тип файла, который хранит данныев файловой системе более эффективно если в нем существуют последовательности подряд идущих нулевых байт [11].
Вместо таких последовательностей хранятся только их метаданные. При чтении все замененныеблоки представляются как реальные блоки заполненные нулевыми байтами.Большинство современных файловых систем поддерживают разряженные файлы, например: NTFS, ext4, tmpfs. В основном такие файлы используются для хранения образов дисков и снимков баз данных.Преимуществом использования разряженных файлов является эффективность использования памяти - место выделяется, только если онодействительно нужно. Минусом же является фрагментация файловойсистемы.Используемым интерфейсом для работы с разряженными файламиявляется функция fallocate() [9].
Она реализована в операционной системе Линукс, и позволяет напрямую манипулировать пространством файла, выделять и освобождать пространство. Используя флаг FALLOC_FL_PUNCH_HOLE можно освобождать выбранный блок в файле.4.2.2. Файловая система tmpfsЭто специальная файловая система во многих UNIX-подобных операционных системах.
Позволяет монтировать файловую систему размещаяее в оперативной памяти вместо физического диска [11]. Применяется в36данной работе для хранения образов памяти, это позволяет убрать задержку записи на диск в процессе передачи памяти при миграции, чтопотенциально увеличивает скорость миграции на порядок учитывая характеристики скорости чтения/записи для современных дисков и оперативной памяти.
Она полностью поддерживает функционал разряженныхфайлов.4.2.3. АрхитектураВ CRIU память сохраняется блоками pagemap entry - записями, которые образуются из зон виртуальной памяти(Virtual Memory Area), соответствующие записям страницы записываются в файл снимка подрядв порядке соответствующем порядку записей. Для прохода по даннымзаписей CRIU вычитывает записи, и проматывает файл страниц на соответствующий кусок данных.
Часть записей имеют пометку in_parent,то-есть, для их поиска нужно спустится в родительский снимок, для нихв текущем снимке не хранится данных. Это те страницы которые не изменились с момента предыдущего снимка.При сохранении очередного снимка, во-первых открывается деревородительских образов. При поступлении записи с грязными страницами,вызывается рекурентная функция дедупликации, которая идет в родительский образ, находит все записи пересекающиеся с грязной записью,и если они не помечены in_parent, то запускает на них функцию освобождения блока. Дальше для найденных пересекающихся записей вызывается функция дедупликации, и так до изначального снимка. Такимобразом для всех новых записей все старые записи будут очищены и память занимаемая ими отдана системе.
Есть условие, что алгоритм, прииспользовании для итеративной миграции, должен быть применен накаждой итерации.При восстановлении из итеративных снимков процесс спуска в родительский снимок уже реализован, остается только использовать на ужевосстановленных блоках функцию освобождения блока.Функция освобождения блока использует накопление, то-есть освобождает блок не сразу, а запоминает его, при приходе подряд идущихсоседних блоков они запоминаются как один большой блок. Накопление37идет до 1Мб, чтобы одновременно получить хорошую производительность и эффективно очищать снимки для достижения минимальногоразмера занимаемой памяти все время.Используя данный алгоритм, так же очищаются записи которые были освобождены сохраняемой программой, так как очевидно они будутпройдены мимо алгоритмом, так как они не пересекаются или пересекаются только частично с записями в снимке-ребенке.
При таком проходемимо на них запускается рекурсивная функция дедупликации.В результате был реализован алгоритм поиска старых страниц памяти встроенный в CRIU в процедуры снятия итеративного снимка ивосстановления из снимков. Для этого были изменены функции чтенияснимков на восстановлении и добавлена аналогичная функция в сохранении.
В процессе реализации были найдены и исправлены ошибки вподсистеме работы с памятью, применены оптимизации.4.2.4. ТестированиеДля всех компонентов функционала дедупликации были написанытесты сохранности памяти при различных сценариях использования памяти и интегрированы в ZDTM. На основе системы непрерывной интеграции Jenkins, постоянно запущено автоматическое тестирование сслучайно использующими память тестами.Так же проведены тесты использования памяти в процессе миграции.Они показали эффективность использования памяти при использованиифункции дедупликации, и обратную ситуацию иначе.Методика заключалась в следующей последовательности действий:1. монтируется файловая система tmpfs для хранения снимков на целевой виртуальной машине;2.
устанавливается тестовое приложение, активно загружающее RAMисходной виртуальной машины;3. производится две итеративные миграции тестового приложения навторую виртуальную машину, соответственно с включенной и выключенной дедупликацией;38Рис. 4.1: Тестирование дедупликации394. измеряется с помощью программы disk usage занимаемое образамипространство.Получено два графика: график размера занимаемой образами памятибез дедупликации и график размера занимаемой памяти с дедупликацией снимков.Из результатов тестирования видно, что при итеративной миграциибез использования дедупликации памяти, занимаемое образами пространство в несколько больше чем при ее использовании.Данный алгоритм, реализованный как компонент CRIU, показал теоретически предсказанную пространственную эффективность, то-есть позволил сократить суммарное использование памяти снимками до размера одного рабочего набора программы.
Что осуществлено, не только вовремя создания снимков, но и во время восстановления, это можно заметить на конце графика “С дедупликацией” на пятой секунде, во времявосстановления приложения происходит синхронное сокращение занимаемой снимками памяти, за счет уже восстановленных и, таким образом,ненужных блоков.Тестирование дедупликации так же принесло пользу в аспекте проверки работы механизма сохранения памяти в снимки в CRIU. Былинайдены ряд ошибок реализации, и исправления этих недостатков быливнесены в код проекта.4.3.
Живая миграцияБыл разработан алгоритм прогнозирования момента окончания итеративной миграции и реализован для CRIU с целью обоснования. В задаче прогнозирования можно выделить две подзадачи:1. Мониторинг динамики насыщения рабочего набора процесса;2. Оптимизация времени простоя при миграции, на основе аналитически проанализированных данных мониторинга.4.3.1. МониторингСуществуют различные способы мониторинга используемой процессом памяти (например, утилиты ps, page-collect), но они не достаточно40точны и неприменимы для анализа памяти процесса в произвольныймомент времени. Такие способы в основном дают возможность получитьинформацию об общем размере виртуальной памяти, используемой процессом, и о размере предоставленной физической памяти, но для анализаэтого не достаточно.Командой CRIU в апреле 2013г.
в ядро Linux была добавлена функциональность, позволяющая отслеживать использование памяти процессом, называемая soft-dirty tracking. С помощью soft-dirty tracking, используя файловую систему procfs, можно, включить отслеживание памяти на уровне ядра системы. После этого можно получать битовую маскупамяти процесса, проанализировав которую, выделить страницы памяти, изменившиеся при работе процесса и оставшиеся в том же состоянии,что и в момент включения опции.Это позволяет проводить мониторинг насыщения рабочего набора,т.е. именно то, что необходимо для миграции. Изначально эта функциональность была добавлена для определения «грязной» памяти присоздании итеративных снимков программ. Но ее можно также успешноиспользовать для подготовительного мониторинга.4.3.2.
Отслеживание грязной памятиОтслеживание грязной памяти реализовано в ядре операционной системы Линукс, как один из интерфейсов файловой системы procfs [12].Для включения отслеживания грязной памяти процесса достаточно записать 4 в файл /proc/<pid>/clear_refs. При этом ядро сбросит битыв метаданных страниц в состояние “чистая” страница, и также отметитвсе страницы процесса как защищенные от записи. Таким образом если процесс будет читать некоторую страницу своей памяти произойдетpage-fault(страничная ошибка), который будет обработан ядром, и страница будет помечена как “грязная”.