Performance 如何优化docker容器的性能?

Performance 如何优化docker容器的性能?,performance,docker,linux-containers,Performance,Docker,Linux Containers,我基于测试了redis容器。 使用相同的redis基准测试,redis服务器在容器中运行的速度比在托管操作系统上运行的速度慢得多,实际统计数据如下所示。(第一个基准是docker容器) 那么,有没有办法优化docker容器的性能 vagrant@precise64:/tmp$ redis-benchmark -p 49153 -q -n 100000 PING (inline): 5607.27 requests per second PING: 6721.79 requests per se

我基于测试了redis容器。

使用相同的redis基准测试,redis服务器在容器中运行的速度比在托管操作系统上运行的速度慢得多,实际统计数据如下所示。(第一个基准是docker容器)

那么,有没有办法优化docker容器的性能

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
容器看起来比较慢,因为您要经过一个额外的网络层

在这种情况下,不是直接连接到Redis,而是连接到Docker userland代理,该代理本身连接回容器(并且不是通过本地接口,而是通过
veth
接口)

这增加了一点延迟(与10ms网页生成相比,这是不可测量的;但如果你明白我的意思,50µs仍然比150µs快)

如果您想进行更多的“苹果对苹果”比较,您可以:

  • 在容器内运行redis基准(从容器内直接连接到redis)
  • 在另一台机器上运行redis benchmark(但请记住,端口转换机制仍有一个额外的网络层)
  • 在另一台机器上运行redis benchmark,并使用类似于为容器提供(几乎)零开销的macvlan接口的机制

在您的场景中,容器的额外网络层是性能瓶颈,从docker到docker的通信不会有太大帮助(应用了一些优化,但也必须面对一些额外的开销)

此外,在与redis服务器相同的容器中运行redis benchmark将为您提供主机级性能,但这不是您要寻找的用例,您可能希望了解停靠redis服务器可以提供的性能

我们在Torusware做了一些测试来评估停靠应用程序的开销,我们意识到容器的网络层限制了性能

事实上,在同一台主机上运行DockedRedis基准和DockedRedis服务器,每秒只能实现38k GET和46k SET请求

我们有一个以非侵入方式(Docker和应用程序都没有变化)加速此场景的解决方案。这是我们的产品Speedus Plug&Run,一个高性能的套接字库

通过使用Redis+Speedus Lite docker(可在docker注册表中免费获得),您将能够显著减少峰值时间(最坏情况),从近1秒减少到1毫秒以下

此外,对于SET(从46k TPS到113k TPS),Redis+Speedus Lite将性能提高2.5倍;对于GET(从39k TPS到121k TPS),性能提高3倍

查看更多详细信息

但是,如果您真的希望获得极高的性能,我们的Speedus extreme performance版本将使您的redis服务器运行得非常快。多亏了我们的技术,停靠redis服务器可以提供每秒717k SET请求和415k GET请求的其他停靠应用程序


检查

还应该添加从另一个容器(链接到redis服务器)运行基准测试的功能,因为这是我们建议的。@jpetazzo在第二个项目符号中,我想你是说从另一个主机连接时会得到可比的数字,无论redis服务器在主机machne中的docker容器内部或外部运行。在这两种情况下,只有一个网络层(主机网络层或docker网络层,而不是两者)