Причины задержки Redis в облаке (по сравнению с локальным redis на MacBook Pro)
Redis может дать время отклика менее миллисекунды. Это большое обещание. Я тестирую героку редис и получаю 1ms
примерно до 8ms
, для zincrby
, я использую microtime()
в php обернуть звонок. Это повторение heroku (я использую бесплатный план) является общим экземпляром, и существует конфликт ресурсов, поэтому я ожидаю, что время отклика для идентичных запросов будет разным, и они, безусловно, меняются.
Мне любопытно узнать причину различия в производительности по сравнению с Redis, установленным на моем MacBook Pro с помощью homebrew. Там явно нет задержки в сети. Что меня интересует, так это то, означает ли это, что любое повторное облачное хранилище (т. Е. Подключение по сети, скажем, в пределах aws) всегда будет работать немного медленнее, чем если бы я имел один облачный сервер и запускал бы redis внутри та же физическая машина, таким образом устраняя сетевую задержку?
В этих облачных предложениях также наблюдается конфликт ресурсов, если только не выбран частный сервер, который стоит намного дороже.
Некоторые цифры: мой местный MacBook Pro последовательно дает 0.2ms
для идентичного zincrby
что занимает между 1ms
& 8ms
на геройку редис.
Является ли задержка сети причиной этого?
1 ответ
Нет, наверное нет.
Типичная задержка сети 1 Гбит / с составляет около 200us
, Это 0.2ms
,
Более того, в AWS вы, вероятно, по крайней мере на 10 Гбит / с.
Как объясняется на этой странице в руководстве по Redis, основной причиной изменения задержки между этими двумя средами почти наверняка будет результат более высокого intrinsic latency
(есть команда redis для проверки этого на любой конкретной системе: redis-cli --intrinsic-latency 100
см. страницу руководства выше), возникающую из-за запуска в контейнере Linux.
то есть задержка в сети не является основной причиной изменений, наблюдаемых здесь.
Вот контрольный список (со страницы руководства Redis, указанной выше).
- Если вы можете себе это позволить, предпочитайте физический компьютер виртуальной машине для размещения сервера.
- Не систематически подключаться / отключаться от сервера (особенно актуально для веб-приложений). Сохраняйте ваши связи как можно дольше.
- Если ваш клиент находится на том же хосте, что и сервер, используйте доменные сокеты Unix.
- Предпочитают использовать агрегированные команды (MSET/MGET) или команды с переменными параметрами (если возможно) по конвейеру.
- Предпочитаю использовать конвейерную обработку (если это возможно) поверх последовательности циклов.
- Redis поддерживает сценарии на стороне сервера Lua, чтобы охватить случаи, которые не подходят для необработанной конвейерной обработки (например, когда результат команды является входом для следующих команд).