容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

18 | 容器网络配置(3):容器中的网络乱序包怎么这么高?

RPS的配置方法
RSS和RPS的作用
可能引起数据包乱序的几率
veth接口的数据包发送流程
SACK的作用
快速重传的概念
TCP协议中的重传机制
tp->recording和/proc/sys/net/ipv4/tcp_reordering的关系
tcp_force_fast_retransmit()函数
其他参数的设置对重传的影响
RPS的作用和配置
快速重传和数据包乱序
RSS和RPS
Veth接口的数据包发送
快速重传(fast retransmit)
使用netstat命令查看重传情况
使用iperf3命令测试容器网络
思考题
重点小结
问题分析
问题重现
容器网络配置

该思维导图由 AI 生成,仅供参考

你好,我是程远。这一讲,我们来聊一下容器中发包乱序的问题。
这个问题也同样来自于工作实践,我们的用户把他们的应用程序从物理机迁移到容器之后,从网络监控中发现,容器中数据包的重传的数量要比在物理机里高了不少。
在网络的前面几讲里,我们已经知道了容器网络缺省的接口是 veth,veth 接口都是成对使用的。容器通过 veth 接口向外发送数据,首先需要从 veth 的一个接口发送给跟它成对的另一个接口。
那么这种接口会不会引起更多的网络重传呢?如果会引起重传,原因是什么,我们又要如何解决呢?接下来我们就带着这三个问题开始今天的学习。

问题重现

我们可以在容器里运行一下 iperf3 命令,向容器外部发送一下数据,从 iperf3 的输出"Retr"列里,我们可以看到有多少重传的数据包。
比如下面的例子里,我们可以看到有 162 个重传的数据包。
# iperf3 -c 192.168.147.51
Connecting to host 192.168.147.51, port 5201
[ 5] local 192.168.225.12 port 51700 connected to 192.168.147.51 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 1001 MBytes 8.40 Gbits/sec 162 192 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 9.85 GBytes 8.46 Gbits/sec 162 sender
[ 5] 0.00-10.04 sec 9.85 GBytes 8.42 Gbits/sec receiver
iperf Done.
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了容器中网络乱序包问题的成因和解决方法。作者首先通过实际案例指出,在容器中数据包的重传数量明显增加,引发了对网络乱序问题的关注。接着,作者通过运行iperf3和netstat命令,展示了如何判断数据包重传是由网络丢失还是乱序引起的。在问题分析部分,作者详细解释了快速重传(fast retransmit)的概念,并介绍了SACK(选择性确认)对快速重传的影响。此外,作者还分析了veth接口的数据包发送过程,指出这种方式增加了容器向外发送数据出现乱序的几率。进一步讨论了Linux内核中的RPS(Receive Packet Steering)特性,以及如何通过配置RPS减少数据包乱序的几率。总结指出,RPS的配置虽然可以减少数据包乱序,但也会带来额外的系统开销,需要根据实际情况权衡使用。文章内容深入浅出,对于从物理机迁移到容器的用户具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 蒹葭
    RPS 的配置还是会带来额外的系统开销,在某些网络环境中会引起 softirq CPU 使用率的增大。 老师请教一下这里的某些网络环境指的是什么网络环境?具体增大softirq CPU 使用率的原因是什么呢?

    作者回复: RPS会对数据包重新计算hash, 然后把数据包重新分派到新的cpu对应的队列,之后还需要用IPI的中断通知新的cpu, 而在IPI中断之后,就需要再做一次softirq。这样对于高频率收包的情况下, softirq就会明显的增大。 在实际应用的时候,对于物理网络接口,如果已经有了RSS的情况,一般就不需要再打开RPS了。

    2020-12-30
    14
  • po
    网络插件(flanneld、calico、ovs)和iptables的关系有点乱,网络插件也有自己的转发表,比如ovs的流表和iptables的规则是什么关系呢?

    作者回复: ovs和iptables的规则是独立的。 数据包在协议栈中传递的时候有专门的hook点来处理对应的规则,比如iptables规则在netfilter的pre, in, out等hooks点上处理,ovs规则在ovs相关的device上处理。

    2021-01-14
    2
    5
  • 莫名
    赞,感谢老师,学习了新知识 RPS。 试了下,CONFIG_RPS、rps_cpus 开启时,iperf3 测试仍然存在快速重传情况,没有明显改观。是不是漏了什么?

    作者回复: @莫名, 其实除了RSS/RPS外,你还可以去看一下RFS的概念,这个和这一讲的关系不大,并且逻辑要更加复杂,就没有在文档中说明了。 你测试iperf3的环境是什么?如果改了veth的rps_cpus配置,没有效果,那么还要再分析有没有其他情况造成了快速重传。

    2020-12-25
    5
    5
  • 大大
    有深度,有什么方式自动配置veth的rps么

    作者回复: 现成的自动配置的方法我不知道。我们是在自己实现的cni模块里对veth的rps做配置的。

    2021-01-04
    3
  • 上邪忘川
    rps_cpus 是一个 16 进制的数,每个 bit 代表一个 CPU。那么12个CPU,为啥是FFF?请教一下

    作者回复: 一个F是4个bits, 总共三个F, 那么是4 * 3 = 12

    2020-12-31
    3
  • Geek2014
    有一点不适很明白:“我们的用户把他们的应用程序从物理机迁移到容器之后,从网络监控中发现,容器中数据包的重传的数量要比在物理机里高了不少” 我理解,这个是因为容器的环境没有设置那个RPS导致的?也就是物理机器如果没设置也会有类似的问题吧

    作者回复: 物理机上的网卡和驱动一般都有RSS, 一般不需要RPS。

    2020-12-28
    3
  • 大拇哥
    1.这个网络包的乱序导致的重传最终造成的影响就是网络传输的延迟和吞吐量的下降? 2.这个问题你需要根据实际情况来做个权衡。这个实际情况是指?是说开启rps带来的softirq CPU增高和网络延迟的权衡吗还是说其它方面的权衡? 这个感觉没有讲清楚,还请老师赐教。

    作者回复: @LWW >1 对的,乱序重传,最终会影响到延时和吞吐量。 >2 RPS会对数据包重新计算hash, 然后把数据包重新分派到新的cpu对应的队列,之后还需要用IPI的中断通知新的cpu, 而在IPI中断之后,就需要再做一次softirq。这样对于高频率收包的情况下, softirq就会明显的增大。 在实际应用的时候,对于物理网络接口,如果已经有了RSS的情况,一般就不需要再打开RPS了。

    2020-12-25
    2
    2
  • 拂尘
    请教老师一个问题,设置veth pair的rps,在两端host和container都需要配置吗?

    作者回复: 可以根据节点上网络的情况来决定在哪一端配置rps.

    2021-07-27
  • 谢哈哈
    内核参数tcp_reordering是快速重传的一个初始门限值,到达max tcp_reordering的内核参数大小就会触发快速重传,而tp->reordering是乱序的数据量bytes总大小,触发到达一定大小也会触发快速重传,两者没什么关系,但都是触发快速重传的一个必要条件
    2020-12-25
    1
    3
  • Geek_1b26d5
    用的来说是正常的,大神帮我们把原理说明白儿了
    2022-11-09归属地:广东
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部