Как оценить производительность сервера Redis в Ubuntu 18.04

Вступление

Сравнительный анализ является важной практикой при анализе общей производительности серверов баз данных. Это полезно для выявления узких мест, а также возможностей для улучшения в этих системах.

Redis - это хранилище данных в памяти, которое можно использовать в качестве базы данных, кеша и посредника сообщений. Он поддерживает от простых до сложных структур данных, включая хеши, строки, отсортированные наборы, растровые изображения, геопространственные данные и другие типы. В этом руководстве мы покажем, как оценить производительность сервера Redis, работающего в Ubuntu 18.04, используя несколько различных инструментов и методов.

Предпосылки

Чтобы следовать этому руководству, вам потребуется:

[.note] #Note: Команды, продемонстрированные в этом руководстве, были выполнены на выделенном сервере Redis, работающем на капле DigitalOcean объемом 4 ГБ.
#

Использование прилагаемого инструментаredis-benchmark

Redis поставляется с инструментом тестирования под названиемredis-benchmark. Эта программа может использоваться для моделирования произвольного числа клиентов, одновременно подключающихся и выполняющих действия на сервере, измеряя, сколько времени требуется для выполнения запросов. Полученные данные дадут вам представление о среднем количестве запросов, которые ваш сервер Redis может обрабатывать в секунду.

В следующем списке приведены некоторые общие параметры команд, используемые сredis-benchmark:

  • -h: хост Redis. По умолчанию127.0.0.1.

  • -p: порт Redis. По умолчанию6379.

  • -a: Если ваш сервер требует аутентификации, вы можете использовать эту опцию, чтобы указать пароль.

  • -c: количество клиентов (параллельные соединения) для моделирования. Значение по умолчанию 50.

  • -n: сколько запросов сделать. По умолчанию 100000.

  • -d: Размер данных для значенийSET иGET, измеренный в байтах. По умолчанию 3.

  • -t: запустить только часть тестов. Например, вы можете использовать-t get,set для оценки производительности командGET иSET.

  • -P: используйте конвейерную обработку для повышения производительности.

  • -q: Тихий режим, показывает только среднюю информациюrequests per second.

Например, если вы хотите проверить среднее количество запросов в секунду, которое может обрабатывать ваш локальный сервер Redis, вы можете использовать:

redis-benchmark -q

Вы получите вывод, похожий на этот, но с другими номерами:

OutputPING_INLINE: 85178.88 requests per second
PING_BULK: 83056.48 requests per second
SET: 72202.16 requests per second
GET: 94607.38 requests per second
INCR: 84961.77 requests per second
LPUSH: 78988.94 requests per second
RPUSH: 88652.48 requests per second
LPOP: 87950.75 requests per second
RPOP: 80971.66 requests per second
SADD: 80192.46 requests per second
HSET: 84317.03 requests per second
SPOP: 78125.00 requests per second
LPUSH (needed to benchmark LRANGE): 84175.09 requests per second
LRANGE_100 (first 100 elements): 52383.45 requests per second
LRANGE_300 (first 300 elements): 21547.08 requests per second
LRANGE_500 (first 450 elements): 14471.78 requests per second
LRANGE_600 (first 600 elements): 9383.50 requests per second
MSET (10 keys): 71225.07 requests per second

Вы также можете ограничить тесты подмножеством команд по вашему выбору, используя параметр-t. Следующая команда показывает средние значения только для командGET иSET:

redis-benchmark -t set,get -q
OutputSET: 76687.12 requests per second
GET: 82576.38 requests per second

Параметры по умолчанию будут использовать 50 параллельных соединений для создания 100000 запросов к серверу Redis. Если вы хотите увеличить количество параллельных подключений для имитации пика использования, вы можете использовать для этого параметр-c:

redis-benchmark -t set,get -q -c 1000

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

OutputSET: 69444.45 requests per second
GET: 70821.53 requests per second

Если вы хотите получить подробную информацию в выводе, вы можете удалить опцию-q. Следующая команда будет использовать 100 параллельных подключений для выполнения 1000000 запросов SET на сервере:

redis-benchmark -t set -c 100 -n 1000000

Вы получите вывод, похожий на этот:

Output====== SET ======
  1000000 requests completed in 11.29 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

95.22% <= 1 milliseconds
98.97% <= 2 milliseconds
99.86% <= 3 milliseconds
99.95% <= 4 milliseconds
99.99% <= 5 milliseconds
99.99% <= 6 milliseconds
100.00% <= 7 milliseconds
100.00% <= 8 milliseconds
100.00% <= 8 milliseconds
88605.35 requests per second

Настройки по умолчанию используют 3 байта для значений ключа. Вы можете изменить это с помощью опции-d. Следующая команда будет тестировать командыGET иSET с использованием значений ключа размером 1 МБ:

redis-benchmark -t set,get -d 1000000 -n 1000 -q

Поскольку на этот раз сервер работает с гораздо большей полезной нагрузкой, ожидается значительное снижение производительности:

OutputSET: 1642.04 requests per second
GET: 822.37 requests per second

Важно понимать, что хотя эти числа полезны в качестве быстрого способа оценки производительности экземпляра Redis, они не представляют максимальную пропускную способность, которую может выдержать экземпляр Redis. Используяpipelining, приложения могут отправлять несколько команд одновременно, чтобы увеличить количество запросов в секунду, которые может обрабатывать сервер. С помощьюredis-benchmark вы можете использовать параметр-P для моделирования реальных приложений, использующих эту функцию Redis.

Чтобы сравнить разницу, сначала запустите командуredis-benchmark со значениями по умолчанию и без конвейерной обработки для тестовGET иSET:

redis-benchmark -t get,set -q
OutputSET: 86281.27 requests per second
GET: 89847.26 requests per second

Следующая команда выполнит те же тесты, но объединит 8 команд:

redis-benchmark -t get,set -q -P 8
OutputSET: 653594.81 requests per second
GET: 793650.75 requests per second

Как видно из выходных данных, при использовании конвейерной обработки наблюдается значительное улучшение производительности.

Проверка задержки с помощьюredis-cli

Если вы хотите просто измерить среднее время, которое требуется запросу для получения ответа, вы можете использовать клиент Redis для проверки средней задержки сервера. В контексте Redis задержка - это мера того, сколько времени требуется командеping для получения ответа от сервера.

Следующая команда покажет статистику задержки в реальном времени для вашего сервера Redis:

redis-cli --latency

Вы получите вывод, похожий на этот, показывающий увеличивающееся количество выборок и переменную среднюю задержку:

Outputmin: 0, max: 1, avg: 0.18 (970 samples)

Эта команда будет работать до бесконечности. Вы можете остановить это с помощьюCTRL+C.

Для мониторинга задержки за определенный период времени вы можете использовать:

redis-cli --latency-history

Это позволит отслеживать средние задержки с течением времени с настраиваемым интервалом, который по умолчанию установлен на 15 секунд. Вы получите вывод, похожий на этот:

Outputmin: 0, max: 1, avg: 0.18 (1449 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.16 (1449 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.17 (1449 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.17 (1444 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.17 (1446 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.17 (1449 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.16 (1444 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.17 (1445 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.16 (1445 samples) -- 15.01 seconds range
...

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

Если вы хотите измерить только задержкуsystem, вы можете использовать для этого--intrinsic-latency. Внутренняя задержка присуща среде и зависит от таких факторов, как оборудование, ядро, соседние узлы сервера и другие факторы, которые не контролируются Redis.

Вы можете увидеть внутреннюю задержку как основу для вашей общей производительности Redis. Следующая команда проверит внутреннюю задержку системы, выполнив тест в течение 30 секунд:

redis-cli --intrinsic-latency 30

Вы должны получить вывод, похожий на этот:

Output…

498723744 total runs (avg latency: 0.0602 microseconds / 60.15 nanoseconds per run).
Worst run took 22975x longer than the average latency.

Сравнение обоих тестов на задержку может быть полезно для выявления аппаратных или системных узких мест, которые могут повлиять на производительность вашего сервера Redis. Учитывая, что общее время ожидания для запроса к нашему серверу-примеру составляет в среднем 0,18 микросекунды, внутренняя задержка 0,06 микросекунды означает, что одна треть общего времени запроса тратится системой в процессах, которые не контролируются Redis.

Использование инструмента Memtier Benchmark Tool

Memtier - это высокопроизводительный тестовый инструмент для Redis иMemcached, созданный Redis Labs. Несмотря на то, что Memtier очень похож наredis-benchmark в различных аспектах, он имеет несколько параметров конфигурации, которые можно настроить для лучшей имитации нагрузки, которую вы можете ожидать на сервере Redis, в дополнение к поддержке кластера.

Чтобы установить Memtier на ваш сервер, вам необходимо скомпилировать программное обеспечение из исходных текстов. Сначала установите зависимости, необходимые для компиляции кода:

sudo apt-get install build-essential autoconf automake libpcre3-dev libevent-dev pkg-config zlib1g-dev

Затем перейдите в свой домашний каталог и клонируйте проектmemtier_benchmark из егоGithub repository:

cd
git clone https://github.com/RedisLabs/memtier_benchmark.git

Перейдите в каталог проекта и выполните командуautoreconf, чтобы сгенерировать сценарии конфигурации приложения:

cd memtier_benchmark
autoreconf -ivf

Запустите сценарийconfigure, чтобы сгенерировать артефакты приложения, необходимые для компиляции:

./configure

Теперь запуститеmake, чтобы скомпилировать приложение:

make

После завершения сборки вы можете протестировать исполняемый файл с помощью:

./memtier_benchmark --version

Это даст вам следующий вывод:

Outputmemtier_benchmark 1.2.17
Copyright (C) 2011-2017 Redis Labs Ltd.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License .
There is NO WARRANTY, to the extent permitted by law.

В следующем списке приведены некоторые из наиболее распространенных параметров, используемых с командойmemtier_benchmark:

  • -s: хост сервера. По умолчаниюlocalhost.

  • -p: порт сервера. По умолчанию6379.

  • -a: аутентифицировать запросы, используя предоставленный пароль.

  • -n: количество запросов на одного клиента (по умолчанию 10000).

  • -c: количество клиентов (по умолчанию 50).

  • -t: количество потоков (по умолчанию 4).

  • --pipeline: включить конвейерную обработку.

  • --ratio: соотношение между командамиSET иGET, по умолчанию 1:10.

  • --hide-histogram: скрывает подробную информацию о выходе.

Большинство этих параметров очень похожи на параметры, представленные вredis-benchmark, но Memtier тестирует производительность другим способом. Для лучшего моделирования обычных реальных сред, эталонный тест по умолчанию, выполняемыйmemtier_benchmark, будет тестировать только запросыGET иSET в соотношении от 1 к 10. С 10 GET-операциями для каждой SET-операции в тесте, эта схема является более представительной для обычного веб-приложения, использующего Redis в качестве базы данных или кэша. Вы можете настроить значение коэффициента с помощью опции--ratio.

Следующая команда запускаетmemtier_benchmark с настройками по умолчанию, предоставляя только выходную информацию высокого уровня:

./memtier_benchmark --hide-histogram

[.Примечание]##

Note: если вы настроили сервер Redis для требования аутентификации, вы должны указать параметр-a вместе с паролем Redis для командыmemtier_benchmark:

./memtier_benchmark --hide-histogram -a your_redis_password

Вы увидите вывод, похожий на этот:

Output...

4         Threads
50        Connections per thread
10000     Requests per client


ALL STATS
=========================================================================
Type         Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
-------------------------------------------------------------------------
Sets         8258.50          ---          ---      2.19800       636.05
Gets        82494.28     41483.10     41011.18      2.19800      4590.88
Waits           0.00          ---          ---      0.00000          ---
Totals      90752.78     41483.10     41011.18      2.19800      5226.93

Согласно этому запускуmemtier_benchmark, наш сервер Redis может выполнять около 90 тысяч операций в секунду с соотношением 1:10SET /GET.

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

Заключение

В этом руководстве мы продемонстрировали, как выполнять тесты производительности на сервере Redis, используя два разных инструмента: включенныйredis-benchmark и инструментmemtier_benchmark, разработанный Redis Labs. Мы также увидели, как проверить задержку сервера с помощьюredis-cli. Основываясь на данных, полученных в ходе этих тестов, вы лучше поймете, чего ожидать от вашего сервера Redis с точки зрения производительности, и каковы узкие места вашей текущей настройки.

Related