Математическое моделирование изменения рабочего набора процесса для интегральной живой миграции (1187402), страница 3
Текст из файла (страница 3)
Системные вызовы из контекста сохраняемого процесса;4. Netlink socket interface - интерфейс мониторинга и управления сетевыми сокетами.Файловая система ProcfsФайловая система proc - это особая файловая система в Linux. Этовиртуальная файловая система, то-есть содержащиеся в ней файлы нехранятся на диске а являются своеобразными интерфейсами для получения текущего состояния ядра Linux. По умолчанию в Linux системахэта файловая система монтируется в директорию /proc. Если провестилистинг этой директории то можно увидеть большое количество фалов,каждый из них предоставляет возможность узнать о процессах, соответствующую информацию. При попытке чтения этих файлов ядро создаетнеобходимые данные с актуальной информацией о процессе.
При сохранении состояния процесса CRIU использует интерфес proc для получениятакой информации о процессе, как список созданных процессом таймеров (/proc/<pid>/timers), список открытых файлов по номерам файловых дескрипторов (/proc/<pid>/fd/<id>), информация об этих файлах:сдвиг в файле, режим доступа и статус (/proc/<pid>/fdinfo/<id>), тамже находится информация о дескрипторах нотификации о событиях, получения процессом сигналов, и многое другое. Полученные из proc данные позволяют получить и сохранить в образы, широкий спектр необходимых для восстановления данных, также они позволяют облегчитьдальнейший сбор информации об объектах.Напрмер для posix-таймеров, реализация поддержки которых былавводным заданием в проекте, чтение /proc/<pid>/timers дает возможность узнать количество созданных таймеров, ID каждого таймера, каким образом вызвавший процесс должен быть уведомлен о срабатывании4таймера, а также с какими часами связан таймер .
Все это необходимо4Нехватка последнего для восстановления таймеров была обнаружена в течение разработки идобавлена в ядро Linux, сейчас эта функциональность уже находиться в основном ядре.12для воссоздания posix-таймеров а также для получения дополнительнойинформации на последующих этапах сохранения снимка.Механизм контроля процессов PtracePrace это интерфейс ядра Линукс, который позволяет одному процессу “наблюдателю” рассматривать и контролировать исполнение другогопроцесса - “наблюдаемого”.
Он позволяет изучать и изменять память ирегистры наблюдаемого процесса. В основном его используют в программах для отладки(gdb, dbx), и отслеживания системных вызовов.В CRIU он используется для подключения к работающему приложению, его замораживания, записи и чтения блоков памяти в специальнонайденное свободное место в памяти приложения. При сохранении программы, после чтения из procfs информации о ядерных объектах, происходит подключение к приложению, записываются нужные данные впамять процесса, и запускается, так называемый, паразитный код, который используя эти данные до собирает информацию об объектах, ккоторой извне нет доступа.Далее происходит выход из контекста процесса, это подразумевает копирование полученных данных из памяти приложения и освобождениявсей занятой CRIU памяти.
Вся собранная информация записываетсяв снимки, и дальше необходимо разморозить процесс. Для разморозкииспользуется хитрый механизм, который восстанавливает состояние регистров и вычищает последний собственный код из памяти приложенияпутем создания специального прерывания. Данный подход позволяет получить необходимую дополнительную информацию и при этом не оставить следов подключения к приложению.Интерфейс SyscallВ режиме паразитного кода в контексте приложения используетсякомпактный код для извлечения дополнительных неизвестных данных осостоянии процесса с использованием обычных системных вызовов, тоесть вызовов, которыми обычное приложение могло бы считать нужнуюему для работы информацию.13Интерфейс NetlinkКомандой CRIU была разработана функциональность получения информации сетевых сокетов(tcp repair mode) и внедрена в ядро Линукс винтерфейс Netlink.
Она позволяет сохранять полное состояние сетевыхсокетов, что важно для живой миграции в которой требуется восстанавливать и сохранять сетевые соединения.1.2.2. Восстановление из снимковПри восстановлении приложения из снимка необходимо полное воссоздание состояния в котором пребывало сохраненное приложение.
Дляэтого используются все те же четыре интерфейса ядра Linux.Файловая система procfs позволяет не только считывать информацию о состоянии процесса, но и помогать при восстановлении объектовядра. Например, proc позволяет получить возможность восстановлениянекоторых объектов с заданным ID. Путем записи в специальный файлтребуемого ID объекта. При следующем создании такого объекта ядро создаст объект с данным ID, с ограничением, конечно, что этот IDдолжен быть изначально не занят.
Такой функционал существует в ядре Линукс например для семафоров(/proc/sys/kernel/sem_next_id), дляразделенной памяти(shm_next_id) и сообщений(msg_next_id). Все этовозможно в основном благодаря изменениям ядра Линукс внесеннымикомандой CRIU.С помощью системных вызовов воссоздаются объекты ядра используемые приложением.В конце восстановления используется Ptrace для того, чтобы аналогично как и на сохранении снимков “разморозить” приложение и очистить его контекст от следов CRIU, который его воссоздавал.Для воссоздания сетевых сокетов был добавлен в ядро механизм починки сокетов(tcp repair mode) который позволяет их полностью воссоздавать используя интерфейс Netlink.141.3. ТестированиеCRIU это проект призванный увеличить надежность системы, по этому его тестированию отведено особенное внимание. Система CRIU находится под постоянным тестированием, на все реализованные в CRIUфункциональные части одновременно готовятся модульные тесты и внедряются в автоматически тестирующую систему ZDTM + Jenkins.
Также существуют некоторые отдельные тесты которые тестируют например RPC и сохранность памяти. Пакет тестирования дает существенныепоказатели покрытия кода, примерно 90% покрытия функций и 70% процентов покрытия кода.1.3.1. ZDTMZDTM это сокращение от Zero Down Time Migration [15]. Это система автоматического тестирования унаследованная проектом CRIU отOpenVZ, разработанная для тестирования работоспособности всех компонент отвечающих за миграцию. Система состоит из множества атомарных тестов - каждый переводит процесс в некоторое состояние: открывает файл, выделяет сегмент памяти, отправляет данные в пайп, запускаеттаймеры, и др.
Потом происходит сохранение и восстановление теста, азатем тест проверяет сохранность состояния: нужный файл открыт, выделенный сегмент памяти на месте, данные приходят из пайпа, таймерысрабатывают через правильный интервал.Данная система также имеет различные опции, например можно запускать тесты в выделенном пространстве имен, или хранить снимки впамяти, а не на диске. Система непрерывной интеграции через некоторые интервалы пересобирает проект из главного репозитория и прогоняет на нем тесты с различными параметрами. Такой подход позволяетподдерживать высокое качество кода CRIU.Проект также проходил тестирование членами команды CRIU нареальных приложениях, среди них: Apache, Nginx, MySQL, MongoDB,Oraсle, Make, gcc, tar, gzip, screen, LXC контейнеры, Java, VNC сервер.151.4.
ИспользованиеВозможный спектр вариантов использования CRIU довольно широк.1. Создание снимков для долго загружающихся приложений в концезагрузки, для последующего быстрого запуска, путем восстановления из снимка.2. Прелинковка больших библиотек.3. Создание снимка “за секунду до” для возможности расширеннойработы по устранению ошибок, или в качестве исчерпывающегосообщения об ошибке, для последующего воссоздания проблемына системе специалиста.4. Перенос приложений на высокопроизводительный кластер или нанизкопроизводительную систему в зависимости от ситуации.5. Создание резервных снимков, для восстановления при неисправностях.6.
При обнаружении тупиков и условий гонки, откат на предыдущийснимок и запуск в “безопасном” режиме.И основной целью которую воплощает CRIU является реализация живоймиграции приложений.16Глава 2. Дедупликация2.1. Проблема использования оперативнойпамяти при миграцииДля оптимизации процесса миграции была написана дополнительнаяфункциональность для CRIU для дедупликации образов памяти.
Даннаяфункциональность имеет непосредственную важность для осуществления живой миграции, поскольку для ускорения миграции, снимки памяти процесса решено хранить в оперативной памяти, иначе бы процессзанимал на порядки больше времени. Но при итеративной миграции программы создающей высокую нагрузку на оперативную память, за времяпередачи данных одного снимка может накапливаться большой объемновых измененных страниц памяти. При большом количестве итерацийобщий размер образов постоянно растет, даже при относительно постоянном размере рабочего набора, размер снимков может стать на порядокбольше чем размер первого снимка.
Так как, со временем, все данныене будут помещаться в оперативной памяти системы, появится отгрузкаданных на диск. И это нивелирует преимущества использования быстройоперативной памяти и уменьшит скорость миграции, которая должнабыть оптимальной для достижения живой миграции.При итеративной миграции, при получении новых измененных страниц данных, соответствующие данные в старых образах, в рамках живоймиграции уже не нужны, так как восстанавление напрямую из старыхобразов проводить не предполагается.
Старые снимки будут использованны только для «подхвата» не измененных страниц во время окончания миграции при восстановлении программы. Таким образом освобождение памяти от старых страниц в родительских образах не повлияет навосстановление в конце.172.2. АлгоритмБыл разработан алгоритм и внедрен в процесс снятия итеративногоснимка, который при получении нового блока данных находил старыеданные для этого блока, и очищал от них родительские снимки. Этафункциональность возможна благодаря механизму Sparce-файлов (разряженных файлов), он полностью поддерживается файловой системойtmpfs. Таким образом можно взять файл лежащий в оперативной памяти(на tmpfs) и в необходимом месте освободить определенный объемпамяти.
То-есть размер файла уменьшится, но при чтении из этого местафайловая система будет имитировать, что оно заполнено нулями.Теоретическая эффективность этого алгоритма основана на том, чтодля реального восстановления памяти процесса необходимо хранить небольше чем размер рабочего набора процесса, то-есть при использованииэтой технологии можно сократить многократно увеличивающийся объемпамяти до размера одного полного рабочего набора процесса.Этот же подход применим и при восстановлении процесса из снимка, так как снимок и процесс существуют в одной оперативной памятито чтобы минимизировать ее использование был реализован и внедрен впроцесс восстановления алгоритм дедупликации на восстановлении.