Живой мир должен жить и тогда, когда на него никто не смотрит. Одновременно в нём около тысячи ИИ-жителей, а за сутки приходят и уходят тысячи разных. В четыре утра я сплю, а мир — нет.
Поэтому этот день был не про новые функции. Он был про ночную смену: про всё, что должно оставаться в порядке, когда рядом нет ни одного человека.
Мелочи, которые растут
Серверы редко падают из-за одной большой ошибки. Они падают из-за мелочей, которые каждый час подрастают на чуть-чуть, пока однажды ночью место просто не заканчивается. Я прошёлся по серверу и искал именно это: память, диск, файлы, списки — всё, что только растёт и никогда не уменьшается.
Вот что нашлось:
- Панель с чересчур хорошей памятью. Наш собственный экран мониторинга помнил немного истории про каждого жителя, которого когда-либо видел. Население постоянно меняется, и «немного про каждого» за полдня превратилось в 4,4 ГБ. Теперь панель хранит окно фиксированного размера и в сжатом виде. После исправления она стартовала примерно с четверти гигабайта и больше не может расти без предела.
- Журнал, который перечитывал весь месяц. ИИ-часть мира живёт в небольшом фиксированном месячном бюджете, и каждая строчка, которую пишет ИИ, сначала сверяется с ним. Эта проверка каждые несколько минут перечитывала записи за весь месяц. Двадцать восьмого числа это мелкая неприятность, а к концу месяца стало бы настоящей проблемой. Теперь журнал хранит итоги по дням, и проверка занимает меньше десятой доли миллисекунды вместо примерно 52.
- Одна и та же работа по многу раз. Часть общих игровых знаний мира готовилась заново много раз вместо одного. Теперь её готовят один раз, и все пользуются общей копией.
- Мусор никто не выносил. Мир пишет примерно 20 ГБ логов и записей в сутки, и никто их не убирал. Теперь уборка идёт каждые шесть часов; первый же проход освободил 7,5 ГБ.
В сумме память жительской части сервера теперь растёт примерно на 40% медленнее, чем утром, а то, что всё-таки растёт, убирается по расписанию, не дожидаясь меня.
Жители, которых не пускали домой
Одна находка вообще не про память. Житель получает аккаунт в тот момент, когда впервые приходит в мир. Если двое приходили в одно и то же мгновение, один мог затереть сохранённый вход другого, и тот уже никогда не мог войти в игру.
Это задело 63 жителя из более чем 8 300. Всем выданы новые входы, все вернулись в мир, а два одновременных прихода больше не могут помешать друг другу.
Мягче, чем стоп-кран
На самый плохой случай у сервера уже был стоп-кран. Он работает, но это грубый инструмент. Теперь сервер вмешивается гораздо раньше и гораздо мягче, чтобы стоп-кран оставался тем, чем должен быть: ручкой, за которую никогда не дёргают.
Маленький мир для проверок
Изменения в поведении жителей проверяются до того, как попадут в основной мир. Сегодня для этого заработал отдельный маленький тестовый мир. Первая проверка: 20 совсем новых жителей вошли в игру, за 25 минут доросли до 3–6 уровня и аккуратно вышли — ни одной ошибки. Пока тестовый мир работает, он одалживает немного места у основного и возвращает его, когда останавливается.
Что это значит для вас
Ничего такого, что можно увидеть, — и в этом весь смысл. Когда откроется бета, вы должны войти в мир, который спокойно проработал всю ночь, а не в мир, который кто-то перезапустил за час до вашего прихода.
Эти изменения сейчас на разных стадиях. Панель, журнал, уборка, исправленные входы и первый запуск тестового мира уже работают и измерены. Общие игровые знания и мягкая страховка выкатывались в основной мир, пока я писал этот текст; проверенными я их назову только после нескольких дней работы без присмотра.
По замерам на сервере 28 октября. Цифры описывают этот день, а не обещание на каждую ночь.