Опыт Участия В Gsoc: Как Два (Три) Студента Реально Улучшили Код Criu

Ежегодно Google проводит мероприятие Google Summer of Code, на котором ведущие проекты OpenSource находят среди студентов новых талантливых разработчиков.

В 2019 году нашему проекту ЦНИИУ удалось не только пройти отборочный тур, но и привлечь сразу несколько молодых разработчиков.

О цели всего этого и о том, как проходила работа над CRUI в рамках GSoC, читайте.



Опыт участия в GSoC: как два (три) студента реально улучшили код CRIU

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



Опыт участия в GSoC: как два (три) студента реально улучшили код CRIU

Мы начали этот проект еще в 2011 году.

И несмотря на то, что утилита изначально вызывала массу вопросов, а некоторые считали ее реализацию невозможной, CRIU постепенно превратился в зрелый инструмент. На сегодняшний день в нем приняли участие более полутора сотен участников из нескольких десятков компаний, включая таких гигантов, как Google и IBM. Несмотря на это, поиск новых участников продолжается, и в этом году мы наконец-то добрались до Google Summer of Code (GSoC).

GSoC — это ежегодное мероприятие, спонсируемое Google, цель которого — привлечь студентов к различным проектам с открытым исходным кодом.

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

Для поступления в GSoC команде необходимо подать заявку с указанием описания проекта, нескольких тем, над которыми могут работать студенты, и списка так называемых «наставников» — активных участников проекта, которые помогут студенту в его нелегкой работе.

работа.

Студентам необходимо выбрать один или несколько проектов и отправить резюме наставникам.

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

Летом начинаются работы и продолжаются три месяца.

Раз в 30 дней студенты сдают промежуточные отчеты, а их наставники оценивают результаты и дают рекомендации по продолжению (или прекращению) работы.



Оптимизация памяти и реализация двоичных журналов

Признаюсь, 2019 год был не первой нашей попыткой выйти на GSoC. Просто до этого момента нам так и не удалось пройти этап отбора проекта со стороны Google. Но мы не сдались (в общем-то, подать заявку несложно), и, наконец, нам это удалось — Google признала развитие нашего проекта важным и выпустила CRUI на GSoC. У нас было много тем для студентов, одна красивее и сложнее другой.

Приятным сюрпризом стало то, что для каждого из них в сообществе были свои исполнители.

Были люди, которые понимали поднятые вопросы и были готовы работать наставниками.

На этапе заявок студентов мы получили целый «конкурс» — на каждую тему подали заявки по 2 студента и почти у всех были отличные входные данные.

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

Поскольку CRIU — это система миграции живых приложений, у нее есть режим работы, в котором память, используемая процессом, считывается и записывается в файлы изображений параллельно с выполнением самого процесса.

Мы называем этот процесс «работой живого сердца», потому что он продолжает работать без остановки.

Перед раундом GSoC вся память вытягивалась в пайпы с помощью шумевшего в тот момент системного вызова vmsplice, а затем процесс продолжал выполнение, а CRIU медленно сбрасывал эту память в файлы (или в сетевой канал, если мы говорили о живая миграция).

В принципе, это рабочий подход, но проблема была в том, что память, находящаяся в пайпах, эффективно блокируется (mlock) и ядро не может выгрузить ее на диск (swap-out) в случае необходимости.

С архитектурной точки зрения мы хотели заменить пайпы копированием памяти небольшими порциями с помощью вызоваprocess_vm_readv. Это нововведение появилось в ядре Linux не так давно (кстати, у этого вызова есть брат-близнец под названиемprocess_vm_writev).

Но в то же время он позволяет значительно облегчить и ускорить, например, работу утилиты strace и отладчиков, которые могут возиться с памятью процессов для решения некоторых других задач.

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

Любая ошибка при сохранении страниц может привести к тому, что процесс получит несогласованное состояние своих внутренних объектов (о чем CRIU, естественно, ничего не «знает») и упадет после восстановления без какой-либо четкой диагностики.

Вторая сложность этой разработки заключалась в том, что в работе с памятью задействованы практически все «функции» ЦРИУ.

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

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



Опыт участия в GSoC: как два (три) студента реально улучшили код CRIU

Второй задачей в рамках GSoC 2019 стала разработка и внедрение так называемых бинарных журналов.

Дело здесь в следующем: при работе CRIU утилита записывает сообщения о своей работе в файл (или на экран, но лучше писать в файл).

Значение этих сообщений огромно! Если процедура сохранения или восстановления по каким-то причинам не завершается успехом, то единственный способ понять причину – это максимально подробно проанализировать каждый шаг, а для этого необходима информация о работе утилиты.

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

На практике такие требования трудно удовлетворить.

Для получения максимально подробных логов в CRIU предусмотрен соответствующий режим, и подавляющее большинство пользователей (а может, и все) всегда его активируют. Но объем информации, который criu генерирует в процессе работы, настолько огромен, что само логирование начинает существенно влиять на скорость работы системы.

Небольшое исследование показало, что мы тратим 90% времени на логирование операций форматирования вывода — то есть на «тех» %d, s, %.

2f и других модификаторов семейства функций printf. Отключение журналов сокращает время сохранения и восстановления процессов на 10–30 процентов, в зависимости от размера самих процессов.



Опыт участия в GSoC: как два (три) студента реально улучшили код CRIU

Чтобы отключить использование такого количества системных ресурсов для логирования, но оставить логи такими же информативными, мы решили избавиться от форматирования и сохранять двоичные данные в лог-файлах.

Ведь при необходимости их можно будет отформатировать позже.

Эту задачу выполнил второй студент, патчи которого тоже уже приняты в ветку разработки.



И не только в GSoC

Кстати, еще один интересный факт об участии в GSoC — к нам пришел третий студент и выразил желание решить проблему анонимизации.

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

Чтобы решить эту проблему, мы добавили в наше приложение функцию под названием «анонимизация изображений», но Google ее не принял.

Однако тема оставалась актуальной, и студент, который хотел изучить ее в рамках GSoC, в итоге решил поработать над вопросом самостоятельно, вне мероприятия Google.

Опыт участия в GSoC: как два (три) студента реально улучшили код CRIU



Заключение

Это определенно был положительный опыт участия в GSoC. Наш инструмент CRIU, который мы очень любим и ценим, получил еще пару мощных импульсов развития и стал еще более зрелым и удобным.

Так что всем, кому это может быть полезно, наслаждайтесь! С другой стороны, мы убеждены, что вопрос участия в подобных мероприятиях – это вопрос настойчивости и уверенности в своем проекте.

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

Возможно, вы найдете совершенно неожиданных авторов из другой страны или даже из другой компании.

Теги: #linux #разработка Linux #Google #открытый исходный код #criu #живая миграция #gsoc

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.