容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
4427 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
01 | 认识容器:容器的基本操作和实现原理
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
课程目录
已完结/共 31 讲
开篇词 (2讲)
开篇词 | 一个态度两个步骤,成为容器实战高手
01 | 认识容器:容器的基本操作和实现原理
容器进程 (6讲)
02 | 理解进程(1):为什么我在容器中不能kill 1号进程?
03|理解进程(2):为什么我的容器里有这么多僵尸进程?
04 | 理解进程(3):为什么我在容器中的进程被强制杀死了?
05|容器CPU(1):怎么限制容器的CPU使用?
06 | 容器CPU(2):如何正确地拿到容器CPU的开销?
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
容器内存 (3讲)
08 | 容器内存:我的容器为什么被杀了?
09 | Page Cache:为什么我的容器内存使用量总是在临界点?
10 | Swap:容器可以使用Swap空间吗?
容器存储 (4讲)
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
12 | 容器文件Quota:容器为什么把宿主机的磁盘写满了?
13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?
14 | 容器中的内存与I/O:容器写文件的延时为什么波动很大?
容器网络 (4讲)
15 | 容器网络:我修改了/proc/sys/net下的参数,为什么在容器中不起效?
16 | 容器网络配置(1):容器网络不通了要怎么调试?
17|容器网络配置(2):容器网络延时要比宿主机上的高吗?
18 | 容器网络配置(3):容器中的网络乱序包怎么这么高?
容器安全 (2讲)
19 | 容器安全(1):我的容器真的需要privileged权限吗?
20 | 容器安全(2):在容器中,我不以root用户来运行程序可以吗?
结束语 (4讲)
结束语 | 跳出舒适区,突破思考的惰性
结课测试|这些容器技术的问题,你都掌握了么?
用户故事 | 莫名:相信坚持的力量,终会厚积薄发
加餐福利 | 课后思考题答案合集
专题加餐 (6讲)
加餐01 | 案例分析:怎么解决海量IPVS规则带来的网络延时抖动问题?
加餐02 | 理解perf:怎么用perf聚焦热点函数?
加餐03 | 理解ftrace(1):怎么应用ftrace查看长延时内核函数?
加餐04 | 理解ftrace(2):怎么理解ftrace背后的技术tracepoint和kprobe?
加餐05 | eBPF:怎么更加深入地查看内核中的函数?
加餐06 | BCC:入门eBPF的前端工具
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册
开通超级会员可免费学习本课程,还可解锁海量内容免费学特权。

17|容器网络配置(2):容器网络延时要比宿主机上的高吗?

你好,我是程远。
在上一讲里,我们学习了在容器中的网络接口配置,重点讲解的是 veth 的接口配置方式,这也是绝大部分容器用的缺省的网络配置方式。
不过呢,从 veth 的这种网络接口配置上看,一个数据包要从容器里发送到宿主机外,需要先从容器里的 eth0 (veth_container) 把包发送到宿主机上 veth_host,然后再在宿主机上通过 nat 或者路由的方式,经过宿主机上的 eth0 向外发送。
这种容器向外发送数据包的路径,相比宿主机上直接向外发送数据包的路径,很明显要多了一次接口层的发送和接收。尽管 veth 是虚拟网络接口,在软件上还是会增加一些开销。
如果我们的应用程序对网络性能有很高的要求,特别是之前运行在物理机器上,现在迁移到容器上的,如果网络配置采用 veth 方式,就会出现网络延时增加的现象。
那今天我们就来聊一聊,容器网络接口对于容器中应用程序网络延时有怎样的影响,还有这个问题应该怎么解决。

问题重现

对于这种 veth 接口配置导致网络延时增加的现象,我们可以通过运行netperf(Netperf 是一个衡量网络性能的工具,它可以提供单向吞吐量和端到端延迟的测试)来模拟一下。
这里我们需要两台虚拟机或者物理机,这两台机器需要同处于一个二层的网络中。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
01 | 认识容器:容器的基本操作和实现原理
07 | Load Average:加了CPU Cgroup限制,为什么我的容器还是很慢?
11 | 容器文件系统:我在容器中读写文件怎么变慢了?
13 | 容器磁盘限速:我的容器里磁盘读写为什么不稳定?
加餐03 | 理解ftrace(1):怎么应用ftrace查看长延时内核函数?
加餐05 | eBPF:怎么更加深入地查看内核中的函数?
开通超级会员免费畅看本课程
开通会员
该文章仅可免费阅读部分内容,如需阅读完整文章,请开通超级会员或单独购买本课程。
登录 后留言

精选留言(5)

  • 豆豆
    思考题,因为他们使用不同的网络名称空间,MACVLAN 会走单独的协议栈,iptables 规则是在主机的网络名称空间,所以不会生效的,除非单独给容器的网络名称空间配置iptables 规则
    2020-12-23
    12
  • 莫名
    netif_rx 通常在硬件中断处理逻辑中调用。loopback、veth 等设备驱动是特例,通过调用 netif_rx 模拟数据包的接收。

    除了 softirq 的性能损坏,应该还包括 docker0 网桥的自身处理逻辑(作为 veth_container 的主设备接管其数据包的处理权)以及 docker0 -> eth0 的转发逻辑。

    docker inspect 输出为 json 格式,推荐使用 jq 命令查看 Pid ,命令比较简洁,缺点是默认末安装:
    docker inspect lat-test-1 | jq .[0].State.Pid

    作者回复: @莫名,

    > 除了 softirq 的性能损坏,应该还包括 docker0 网桥的自身处理逻辑(作为 veth_container 的主设备接管其数据包的处理权)以及 docker0 -> eth0 的转发逻辑。

    没错,Linux bridge以及docker0 -> eth0的L3层的操作也会带来额外的开销,不过相比较而言,veth pair softirq的处理带来的开销要更明显一些。

    2020-12-25
    3
    8
  • morse
    Kubernetes 的 service 是靠 Kube-proxy实现,

    L2模式下, 出入流量不会经过 host namespace, 那么kube-proxy就无法工作.

    L3模式下, 单入方向不经过 host namespace. 无法支持Kube-proxy.
    2021-01-07
    1
    5
  • 谢哈哈
    在iptables标记包之前就被宿主机上的路由层面给处理完了,在mangle表和nat表的PREROUTING 和POSTROUTING链上的规则就匹配不到了
    2020-12-23
    2
    5
  • swordholder
    Kubernetes的service是通过在iptables中设置DNAT规则实现的,而 DNAT 规则是在 PREROUTING 检查点,也就是在路由之前。
    而ipvlan/macvlan 网络接口直接挂载在物理网络接口上,发送函数会直接找到虚拟接口对应的物理网络接口,不会再经过iptables的DNAT 规则。
    2022-01-07
    1
收起评论
5
返回
顶部