如何优化docker集装箱的性能?

我testing基于redis容器。 https://index.docker.io/u/dockerfile/redis/

在相同的redis基准testing中,redis服务器在容器内运行的速度远远低于在托pipeOS上运行的实际统计数据,如下所示。 (第一个基准是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 

容器似乎比较慢,因为你正在经历一个额外的networking层。

在这种情况下,不是直接连接到Redis,而是连接到自己连接回容器的Docker用户态代理(而不是通过本地接口,这个连接遍历一个veth接口)。

这增加了一点点的延迟(相比于例如10毫秒的网页生成而言是不可测量的;但是如果你明白我的意思,50μs仍然比150μs更快)。

如果你想做一个更“苹果苹果”的比较,你可以:

  • 在容器内运行redis-benchmark(从容器内直接连接到Redis);
  • 在另一台机器上运行redis-benchmark(但是请记住,您仍然会为端口转换机制增加一个额外的networking层)。
  • 在另一台机器上运行redis-benchmark, 使用像pipework这样的机制为容器提供一个macvlan接口(几乎)为零开销。

容器的额外networking层是您场景中的性能瓶颈,而从docker到docker的通信不会有太多的帮助(有些优化适用,但是还有一些额外的开销需要面对)。

另外,在Redis服务器的相同容器中运行redis-benchmark会给你主机级别的性能,但是这不是你正在寻找的用例,可能你想知道dockerized redis服务器可以提供的性能。

在Torusware,我们已经做了一些testing来评估dockerized应用程序的开销,我们已经意识到容器的networking层正在限制性能。

实际上,在同一台主机上运行dockerized redis-benchmark和dockerized redis服务器,每秒只能达到38k GET和46k SET请求。

我们有一个解决scheme,以非侵入性的方式加速这种情况(Docker和应用程序都不会改变)。 这是我们的产品Speedus Plug&Run,一个高性能套接字库。

通过使用Redis + Speedus Lite docker(可在Dockerregistry中免费获得),您将能够将峰值时间(最差情况)从1秒降至1毫秒以下。

此外,Redis + Speedus Lite将SET的性能乘以2.5倍(从46k TPS到113k TPS),并将GET乘以3倍(从39k TPS到121k TPS)。

查看这篇文章在我们的博客进一步的细节。

但是,如果您真的希望获得极高的性能,我们的Speedus Extreme Performance版本将使您的Redis服务器运行得非常快。 得益于我们的技术,dockerized redis服务器可以提供其他dockerized应用程序,每秒有717k SET请求和415k GET请求!

查看这篇文章的细节 。