Redis проблемы с производительностью? - PullRequest
6 голосов
/ 19 апреля 2011

Я пытался наложить на Redis большую нагрузку для целей тестирования и выяснить любые верхние пределы. Сначала я загрузил его 50000 и 100000 ключами размером 32 символа со значениями около 32 символов. На оба размера клавиш ушло не более 8-15 секунд. Теперь я пытаюсь поместить 4 КБ данных в качестве значения для каждого ключа. Первые 10000 клавиш требуют 800 миллисекунд для установки. Но с этого момента он постепенно замедляется, и для установки целых 50 000 клавиш требуется около 40 минут. Я загружаю базу данных, используя NodeJs с node_redis (Mranney) . Есть ли какая-то ошибка, которую я делаю, или Redis просто так медленно работает с большими значениями размером 4 КБ?

Еще одна вещь, которую я обнаружил сейчас, - это когда я запускаю другой клиент параллельно текущему и обновляю ключи, этот второй клиент завершает загрузку 50000 ключей со значениями 4 КБ в течение 8 секунд, в то время как первый клиент продолжает работать вечно. Это ошибка в узле или в библиотеке redis? Это тревожно и не приемлемо для производства.

Ответы [ 3 ]

5 голосов
/ 25 апреля 2011

Вам понадобится какое-то обратное давление для выполнения массовых записей из узла в Redis.По умолчанию узел ставит в очередь все записи и не устанавливает верхнюю границу для размера исходящей очереди.

В node_redis есть событие «утечки», которое вы можете прослушивать для реализации некоторого элементарного обратного давления.

3 голосов
/ 19 апреля 2011

Стандартная конфигурация redis не оптимизирована для такого использования.Я подозреваю, что у вас есть свопинг на диск с размером страницы 32 байта, что означает, что каждый добавленный ключ должен найти 128 смежных свободных страниц и может в конечном итоге использовать системную виртуальную машину или нуждаться в расширении файла подкачки.

При обновлении ключа пространство уже выделено, поэтому проблем с производительностью не наблюдается.

0 голосов
/ 21 апреля 2011

Так как я выполнял много установок (значение ключа) в NodeJs, что делается асинхронно, множество соединений сокетов одновременно открыто.Буфер записи сокета NodeJs может быть перегружен, и GC может прийти и возиться с процессом узла.

PS: я изменил конфигурацию памяти redis, как предложил Том, но она все еще выполняла то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...