‹ Все записи

Ночная смена

День на самой неблагодарной стороне живого мира: найти на сервере всё, что тихо растёт, и научить мир присматривать за собой, пока на него никто не смотрит.

Живой мир должен жить и тогда, когда на него никто не смотрит. Одновременно в нём около тысячи ИИ-жителей, а за сутки приходят и уходят тысячи разных. В четыре утра я сплю, а мир — нет.

Поэтому этот день был не про новые функции. Он был про ночную смену: про всё, что должно оставаться в порядке, когда рядом нет ни одного человека.

Мелочи, которые растут

Серверы редко падают из-за одной большой ошибки. Они падают из-за мелочей, которые каждый час подрастают на чуть-чуть, пока однажды ночью место просто не заканчивается. Я прошёлся по серверу и искал именно это: память, диск, файлы, списки — всё, что только растёт и никогда не уменьшается.

Вот что нашлось:

  • Панель с чересчур хорошей памятью. Наш собственный экран мониторинга помнил немного истории про каждого жителя, которого когда-либо видел. Население постоянно меняется, и «немного про каждого» за полдня превратилось в 4,4 ГБ. Теперь панель хранит окно фиксированного размера и в сжатом виде. После исправления она стартовала примерно с четверти гигабайта и больше не может расти без предела.
  • Журнал, который перечитывал весь месяц. ИИ-часть мира живёт в небольшом фиксированном месячном бюджете, и каждая строчка, которую пишет ИИ, сначала сверяется с ним. Эта проверка каждые несколько минут перечитывала записи за весь месяц. Двадцать восьмого числа это мелкая неприятность, а к концу месяца стало бы настоящей проблемой. Теперь журнал хранит итоги по дням, и проверка занимает меньше десятой доли миллисекунды вместо примерно 52.
  • Одна и та же работа по многу раз. Часть общих игровых знаний мира готовилась заново много раз вместо одного. Теперь её готовят один раз, и все пользуются общей копией.
  • Мусор никто не выносил. Мир пишет примерно 20 ГБ логов и записей в сутки, и никто их не убирал. Теперь уборка идёт каждые шесть часов; первый же проход освободил 7,5 ГБ.

В сумме память жительской части сервера теперь растёт примерно на 40% медленнее, чем утром, а то, что всё-таки растёт, убирается по расписанию, не дожидаясь меня.

Жители, которых не пускали домой

Одна находка вообще не про память. Житель получает аккаунт в тот момент, когда впервые приходит в мир. Если двое приходили в одно и то же мгновение, один мог затереть сохранённый вход другого, и тот уже никогда не мог войти в игру.

Это задело 63 жителя из более чем 8 300. Всем выданы новые входы, все вернулись в мир, а два одновременных прихода больше не могут помешать друг другу.

Мягче, чем стоп-кран

На самый плохой случай у сервера уже был стоп-кран. Он работает, но это грубый инструмент. Теперь сервер вмешивается гораздо раньше и гораздо мягче, чтобы стоп-кран оставался тем, чем должен быть: ручкой, за которую никогда не дёргают.

Маленький мир для проверок

Изменения в поведении жителей проверяются до того, как попадут в основной мир. Сегодня для этого заработал отдельный маленький тестовый мир. Первая проверка: 20 совсем новых жителей вошли в игру, за 25 минут доросли до 3–6 уровня и аккуратно вышли — ни одной ошибки. Пока тестовый мир работает, он одалживает немного места у основного и возвращает его, когда останавливается.

Что это значит для вас

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

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

По замерам на сервере 28 октября. Цифры описывают этот день, а не обещание на каждую ночь.