Подтвердить что ты не робот

Задержка запроса Redis

Я использую redis (2.6.8) с php-fpm и драйвером phpredis и имею некоторые проблемы с проблемами латентности redis. При определенной нагрузке первый запрос redis из нашего приложения занимает около 1-1,5 с, а redis-cli --latency показывает ту же задержку.

Я уже проверил руководство по задержке.

  • Мы используем redis на том же хосте с Unix-сокетами
  • slowlog не имеет записей больше 5ms
  • мы не используем AOF
  • redis занимает около 3,5 ГБ памяти 16 ГБ (я полагаю, это не так уж много)
  • наша система не заменяет
  • нет другого процесса, делающего дисковый ввод-вывод

Я использую постоянные соединения, и количество подключенного клиента варьируется от 5 до 25 (иногда удары до 60-80).

Вот график.

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

Можете ли вы помочь мне выяснить, в чем проблема?

Update

Я исследовал проблему, и, похоже, у redis не хватило времени на процессор по какой-то причине для правильной работы.

Я тщательно проверил связь между php-fpm и redis с помощью сетевого сниффера. Redis получил запрос по tcp, но отправил ответ только спустя полтора секунды. Очевидно, это означало, что проблема внутри redis, что она не может обрабатывать так много запросов в данных условиях (возможно, голод процессора, поскольку процессор загружен всего на 50% для всей системы).

Проблема была решена путем перемещения redis на другой сервер, который почти не работал. Я полагаю, что мы должны были играть с планировщиком linux, чтобы он работал на том же сервере, но еще не сделал этого.

4b9b3361

Ответ 1

Помните, что Redis является однопоточным. Если операции, которые вы выполняете, выполняются на стороне процессора, ваши запросы могут блокироваться друг на друга. Например, если вы делаете HVALS против хэшей с очень большими значениями, вы заставите всех своих клиентов ждать, пока вы вытаскиваете все эти данные и копируете их в выходной буфер.

Часть того, что вам нужно сделать здесь (независимо от того, является ли это проблемой), - это посмотреть на все команды, которые вы используете, и определить сложность каждой команды. Если вы делаете кучу команд O(N) против очень больших объемов данных, это не невозможно, что вы просто делаете слишком много вещей за раз.

TL; DR Никто здесь не может отладить эту проблему с реальной уверенностью, не зная, какие команды вы используете, и каковы ваши данные. Но вы можете найти временную сложность каждого метода, который вы используете, и убедиться в его разумности.

Ответ 2

Я столкнулся с этим, исследуя проблему, над которой я работаю, но думал, что это может помочь здесь:

https://groups.google.com/forum/#!topic/redis-db/uZaXHZUl0NA

Если вы читаете поток, есть интересная информация.