docker 服务性能与单个容器?

docker service performance vs individual container?

我是 运行 有 docker-swarm 的服务器。但是,这些天我质疑 docker 服务性能。我什至不认为拥有超过 2 个实例和扩展副本对 docker- 服务器性能没有帮助。

例如, 在一个实例中有一个单独的容器 对比 docker 具有 10 个副本的服务。

根据我的经验,带有单个容器的 docker 容器表现出更好的性能(从 mysql 获取数据并发送回前端......等等)。

我对 docker container/service 性能有误解吗?

你的问题一共有三个问题。

第一个的答案是 "none",另外两个的答案是 "it depends" :) 够了 snarky-ness,让我们看看你的问题...

问题 1:单个容器与具有 1 个副本的服务相比,performance-hit 有何不同?

A1:0.000n%。您的 single-replica 服务将启动……一个副本。答案是 0.000n% 的原因是因为 Swarm 在 Docker 引擎中需要一点内存和 cpu,这可能会影响您的整体性能

Q2:什么是performance-hit群联网?

A2:现在你比较的是Swarm Overlay组网系统引起的通信的组网性能。大多数时候,性能损失接近于 0。Swarm 使用的默认覆盖是 VXLAN。由于每个数据包需要 encapsulated/decapsulated,因此性能受到了很小的影响。如果您有很多副本和很多 short-lived 连接(想想:无状态 api 会收到很多请求),入口 load-balancer 可能会涉及一些开销。所以"it depends"

Q3:应用程序的单个副本,消耗大量 cpu 和 ram 与应用程序的多个副本,每个副本消耗一点点 ram 和 cpu。

A3:视情况而定,但这不是 Docker(群体)问题。一些应用程序(无状态,不依赖于 'single access' 外部服务,受到大量请求的冲击,在 运行 并行(水平缩放)时会表现很好。有些会表现更差,需要垂直缩放(少数实例,大量内存和 cpu)。请记住,垂直缩放很难超过某个点...

希望这对您有所帮助...

你没有抓住要点。

服务复制不是为了解决性能问题,而是解决高可用性问题。
如果一个复制失败,则请求将仅回退到其他可用的复制。这就是(其中之一)使用编排器的原因。

当然,使用 orchestrator 会一点点 降低流量,但这里不是说性能下降 50%!

事实上,任何事情都是一样的,即使在现实生活中也是如此。去当地的商店买东西总是比在网上购物并等待送货要快。但是,您不确定您当地的商店是否有您想要购买的商品。相反,如果你继续流行 e-shop 那么你几乎可以肯定你会在第一次尝试时得到你想要的东西。你只需要再等一会儿。

也许这与SWARM Very poor performance for ingress network with lots of parallel requests

有关

the swarm-mode ingress is handled by IPVS and the connections are dispatched to the backend tasks over the overlay ingress network. But since it is a single node setup, the performance dip cannot happen due to the VXLAN headers used in overlay network. The only possible reason could be IPVS and it might require performance tuning for your case.

对于那些认为这是网络问题的人,也许在端口下使用 mode:host 可以帮助绕过 ipvs 限制(但是你需要一个外部负载均衡器用于你的群)

ports:
   - target: 80
     published: 80
     protocol: tcp
     mode: host