Производительность процессора Redis на отсортированных наборах


Мы запускаем redis и делаем сотни приращений в секунду ключей в сортированном наборе, и в то же время делаем тысячи считываний на сортированном наборе каждую секунду.

Это, кажется, работает хорошо, но во время пиковой нагрузки загрузка процессора становится довольно высокой, 80% от одного ядра. Сортированный набор сам по себе представляет собой небольшой объем памяти из нескольких тысяч ключей.

Является ли увеличение загрузки процессора вероятным из-за сотен приращений в секунду или тысяч операций чтения? поймите, что оба влияют на производительность, но какое из них оказывает большее влияние?

Учитывая это, каковы некоторые из лучших показателей для мониторинга на моем производственном экземпляре, чтобы рассмотреть эти узкие места?

1 3

1 ответ:

Один момент, чтобы проверить, являются ли сортированные наборы достаточно малы, чтобы быть сериализованы Redis или нет. Например, "debug object" может быть применен к образцу отсортированных наборов, чтобы проверить, закодированы ли они как ziplist или нет.

Ziplist использует торговую Память против процессора, особенно когда размер отсортированного набора близок к пороговому (zset-max-ziplist-entries, zset-max-ziplist-value, в файле конфигурации).

Предположим, что сортированные наборы не закодированы ziplist, я бы сказал Загрузка процессора, скорее всего, связана с тысячами операций чтения в секунду, а не с сотнями обновлений в секунду. Это очень быстро, и нет никакой задержки блокировки, связанной с Redis. Чтение элементов zset является операцией O(n) и может привести к созданию большого буфера для сборки и возврата клиенту.

Чтобы быть уверенным, вы можете генерировать трафик только для чтения, проверить процессор, затем остановить его, генерировать трафик обновления, снова проверить процессор и сравнивать.

Производительность операций чтения zset должна быть близка к производительности LRANGE, которую можно найти в тесте Redis . Несколько тысяч TPS для zsets, содержащих тысячу элементов, похоже, соответствуют типичной производительности Redis.