Перезагрузка отменяется… опять!
«Каждый день я дожидаюсь перезагрузки сервера и фиксирую результаты».
Последний раз, когда я это писал (кстати, вы читали мою предыдущую запись? Она очень интересная!), автоматическая перезагрузка сервера Tranquility по выходным занимала примерно 4 минуты и 20–40 секунд: этой паузы как раз хватило бы на то, чтобы наскоро выпить чашечку чая. Сегодня же, полтора года спустя, время перезагрузки сократилось до 3 минут и 34 секунд: теперь, чтобы выпить чаю, придётся немного ускориться (я замерил специально для этой записи). Учитывая все технические улучшения, внедрённые с 2019 года, отключение сервера на 3 минуты и 30–40 секунд — вполне ожидаемая цифра.
Я мог бы взять эту разницу в 50–60 секунд, то есть в 22,5%, между декабрём 2019 года и июлем 2021 года и с помощью этого потрясающего научного графика рассчитать,
как долго будет длиться перезагрузка сервера 19 декабря 2026 года. Однако всё несколько сложнее, чем кажется. Итак, у нас есть нижняя граница в условные 3 минуты, в течение которых происходят три разных процесса: выключение, работа с базой данных и запуск. Каждый из них длится примерно минуту, если, конечно, мы не вносим серьёзные изменения, самым важным из которых стало бы отсутствие самой необходимости в перезагрузке. На самом деле даже при лучшем раскладе перезагрузка будет длиться чуть менее 160–200 секунд. Наша цель — не сократить время перезагрузки сервера, а проводить её всё реже и реже, а затем и вовсе её исключить. Тем не менее я решил начать эту статью с конкретного примера, который показывает наши успехи в снижении времени перезагрузки. Новый эксперимент для оценки работы сервера без его автоматического отключения запланирован на 9 сентября.
На этот раз мы преследуем четыре основные цели:
- проверить, насколько хорошо мы исправили ошибки, обнаруженные в ходе первого эксперимента;
- убедиться, что с предыдущего раза ни один код или функция не «поломались», а также выявить иные проблемы;
- оценить объёмы потребления памяти;
- удостовериться, что наша техническая платформа (мы расскажем о ней позднее) не «привязывает» функционал игры к перезагрузке сервера.
Думаю, вам не терпится узнать, что же мы обнаружили в прошлый раз.
В первую очередь мы заметили, что перезапуск сервера — важное событие, знаменующее начало ежедневного цикла. Без него мы столкнулись с рядом проблем: к примеру, сбивались 24-часовые таймеры сооружений, а корпорации не могли присоединиться к межгосударственным войнам. Мы исправили все ошибки, найденные нами и пользователями. Теперь мы собираемся проверить всё ещё раз (мы уже проводили тестирование, но не в масштабах Tranquility), а заодно поискать и другие сходные проблемы.
Кроме того, тогда мы столкнулись с рассинхронизацией времени (исправлено) и излишним потреблением памяти (исправлено частично).
Мы знали, что столкнёмся с рассинхронизацией времени, так что хотели посмотреть, заметят ли её игроки к окончанию второго дня. Желательно, чтобы расхождение во времени составляло приблизительно полсекунды, однако в 2019 году даже на самых мощных компьютерах мы наблюдали рассинхронизацию в 2,25 секунды в конце цикла
и — предсказуемо — в 4,5 секунды к завершению второго дня. Игроки начали замечать расхождение во времени, когда оно превышало 3 секунды. Прежде всего, это выражалось в задержке или сбоях функционирования модулей, когда клиент игры и серверный узел, обслуживающий звёздную систему, не могли синхронизировать цикл работы бортового оборудования. Сейчас расхождение во времени составляет примерно 0,01 секунды — ниже условного максимума в полсекунды.
Известно, что сервер Tranquility задействует много памяти устройства. Поэтому для повышения производительности мы всегда выбирали предварительное вычисление значений и обработку данных с последующим сохранением результатов для дальнейшего использования, а не регулярный перерасчёт этих значений. Например, проекты «Мозги в банке» и «Изменение догматов», которые мы запускали в 2015 году, были посвящены вычислению и хранению навыков и их эффектов (образно выражаясь, «мозгов» персонажей) и передаче результатов этих подсчётов между звёздными системами. Таким образом, отпадала необходимость повторных вычислений при посещении каждой новой системы. Кроме того, мы никогда не проводим чистку памяти, поскольку память узлов и так ежедневно сбрасывается при перезагрузке сервера (примечание: конечно, мы не очищаем кэш-память Redis или нашей базы данных, однако основная кэш-память игры также сбрасывается при перезапуске).
Самые «загруженные» узлы отвечают за звёздное скопление Tranquility. Так, узлы обслуживания персонажей, хранящие, кроме всего прочего, те самые «мозги», которые я упоминал выше, в прошлый раз использовали 75% памяти к концу второго дня, что немногим ниже максимально допустимого значения в 80%. Принимая во внимание данные 2019 года, мы могли бы обеспечить бесперебойную работу скопления Tranquility в течение 3 дней и, возможно, ещё 7 часов, пока «загруженность» одного из узлов не дошла бы до 100%. В 2019 году потребление памяти составило 55% в первый день, однако сегодня это значение упало до 35%, так что мы хотим продолжить наблюдения и пересмотреть предыдущие выводы.
Отказ от перезапуска сервера — наша конечная цель, и мы постепенно движемся к ней, улучшая техническую сторону игры. Так, мы уже несколько лет работаем над технической платформой, поддерживающей микросервисы и сервисные шины, и уже начали использовать её для некоторых задач. Сейчас мы планируем оценить, как эта экосистема работает в главном звёздном скоплении без перезагрузки сервера, и убедиться, что ни одна функция не зависит от этой ежедневной процедуры.
Приглашаем вас на второй эксперимент «Неотключаемый сервер», который начнётся 9 сентября. И да, как и в прошлый раз, скоро вас ждёт новое видео. Мы объединили все свои силы в этом героическом рывке.