今天一个历来没有用过docker容器的同事问了我一个网络延迟的问题,很简单,但我确没有准确回答出来。通过简单的验证,如今我把过程及结果分享给各位粉丝。java
简短对话
容器中的网络延迟相较于宿主机有多高啊?web
我不假思索的回答能够忽略不计吧docker
同事带着疑惑的的说了句,那你说说docker网络桥接的实现centos
在容器启动时,Docker引擎将veth pair设备的一端放在新建立的容器中,并命名为eth0,另外一端放在宿主机中;docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关;这样它们就组成了一个数据的通道,数据从一个设备进入,就会从另外一个设备出来。至关于多了一层网络,就少不了网络解封包开销,看来是有影响的。bash
影响到底有多大呢?没有作过这方面的测试......微信
验证环境准备
本次验证工具我使用了Netperf,Netperf是一种网络性能的测量工具,能够测试基于TCP或UDP吞吐、响应速率。Netperf包括Clien和Server端。Server端主要用来实现监听工做,Client端进行测试。根据流量传输方式可分为如下三种:网络
-
单方向最大吞吐传输大量数据。app
-
双方向交互传输数据,对于tcp为单链接。tcp
-
针对tcp,每一个链接交互传输数据。编辑器
环境信息
总共两台机器,一台机器启动了NetPerf服务端;另一台机器分别在容器内和宿主机上运行Netperf客户端。
NetPerf服务端
1.下载wget http://repo.iotti.biz/CentOS/7/x86_64/netperf-2.7.0-1.el7.lux.x86_64.rpm
2.安装 rpm -ivh netperf-2.7.0-1.el7.lux.x86_64.rpm
3.启动 netserver
NetPerf客户端
宿主机验证
首先直接在宿主机上安装Netperf,而后进行网络性能测试,以下所示:

TCP_RR 是 netperf 里专门用来测试网络延时的,缺省每次运行10秒钟。运行之后,咱们还要计算平均每秒钟 TCP request/response 的次数,这个次数越高,就说明延时越小。如上所示,总共测试三轮,分别得出2014六、2024八、20221,平均是20221/s
容器中验证
在同一台客户端机器上,启动docker服务,并安装Netperf进行验证,命令以下所示[root@test ~]# docker run -d --name test -v /home/net/:/home/net/ docker.harbor.com/centos:7.8 sleep 36000
我这里至关因而把Netperf挂载到容器内部,而后执行:
docker exec -it test bash
进入容器内部安装Netperf。

一样运行了三轮,分别得出的是1954六、1954一、19259,平均是19448/s。
从数据上看容器中比宿主机少了773次。773/20221= 4%也就是容器中网络处理速度降低了4%,后来在网上找到了一些paper,有人得出结论是10%上下
。
容器中共享宿主机网络运行
[root@test ~]# docker run -d --name test --network host -v /home/net/:/home/net/ docker.harbor.com/centos:7.8 sleep 36000

能够发现当使用共享宿主机网络模式下,其网络延迟跟宿主机基本没有差别。
缘由分析
网络延迟的缘由也不难想象,由于每次网络数据传输都要通过veth接口,而后向外发送。这个虚拟的网络设备除了没有硬中断,只有软中断处理过程,其它跟网卡发送数据逻辑基本类似,虽然发送速度很快。但即使如此也带来了必定的网络开销,从而形成了网络延迟。
总结
本文主要经过Netperf工具测试了宿主机和docker容器中的网络延迟,总的来讲,在可接受范围以内,可是若是您的服务对延迟比较敏感,那么就能够考虑共享宿主机网络,或者使用后来推出的macvlan/ipvlan(IPVlan 和 macvlan 相似,都是从一个主机接口虚拟出多个虚拟网络接口,发送逻辑更简单。)其性能基本上接近于宿主机。固然最近几年Kubernetes定义了CNI标准,咱们能够根据CNI实现本身的网络转发模式。好比Flannel、Calico、Weave和Canal都是基于该接口实现,让Kubernetes生态系统中的网络解决方案有更多样的选择,意味着大多数用户将可以找到适合其当前需求和部署环境的CNI插件和解决方案。若有问题,请关注公众号、加我微信,我拉你进群讨论!
推荐
原创不易,随手关注或者”在看“,诚挚感谢
本文分享自微信公众号 - 云原生技术爱好者社区(programmer_java)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。