-
同时,老的 ovs 会将所有的 OpenFlow 规则进行备份。
-
这一切完成之后,老进程会返回 JSON-RPC 的请求的响应。如果上述过程无问题,则返回成功,升级继续。否则返回失败,新进程会退出,升级失败。同时老进程会状态回滚,将之前释放的资源又重新申请回来,回到正常的工作状态。
-
新进程获得各种状态信息,开始正常初始化。包括 DPDK 初始化内存,ovs 从 ovsdb 中获取网桥、网卡等各种配置开始初始化等。在这个过程中,如果出现异常,新进程 crash,会导致 JSON-RPC 这个 unix socket 连接中断。一旦老进程检测到这个连接中断,就认为新进程初始化失败,自动回滚。
-
新进程加载之前备份的 OpenFlow 规则。这之间的 OpenFlow 规则变更,会由 local controller 记录并下发。
-
新进程发起第二阶段 JSON-RPC 请求。
-
第二阶段:
-
- 老进程退出。
-
新进程开启 pmd 线程开始转发。
-
升级结束。
下图简单的描述了升级时序图:
由升级时序图可以看出,热升级第一阶段里新 ovs 进程完成了最耗时的初始化工作,同时老 ovs 进程一直在进行转发,并没有断网。断网只是在第二阶段老 ovs 退出和新 ovs 启动 PMD 线程之间发生。
在升级过程中,我们利用了 MLNX 网卡一个特性:同一个网卡设备可以被两个独立的 dpdk 进程同时打开,并且流量会被同时镜像到两个进程中去。如果使用其他的网卡,可以通过多 VF 配合流表规则切换的方法达到同样效果。这里就不再展开叙述了。
断网时间评估
======
我们考察了两种虚拟网卡后端的断网时间:
-
采用 representer + VF 的方式,
-
采用 vhost-user + virtio 的方式。
测试方法
两台宿主机上两台虚机互相 ping,使用ping -i 0.01
。两次 ping 之间相隔 10ms,最后统计在升级中,ping 包未回的数量即表示升级断网时间。iperf -i 1
测试,观察 TCP 吞吐是否会受到影响。
representer + VF 方式
ping 测试
10 次试验结果如下:
1524 packets transmitted, 1524 received, +36 duplicates, 0% packet loss, time 16747ms
623 packets transmitted, 622 received, +29 duplicates, 0% packet loss, time 6830ms
662 packets transmitted, 662 received, +30 duplicates, 0% packet loss, time 7263ms
725 packets transmitted, 724 received, +28 duplicates, 0% packet loss, time 7955ms
636 packets transmitted, 635 received, +28 duplicates, 0% packet loss, time 6973ms
752 packets transmitted, 750 received, +27 duplicates, 0% packet loss, time 8251ms
961 packets transmitted, 961 received, +31 duplicates, 0% packet loss, time 10551ms
737 packets transmitted, 737 received, +29 duplicates, 0% packet loss, time 8084ms
869 packets transmitted, 869 received, +27 duplicates, 0% packet loss, time 9543ms
841 packets transmitted, 840 received, +28 duplicates, 0% packet loss, time 9228ms
发现最多出现 1 个丢包,说明断网时间最长 10ms。但是发现了很多 duplicates 的包,这个是因为 mlnx 网卡在 switchdev 模式下有一个 bug:当出现双进程时,本应该流量被镜像到另一个进程,结果 mlnx 网卡让一个进程收到了两个重复包,而另一个进程没有包。目前 mlnx 已经确认了这个问题。
iperf 测试
观测到升级期间,有 1s 速率减半,由满速率 22Gbps 到 13Gbps,估计是和 MLNX bug 引发的重传包和升级断网有关。1s 之后迅速回到 22Gbps。
vhost-user + virtio 模式
ping 测试
断网时间在 70~80ms 左右。通过对日志分析,发现是老进程在退出时,反复进行了 vhost 重连导致,这块通过继续优化,断网时间会进一步降低。这里就不再展开了。
iperf 测试
和 VF 方式结果类似,也是吞吐会有一定的下降,升级完成后立刻恢复。
相关代码
====
我们使用的 ovs-dpdk 已经开源。如果对热升级的具体实现有兴趣,可以参考 vswitchd 目录下 ndu.c 文件。在 utilities 目录下我们提供了 ovs-nductl 工具用于测试热升级 JSON-RPC 服务,可以模拟热升级。升级脚本参考 utilities 目录下的 ovs-hotupgrade.sh。我们的开源链接为:https://github.com/bytedance/ovs-dpdk
更多分享
====
字节跳动系统部 STE 团队
=================
字节跳动系统部 STE 团队一直致力于操作系统内核与虚拟化、系统基础软件与基础库的构建和性能优化、超大规模数据中心的稳定性和可靠性建设、新硬件与软件的协同设计等基础技术领域的研发与工程化落地,具备全面的基础软件工程能力,为字节上层业务保驾护航。同时,团队积极关注社区技术动向,拥抱开源和标准。欢迎更多有志之士加入,如有意向可发送简历至 sysrecruitment@bytedance.com 。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/38483641a1ad306f3dc1d0f2e98f94c7.jpeg)
最后
这里我特地整理了一份《Android开发核心知识点笔记》,里面就包含了自定义View相关的内容
除了这份笔记,还给大家分享 Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。
分享上面这些资源,希望可以帮助到大家提升进阶,如果你觉得还算有用的话,不妨把它们推荐给你的朋友~
喜欢本文的话,给我点个小赞、评论区留言或者转发支持一下呗~
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
fBwmnU-1712486120966)]
分享上面这些资源,希望可以帮助到大家提升进阶,如果你觉得还算有用的话,不妨把它们推荐给你的朋友~
喜欢本文的话,给我点个小赞、评论区留言或者转发支持一下呗~
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!