Лимит IOPS и насыщение очереди IOPS limit / queue saturation
ID причины dk-iops · Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера, Команда инфраструктуры · Инфраструктура БД
Если запросов больше, чем диск может обработать за секунду, очередь растёт и задержка резко увеличивается.
Почему Запросы на чтение и запись приближаются к пределу производительности диска → Следствие Очередь растёт (обычно резко при утилизации от 90%) → На экране Задержки сохранения и загрузки, а при синхронных вызовах фризы
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера, Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Объединять запросы, кэшировать часто читаемые данные, делать ввод-вывод асинхронным, чтобы игровой поток не ждал диск.
Команда инфраструктуры: задачи
Серверы и ОС: более быстрые диски, проверка лимитов дисковой пропускной способности и IOPS для типа инстанса, алерты на утилизацию и очередь диска, копирование больших файлов в часы низкой нагрузки. Серверы БД: алерты на утилизацию IOPS и пропускной способности дисков БД, проверка дисковых лимитов конфигурации инстанса БД.
Цифры для ориентира
HDD около 150 IOPS, SATA SSD десятки тысяч, NVMe сотни тысяч. Стандартный облачный диск (AWS gp3) даёт 3 000 IOPS и 125 MiB/s, и если копирование большого файла исчерпывает лимит на объём передачи в секунду, который не зависит от IOPS, застревают даже мелкие записи.
На графике
Упор в лимит (плато) · IOPS, длина очереди к диску
Где смотреть
Смотреть r/s, w/s, rkB/s, wkB/s, aqu-sz, r_await и w_await в iostat -x 1. В облаке смотреть VolumeReadOps, VolumeWriteOps, VolumeQueueLength в EBS и признаки превышения лимита VolumeIOPSExceededCheck и VolumeThroughputExceededCheck, а со стороны инстанса InstanceEBSIOPSExceededCheck и InstanceEBSThroughputExceededCheck
Подтверждает
Число запросов или объём передачи в секунду выходит на плато на значении лимита, а aqu-sz и await вместе взлетают. В облаке метрики проверки превышения равны 1
Опровергает
Даже при %util 100% запас может оставаться, если await низкий. На SSD и RAID, которые обрабатывают запросы параллельно, %util не означает упор в лимит. Если лимит не достигнут, а высок только await, это собственная задержка диска (dk-hdd) или fsync (dk-fsync)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
В облаке помимо лимитов диска есть лимиты дисковой пропускной способности и IOPS для каждой конфигурации сервера (типа инстанса). Даже если подключить дорогой диск, на маленьком сервере всё упрётся в лимит инстанса.
Источники
Exos X18 Data SheetSeagate Случайное чтение блоками 4K на серверном HDD 7 200 rpm: 170 IOPS (QD16)
D3-S4520 SSDSolidigm Серверный SATA SSD: случайное чтение и запись блоками 4 KB до 92K/48K IOPS
Amazon EBS General Purpose SSD volumesAWS Базовая производительность gp3: 3 000 IOPS и 125 MiB/s, это два отдельных лимита, каждый можно увеличить независимо
Amazon EBS-optimized instance typesAWS Для каждого типа инстанса есть свои базовые и максимальные лимиты EBS по пропускной способности, объёму передачи и IOPS
iostat(1) — Linux manual pagesysstat -x: r/s и w/s, rkB/s и wkB/s, aqu-sz (прежнее название avgqu-sz), r_await и w_await, %util. На RAID и современных SSD, которые обрабатывают запросы параллельно, %util не показывает предел производительности
Amazon CloudWatch metrics for Amazon EBSAWS VolumeIOPSExceededCheck и VolumeThroughputExceededCheck: 1, если была попытка превысить лимит IOPS или объёма передачи тома (инстансы Nitro), VolumeQueueLength