【问题标题】:How to optimize performance for a docker container?如何优化 docker 容器的性能?
【发布时间】:2014-03-08 15:07:42
【问题描述】:

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

使用相同的 redis-benchmark,redis-server 在容器内运行比在托管操作系统上运行要慢得多,实际统计数据如下所示。 (第一个基准是针对 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

【问题讨论】:

    标签: performance docker linux-containers


    【解决方案1】:

    容器似乎变慢了,因为您要经过一个额外的网络层。

    在这种情况下,不是直接连接到 Redis,而是连接到 Docker 用户级代理,该代理本身连接回容器(而不是通过本地接口,此连接通过veth 接口)。

    这会增加一点延迟(与例如 10 毫秒网页生成相比无法测量;但如果您明白我的意思,50 微秒仍然比 150 微秒快)。

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

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

    【讨论】:

    • 真的应该添加从另一个容器运行基准测试,该容器是 --link'ed 到 redis 服务器,因为这是我们推荐的。
    • @jpetazzo 在第二个项目符号中,我假设您说从另一台主机连接时您将获得可比较的数字,无论 redis-server 是在主机机器中的 docker 容器内部还是外部运行。在这两种情况下,只有一个网络层(主机网络层或 docker 网络层,而不是两者)
    【解决方案2】:

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

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

    我们在 Torusware 进行了一些测试来评估 dockerized 应用程序的开销,并且我们已经意识到容器的网络层限制了性能。

    实际上,在同一台主机上运行一个 dockerized redis-benchmark 和一个 dockerized redis server,每秒只能实现 38k GET 和 46k SET 请求。

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

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

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

    查看this post in our blog了解更多详情。

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

    检查details in this post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 2021-05-20
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多