Docker服务网络性能不佳

时间:2019-01-14 15:02:37

标签: performance docker

我有一个go服务(http.ListenAndServe),它简单地呼应“ hello world”(最基本的服务,以便不向基准引入开销)。问题是,如果我使用go run server.go运行服务并在本地计算机(Macbook pro)上运行性能测试(使用wrk https://github.com/wg/wrk),则性能为

Requests/sec: 59336.07
Transfer/sec: 8.66MiB

但是如果我只是在docker中运行服务(docker run -p8080:8080 periket2000 / goku)并再次运行性能测试,我会得到:

Requests/sec: 4743.77
Transfer/sec: 0.69MiB

这有意义吗?码头工人的表现如此差吗? 我已经使用多个服务/堆栈对其进行了测试,并获得了相同的结果。

1 个答案:

答案 0 :(得分:0)

您描述的服务几乎没有作用,而从其GitHub页面看,它看起来像wrk那样避免了诸如HTTP持久连接之类的事情,因此您的基准测试基本上只能测试组合系统的运行速度可以建立和拆除TCP连接。请注意,即使在环回情况下,数据速率也非常低:在您说“ hello world”并挂断电话之前,存在很多握手,IP和TCP开销以及HTTP标头。

在环回情况下,MacOS内核极有可能几乎可以将数据直接从一个进程转移到另一个进程。

Process A |--> Local loopback ----> | Process B

在Docker的情况下,流量需要经过虚拟网络接口进入虚拟机,然后被Linux内核网络接口接收,再经过NAT层进入Docker空间,然后被进程接收;回复需要反向进行此堆栈。这样做会增加开销也就不足为奇了,而且涉及的微小数据包会使情况变得更糟(请参阅connection establishment in the Wikipedia page on TCP的讨论;正在等待双方完成SYN-ACK和FIN-RST序列,而没有完成携带数据IIRC)。因此,这些结果不足为奇。

Process A |--> Virtual interface
               Linux VM eth0
               iptables NAT
               Linux VM docker0
               Container eth0 ----> | Process B

绝对数量上,在我过去使用的系统中,每秒接收超过4,000个请求肯定进入了“可观的性能”空间。 (由于工作负载的性质,仅回送的8 MB / s数据速率看起来并不出色。)可能需要以更实际的工作负载(GET和POST的混合;不平凡的价格)重新运行基准测试数据响应;需要一定的计算或外部I / O才能产生结果)。我不希望Mac版Docker能够达到纯本地无外部网络设置的100%的性能,但是我希望更大的数据开销比和HTTP持久连接之类的东西对您有所帮助。