[置顶] 泰晓 RISC-V 实验箱,配套 30+ 讲嵌入式 Linux 系统开发公开课
[置顶] Linux Lab v1.4 升级部分内核到 v6.10,新增泰晓 RISC-V 实验箱支持,新增最小化内核配置支持大幅提升内核编译速度,在单终端内新增多窗口调试功能等Linux Lab 发布 v1.4 正式版,升级部分内核到 v6.10,新增泰晓实验箱支持
[置顶] 泰晓社区近日发布了一款儿童益智版 Linux 系统盘,集成了数十个教育类与益智游戏类开源软件国内首个儿童 Linux 系统来了,既可打字编程学习数理化,还能下棋研究数独提升智力
云端网络性能衰退分析和定位实战
By 高承博 金琦 刘唐 of TinyLab.org 2020/01/17
前言
用 iperf3 进行 udp 和 tcp 性能测试是云环境中很基本的性能测试,其中 udp 的带宽是评价虚机网络很重要的指标。
我们在 centos 两个不同版本中发现 iperf3 udp 网络性能测试结果出现差异,本文分析并定位了其原因,用到经典的 perf 和火焰图。
iperf3 网络性能测试
iperf3 是一套常见的网络吞吐量性能测试工具,本文用它来做网络性能测试。
iperf3 打 udp 64 字节小包命令
server 端
$ iperf3 -s -p 5672
参数解释如下:
-s
:作为 server 端-p 5672
:表示端口号
client 端
$ iperf3 -c xxx.xxx.xx -t 100 -P 1 -u -b 5000M -l 64 -p 5672
参数解释如下:
-c
:作为 client 端-t 100
:表示打流时间为 100 秒-P 1
:表示几个 client 端并行打流-u
:表示报文种类为 udp-b
:表示带宽-l
:报文数据长度(注意是数据长度,不是报文总长度)-p
:填 server 端的监听端口号
测试环境
测试结果
centos 版本1 测试结果:
centos 版本2 测试结果:
可以看到,后者有较为明显的性能衰退。
定位过程
火焰图定位
火焰图命令
$ git clone https://github.com/cobblau/FlameGraph
// -p xxx: 为 iperf3 的进程号
$ perf record -F 99 -p xxx -g -- sleep 10
$ perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > iperf3-xxx.svg
火焰图结果
centos 版本1火焰图:
centos 版本2火焰图:
火焰图分析
从 centos 版本2的火焰图可以看出在 __select
调用后有很大的空档,并且发现版本2火焰图的 system_call_fastpath
的占比明显少了很多,因此怀疑这可能是影响 iperf3 性能的关键。
glibc 前后都是一样的,可以排除。然后从 glibc 的 select
找到了内核的 select.c
文件中的 sys_select
,而 system_call_fastpath
来自 sys_select
,因此接下来重点排查这部分。
检查系统调用代码
system_call
在 X86 的体系架构里 glibc 通过系统调用把系统调用号放到 rax
寄存器,然后调用 syscall
指令进入内核态,这个细节不是本次讨论的重点。
本次关心的是内核的系统调用响应函数:system_call
。
函数的代码 centos 中的版本中放在了 arch/x86/kernel/entry_64.S
中。
system_call
函数中执行了 system_call_fastpath
这个标签,很有可能是在 system_call
函数进入 system_call_fastpath
前做了一些操作导致了 system_call_fastpath
执行的时间变少。
出于此怀疑,继续对比一下两套 centos 版本内核的 system_call
代码。
内核代码对比
版本1代码:
版本2代码:
可以看到版本2在 system_call
代码中加入了:
IBRS_ENTRY /* no indirect jump allowed before IBRS */
FILL_RETURN_BUFFER /* no ret allowed before stuffing the RSB */
经过查询资料发现,这个跟当年 meltdown 漏洞相关。
还有一个是在 system_call_fastpath
中加入了:
#ifdef CONFIG_RETPOLINE
movq sys_call_table(, %rax, 8), %rax
call __x86_indirect_thunk_rax
经过查询资料发现,这个也是跟安全相关的一个补丁。
找到关键修改
接下来,逐个去掉版本2中的相应变更后,继续测试排除。
最终确认主要影响来自以下变更:
小结
以上详细演示了如何结合 perf 和火焰图来分析 iperf3 udp 网络性能衰退,希望对大家有所帮助。
猜你喜欢:
- 我要投稿:发表原创技术文章,收获福利、挚友与行业影响力
- 知识星球:独家 Linux 实战经验与技巧,订阅「Linux知识星球」
- 视频频道:泰晓学院,B 站,发布各类 Linux 视频课
- 开源小店:欢迎光临泰晓科技自营店,购物支持泰晓原创
- 技术交流:Linux 用户技术交流微信群,联系微信号:tinylab
支付宝打赏 | 微信打赏 | |
请作者喝杯咖啡吧 |