Pull to refresh

Обновляем ядро без перезагрузки

Reading time2 min
Views22K
Сегодня я хочу рассказать о моей самой любимой фиче в последнем релизе Parallels Cloud Server — rebootless update, или обновление без перезагрузки.

Перезагрузка — это простой сервера и потеря состояния текущих активностей. Она нежелательна для сервера, которым пользуется большое количество людей. На данный момент есть популярная технология Ksplice, где изменения накатываются на живую систему. Это ненадежно, не каждое обновление удается так накатить. И вообще, нет гарантий, что проблемный код не успел наследить. Еще одна немаловажная проблема в том, что разработчики с неохотой берутся за баги после таких обновлений. Кто его знает, что в этой солянке варилось.

Мы в Parallels подошли к проблеме с другой стороны и решили сделать все по-честному. По-честному — значит перезагрузить ядро, но так чтоб этого никто не заметил. Самый быстрый способ накатить новое ядро — воспользоваться kexec. Теперь вспомним, что и контейнеры, и виртуальные машины умеют сохранять свое состояние (suspend/resume, dump/restore, snapshot, etc). Таким образом если мы усыпим все виртуальные окружения, быстро перезагрузим ядро и восстановим окружения, пользователь заметит лишь небольшую задержку в обслуживании, которая будет похожа на проблемы сети. В первом приближении, так работает rebootless update.

Разработчики Parallels пошли дальше и существенно уменьшили время простоя виртуальных машин. В первую очередь была создана файловая система PramFS, похожая на tmpfs, но ее состояние сохраняется между перезагрузкой ядра через kexec. На эту файловую систему складываются состояния виртуальных машин и контейнеров. PramFS на несколько порядков быстрее диска, следовательно время сохранения и восстановления окружений существенно уменьшилось.

Сохранение состояния контейнера подразумевает сохранение всех его объектов (открытых файлов, сокетов, пайпов; таймеров; состояния процессов и т.д.) и пользовательской памяти. Следующий шаг оптимизации позволил оставить пользовательскую память и кэши файловых систем на том же месте, где они была до перезагрузки. Этот шаг так же позволил сократить время сохранения и восстановления контейнеров и сократить время простоя.

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

На данный момент эта фича доступна только пользователям Parallels Cloud Server, но у нас есть планы предложить эту функциональность Linux-сообществу. А сохранение и восстановление состояния контейнеров будет реализовано в рамках проекта CRIU.

www.parallels.com/products/pcs
en.wikipedia.org/wiki/Kexec
en.wikipedia.org/wiki/Ksplice
criu.org/Main_Page
Tags:
Hubs:
+52
Comments24

Articles

Change theme settings