Как оптимизировать производительность док-контейнера?
Я тестировал контейнер Redis на основе. https://index.docker.io/u/dockerfile/redis/
С тем же redis-бенчмарком, redis-server работает внутри контейнера намного медленнее, чем на размещенной ОС, фактическая статистика показана ниже. (Первый тест для докера)
Итак, есть ли способ оптимизировать производительность док-контейнера?
vagrant@precise64:/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
vagrant@precise64:/tmp$
vagrant@precise64:/tmp$ sudo /etc/init.d/redis-server start
Starting redis-server: redis-server.
vagrant@precise64:/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
2 ответа
Контейнер выглядит медленнее, потому что вы проходите через дополнительный сетевой уровень.
В этом случае вместо прямого подключения к Redis для подключения к прокси-серверу пользователя Docker, который сам подключается обратно к контейнеру (и вместо локального интерфейса это подключение проходит через veth
интерфейс).
Это добавляет небольшую задержку (не поддается измерению по сравнению, например, с генерацией веб-страницы 10 мс; но 50 мкс все же быстрее, чем 150 мкс, если вы понимаете, о чем я).
Если вы хотите сделать больше сравнения "яблоки с яблоками", вы можете:
- запустить redis-benchmark внутри контейнера (подключиться напрямую к Redis изнутри контейнера);
- запустите redis-benchmark на другом компьютере (но имейте в виду, что у вас все еще будет дополнительный сетевой уровень для механизма трансляции портов);
- запустите redis-benchmark на другом компьютере и используйте механизм, такой как pipework, чтобы дать контейнеру интерфейс macvlan с (почти) нулевыми издержками.
Дополнительный сетевой уровень контейнера - это узкое место в производительности в вашем сценарии, и обмен данными от docker-to-docker не сильно поможет (применяются некоторые оптимизации, но также необходимо столкнуться с дополнительными накладными расходами).
Кроме того, запуск redis-benchmark в том же контейнере, что и для сервера redis, даст вам производительность на уровне хоста, но это не тот вариант использования, который вам нужен, возможно, вы хотели бы узнать производительность, которую может обеспечить докеризированный сервер redis.
В Torusware мы провели несколько тестов, чтобы оценить издержки докеризованных приложений, и мы поняли, что сетевой уровень контейнера ограничивает производительность.
Фактически, при выполнении докеризованного теста Redis и сервера докеризированного Redis на одном и том же хосте достигается только 38 тыс. Запросов GET и 46 тыс. Запросов SET в секунду.
У нас есть решение для ускорения этого сценария ненавязчивым способом (без изменений ни в Docker, ни в приложениях). Это наш продукт Speedus Plug&Run, высокопроизводительная библиотека сокетов.
Используя докер Redis+Speedus Lite (доступный в реестре Docker бесплатно), вы сможете значительно сократить время пиковой нагрузки (в худшем случае) с почти 1 секунды до менее 1 миллисекунды.
Более того, Redis+Speedus Lite умножает производительность в 2,5 раза для SET (с 46 000 TPS до 113 000 TPS) и умножает в 3 раза для GET (с 39 000 TPS до 121 000 TPS).
Проверьте этот пост в нашем блоге для получения дополнительной информации.
Но если вы действительно ищете экстремальную производительность, наша версия Speedus Extreme Performance позволит вашим серверам Redis работать очень быстро. Благодаря нашей технологии докер-сервер Redis может предоставлять другим докеризированным приложениям 717 тыс. Запросов SET и 415 тыс. Запросов GET в секунду!
Проверьте детали в этом посте.