ID причины dk-fsync · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда инфраструктуры · Инфраструктура БД
Запрос записать данные на диск «гарантированно» занимает от 0,1 ms до десятков ms в зависимости от диска, а когда таких запросов много, очередь растёт.
Почему Периодические сохранения и массовый выход из игры дают пачку запросов на гарантированную запись → Следствие Очередь к диску растёт → На экране Лаги в моменты сохранения, задержки при выходе из игры и смене канала
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Группировать сохранения (несколько сохранений на один fsync), разносить сохранения по времени.
Команда инфраструктуры: задачи
Серверы и ОС: серверные SSD с защитой от потери питания, мониторинг длины очереди к диску и задержки fsync. Серверы БД: если сохранения идут в БД, диск журнала БД тоже на таком SSD, мониторинг задержки коммитов.
Цифры для ориентира
Время одного вызова зависит от оборудования, но примерно так: серверный SSD (с защитой от потери питания) 0,1 ms, обычный SSD от 1 до нескольких ms, облачный диск 1–2 ms, HDD 10 ms и больше. Если один поток ждёт вызовы по одному, HDD не успевает выполнить и 100 вызовов в секунду.
На графике
Всплески с постоянным периодом · длина очереди к диску, задержка сброса (flush) и записи
Где смотреть
Накладывать на время периодических сохранений и выходов из игры f/s и f_await из iostat -x 1 (число сбросов, обработанных диском, и их длительность), а также w/s, aqu-sz и w_await. Старые версии sysstat показывают aqu-sz как avgqu-sz. Для облачного диска смотреть VolumeQueueLength и VolumeAvgWriteLatency в EBS
Подтверждает
В моменты сохранений и массового выхода число сбросов и длина очереди растут вместе, w_await и f_await в несколько раз выше обычного. В это время задерживаются сохранения и смена канала
Опровергает
Если очередь растёт в моменты, не связанные с сохранениями и выходами, это бэкап или сжатие (dk-backup) либо лимит IOPS (dk-iops). Если число сбросов прежнее, а всё замедлилось, вероятнее исчерпание burst-кредитов (dk-burst)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Источники
fsync(2) — Linux manual pageLinux man-pages fsync сбрасывает в том числе кэш диска и блокирует вызов, пока устройство не сообщит о завершении
Reliability (PostgreSQL Documentation)PostgreSQL У обычных SATA-дисков и многих SSD есть кэш записи, который теряется при отключении питания, поэтому для гарантированной записи нужен кэш с батареей или защитой от потери питания
Amazon EBS General Purpose SSD volumesAWS Задержка стандартного облачного диска (gp3): единицы ms, у io2 Block Express в среднем меньше 500 µs на операцию размером 16 KiB
iostat(1) — Linux manual pagesysstat -x: f/s и f_await (число запросов на сброс, обработанных диском, и их среднее время), w/s, w_await, aqu-sz (прежнее название avgqu-sz)
Amazon CloudWatch metrics for Amazon EBSAWS VolumeQueueLength (число запросов, ожидающих завершения), VolumeAvgWriteLatency (средняя задержка записи за 1 минуту, инстансы Nitro)