한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L12 База данных

Медленные команды Redis Redis blocking commands (single-threaded)

ID причины db-redis-block · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Redis обрабатывает команды по одной, поэтому одна медленная команда блокирует все запросы за ней.

Почему В рабочее время выполняется полный перебор через KEYS, рейтинг или список из миллионов элементов читается или удаляется целиком → Следствие Пока команда не закончится, все остальные запросы ждут (от десятков ms до нескольких секунд) → На экране Одновременно подвисают функции, которые используют сессии, рейтинги и кэш, задерживается вход

Симптомы
Фриз, Задержка ввода, Ошибка входа / бесконечная загрузка
Факторы
Остановка, Задержка
У кого
Весь сервер, Только одна функция
Когда
Изредка, случайно, С постоянным периодом
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Инфраструктура БД
Команда разработки: задачи
Использовать SCAN вместо KEYS, дробить большие ключи, удалять через UNLINK (фоновое удаление), разносить время истечения ключей, которое приходится на одну и ту же секунду.
Команда инфраструктуры: задачи
Следить за журналом медленных команд (SLOWLOG), запретить опасные команды вроде KEYS на боевых серверах, регулярно проверять большие ключи, отключить THP и держать запас памяти для fork, сохранять RDB и AOF на реплике.
Цифры для ориентира
Обычная команда выполняется меньше чем за 1 ms. Операция над миллионами элементов за раз может занять от сотен ms до нескольких секунд.
На графике
Случайные всплески · задержка ответа Redis, число медленных команд
Где смотреть
Через SLOWLOG GET смотреть команды дольше slowlog-log-slower-than, включить монитор задержек (по умолчанию выключен) через CONFIG SET latency-monitor-threshold и смотреть задержки по событиям вроде fork и expire-cycle в LATENCY LATEST и LATENCY DOCTOR. Время fork и большие ключи проверять по latest_fork_usec в INFO и через redis-cli --bigkeys
Подтверждает
В момент подвисания в SLOWLOG есть KEYS или команды, которые целиком обрабатывают большой ключ, либо в LATENCY в то же время записаны события fork или expire-cycle на десятки ms и больше
Опровергает
Если SLOWLOG и LATENCY пусты, а медленно только со стороны игрового сервера, дело в сети или в ожидании внутри игрового сервера (SLOWLOG измеряет только время выполнения команды без обмена данными с клиентом)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Redis останавливается и в момент, когда для создания файла сохранения (снапшота RDB) или перезаписи AOF копирует процесс (fork). На современных серверах это около 10 ms на 1 GB памяти, то есть для 30 GB около 300 ms. Если включены большие страницы (THP), после fork каждая запись копирует большую страницу целиком (copy-on-write), и паузы и потребление памяти сильно растут, поэтому THP обычно отключают и держат большой запас памяти. Когда в одну и ту же секунду истекает очень много ключей, Redis тоже ненадолго останавливается, чтобы их удалить.

Источники

  1. Diagnosing latency issues Redis
    Запросы по очереди обрабатывает один поток, и медленная команда блокирует всё за ней, SCAN вместо KEYS, fork по измерениям на физических серверах и современных ВМ занимает около 9–13 ms на 1 GB, THP из-за копирования после fork резко увеличивает задержки и память, массовое истечение ключей в одну секунду вызывает остановку
  2. KEYS Redis
    В боевой среде использовать с крайней осторожностью, на большой базе может убить производительность (на бюджетном ноутбуке 40 ms на 1 000 000 ключей)
  3. UNLINK Redis
    Асинхронное удаление: ключ сразу отсоединяется, а память освобождается в другом потоке
  4. SLOWLOG Redis
    Журнал медленных команд записывает команды дольше slowlog-log-slower-than, время выполнения не включает ввод-вывод при обмене с клиентом
  5. Redis latency monitoring Redis
    latency-monitor-threshold по умолчанию 0 (выключен), LATENCY LATEST и LATENCY DOCTOR, запись задержек по событиям вроде fork и expire-cycle
  6. INFO Redis
    latest_fork_usec: длительность последнего fork (в микросекундах)
  7. Redis CLI Redis
    --bigkeys: просматривает пространство ключей и находит большие ключи

Смотрите также

Тот же слой: L12 База данных

Причины с тем же симптомом (Фриз) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами