Как оптимизировать производительность для контейнера докеров?

Я тестировал контейнер redis на основе. https://index.docker.io/u/dockerfile/redis/

В том же redis-benchmark redis-server запускается внутри контейнера намного медленнее, чем на размещенной ОС, фактическая статистика, показанная ниже. (Первый тест предназначен для контейнера докеров)

Итак, есть ли способ оптимизировать производительность для контейнера докеров?

[email protected]:/tmp$ redis-benchmark -p 49153 -q -n 100000
PING (inline): 5607.27 requests per second
PING: 6721.79 requests per second
MSET (10 keys): 6085.69 requests per second
SET: 6288.91 requests per second
GET: 6627.78 requests per second
INCR: 6454.11 requests per second
LPUSH: 6449.12 requests per second
LPOP: 5355.90 requests per second
SADD: 6237.91 requests per second
SPOP: 6794.40 requests per second
LPUSH (again, in order to bench LRANGE): 6089.76 requests per second
LRANGE (first 100 elements): 6000.24 requests per second
LRANGE (first 300 elements): 4660.70 requests per second
LRANGE (first 450 elements): 4276.79 requests per second
LRANGE (first 600 elements): 3710.85 requests per second

[email protected]:/tmp$
[email protected]:/tmp$ sudo /etc/init.d/redis-server start
Starting redis-server: redis-server.
[email protected]:/tmp$ redis-benchmark -q -n 100000
PING (inline): 19357.34 requests per second
PING: 19175.46 requests per second
MSET (10 keys): 16697.28 requests per second
SET: 19146.08 requests per second
GET: 19175.46 requests per second
INCR: 19135.09 requests per second
LPUSH: 19168.10 requests per second
LPOP: 14976.79 requests per second
SADD: 16638.93 requests per second
SPOP: 18079.91 requests per second
LPUSH (again, in order to bench LRANGE): 18268.18 requests per second
LRANGE (first 100 elements): 16136.84 requests per second
LRANGE (first 300 elements): 11528.71 requests per second
LRANGE (first 450 elements): 9237.88 requests per second
LRANGE (first 600 elements): 8864.46 requests per second

Ответ 1

Контейнер выглядит медленнее, потому что вы просматриваете дополнительный сетевой уровень.

В этом случае вместо прямого подключения к Redis для подключения к прокси-серверу Docker userland, который сам подключается обратно к контейнеру (и вместо перехода через локальный интерфейс это соединение проходит через интерфейс veth).

Это добавляет немного задержки (не поддается измерению по сравнению, например, с созданием веб-страницы 10 мс, но 50 мкс все еще быстрее 150 мкс, если вы понимаете, что я имею в виду).

Если вы хотите сделать сравнение "яблок с яблоками", вы можете:

  • запустите redis-benchmark внутри контейнера (чтобы напрямую подключиться к Redis из контейнера);
  • запустите redis-benchmark на другой машине (но имейте в виду, что у вас все еще будет дополнительный сетевой уровень для механизма перевода порта);
  • запустите redis-benchmark на другой машине и используйте такой механизм, как pipework, чтобы предоставить контейнеру интерфейс macvlan с (почти) нулевыми служебными данными.

Ответ 2

Дополнительный сетевой уровень контейнера является узким местом производительности в вашем сценарии, а общение с докере-докером не поможет слишком много (некоторые оптимизации применяются, но затем также необходимо выполнить некоторые дополнительные накладные расходы).

Кроме того, запуск redis-benchmark в том же контейнере, что и сервер redis, даст вам производительность на уровне хоста, но это не тот случай, который вы ищете, возможно, вам хотелось бы знать производительность, которая может быть предоставлена ​​докционированным redis server.

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

Фактически, запуск докереризованного redis-benchmark и докереризованного сервера redis на том же хосте, только достигает 38k GET и 46k SET запросов в секунду.

У нас есть решение для ускорения этого сценария неинтрузивным способом (без изменений ни в Docker, ни в приложениях). Это наш продукт Speedus Plug & Run, высокопроизводительная библиотека сокетов.

Используя доклер Redis + Speedus Lite (бесплатно в реестре Docker), вы сможете значительно сократить время пика (наихудший сценарий), с почти 1 секунды до менее 1 миллисекунды.

Кроме того, Redis + Speedus Lite умножает производительность на 2.5X для SET (от 46k TPS до 113k TPS) и умножает на 3X для GET (от 39k TPS до 121k TPS).

Подробнее о этот пост в нашем блоге.

Но если вы действительно ищете экстремальную производительность, наша версия Speedus Extreme Performance заставит ваши серверы redis работать очень быстро. Благодаря нашей технологии докереризованный сервер redis может предоставлять другие докционированные приложения с 717k запросами SET и 415k GET-запросами в секунду!

Отметьте подробности в этом сообщении.