Ежегодно Google проводит мероприятие Google Summer of Code, на котором ведущие проекты OpenSource находят среди студентов новых талантливых разработчиков.
В 2019 году нашему проекту ЦНИИУ удалось не только пройти отборочный тур, но и привлечь сразу несколько молодых разработчиков.
О цели всего этого и о том, как проходила работа над CRUI в рамках GSoC, читайте.
У нас в Virtuozzo есть небольшой, но уже достаточно популярный проект под названием 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 2019 стала разработка и внедрение так называемых бинарных журналов.
Дело здесь в следующем: при работе CRIU утилита записывает сообщения о своей работе в файл (или на экран, но лучше писать в файл).
Значение этих сообщений огромно! Если процедура сохранения или восстановления по каким-то причинам не завершается успехом, то единственный способ понять причину – это максимально подробно проанализировать каждый шаг, а для этого необходима информация о работе утилиты.
В идеале для расследования необходимы максимально подробные журналы и файлы изображений, если таковые имеются.
На практике такие требования трудно удовлетворить.
Для получения максимально подробных логов в CRIU предусмотрен соответствующий режим, и подавляющее большинство пользователей (а может, и все) всегда его активируют. Но объем информации, который criu генерирует в процессе работы, настолько огромен, что само логирование начинает существенно влиять на скорость работы системы.
Небольшое исследование показало, что мы тратим 90% времени на логирование операций форматирования вывода — то есть на «тех» %d, s, %.
2f и других модификаторов семейства функций printf. Отключение журналов сокращает время сохранения и восстановления процессов на 10–30 процентов, в зависимости от размера самих процессов.
Чтобы отключить использование такого количества системных ресурсов для логирования, но оставить логи такими же информативными, мы решили избавиться от форматирования и сохранять двоичные данные в лог-файлах.
Ведь при необходимости их можно будет отформатировать позже.
Эту задачу выполнил второй студент, патчи которого тоже уже приняты в ветку разработки.
И не только в GSoC
Кстати, еще один интересный факт об участии в GSoC — к нам пришел третий студент и выразил желание решить проблему анонимизации.Ведь зачастую получить файлы-образы невозможно из-за того, что они содержат секретную информацию, которой пользователь справедливо не хочет ни с кем делиться – содержимое памяти, файлы, с которыми работает процесс, содержимое очередей в сетевые подключения и так далее.
Чтобы решить эту проблему, мы добавили в наше приложение функцию под названием «анонимизация изображений», но Google ее не принял.
Однако тема оставалась актуальной, и студент, который хотел изучить ее в рамках GSoC, в итоге решил поработать над вопросом самостоятельно, вне мероприятия Google.
Заключение
Это определенно был положительный опыт участия в GSoC. Наш инструмент CRIU, который мы очень любим и ценим, получил еще пару мощных импульсов развития и стал еще более зрелым и удобным.Так что всем, кому это может быть полезно, наслаждайтесь! С другой стороны, мы убеждены, что вопрос участия в подобных мероприятиях – это вопрос настойчивости и уверенности в своем проекте.
Если вам нужны разработчики, просто не уставайте подавать заявки и формулировать новые интересные темы.
Возможно, вы найдете совершенно неожиданных авторов из другой страны или даже из другой компании.
Теги: #linux #разработка Linux #Google #открытый исходный код #criu #живая миграция #gsoc
-
Интерактивный Тур-Конструктор
19 Oct, 24 -
Работа И Успех (?) Часть 2 - Секрет
19 Oct, 24 -
Api Рабочего Пула
19 Oct, 24