概要
分析 Linux 网络协议栈性能有多种方式和工具。本文主要通过 Perf 生成 On-CPU 火焰图的方式,分析 Linux 内核网络协议栈在特定场景下的性能瓶颈,从而知晓当前协议栈的网络状况。
关于 On/Off-CPU
概念定义
1 2 3 |
On-CPU: where threads are spending time running on-CPU. Off-CPU: where time is spent waiting while blocked on I/O, locks, timers, paging/swapping, etc. |
On/Off-CPU 选择
在工程实践中,如果是 CPU 消耗型使用 On-CPU 火焰图,如果是 IO 消耗型则使用 Off-CPU 火焰图。如果无法确定, 可以通过压测工具来确认: 通过压测工具看能否让 CPU 使用率趋于饱和,从而判断是否为 CPU 消耗型。
分析方法
Perf 火焰图整个图形看起来就像一团跳动的火焰,这也正是其名字的由来。燃烧在火苗尖部的就是 CPU 正在执行的操作,不过需要说明的是颜色是随机的,本身并没有特殊的含义,纵向表示调用栈的深度,横向表示消耗的时间。因为调用栈在横向会按照字母排序,并且同样的调用栈会做合并,所以一个格子的宽度越大越说明其可能是瓶颈。综上所述,主要就是看那些比较宽大的火苗,特别留意那些类似平顶山的火苗。
火焰图原理
火焰图是基于 stack 信息生成图片, 用来展示 CPU 调用栈。
- y 轴表示调用栈, 每一层都是一个函数。调用栈越深, 火焰就越高, 顶部就是正在执行的函数, 下方都是它的父函数。
- x 轴表示抽样数, 如果一个函数在x轴占据越宽, 则表示它被抽到的次数多, 即执行的时间长。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有“平顶”(plateaus),就表示该函数可能存在性能问题。
On-CPU 采集原理
1 2 |
While this can be very effective for studying on-CPU issues, including hot code-paths and adaptive mutex spins, it doesn't gather data when the application has blocked and is waiting off-CPU. |
Linux 内核网络协议栈分析
环境安装
我们在滴滴云申请两个虚拟机,我们分别命名为 VM001、 VM002。官网为 https://www.didiyun.com
VM001、VM002: 安装工具
1 2 3 |
yum install iperf yum install perf |
vm001: 下载 FlameGraph
1 2 |
git clone https://github.com/brendangregg/FlameGraph.git |
VM001: 运行 iperf server
1 2 |
iperf -s -u -D |
VM001: 查看 CPU 以及 softirqd 进程号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[root@10-254-2-161 ]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 1 On-line CPU(s) list: 0 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 79 Model name: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz Stepping: 1 CPU MHz: 2399.996 BogoMIPS: 4799.99 Hypervisor vendor: KVM Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 4096K L3 cache: 16384K NUMA node0 CPU(s): 0 [root@10-254-2-161 ~]# ps -fe | grep ksoftirqd root 3 2 0 15:19 ? 00:00:00 [ksoftirqd/0] |
VM001: 通过如下方式采集信息(采集原理见上)
1 2 |
perf record -F 1000 -a -g -p 3 -- sleep 60 |
VM002: 发送 UDP 数据报文
1 2 |
iperf -c 10.254.2.161 -i 1 -P 10 -t 10 -u -b 1000M |
生成 On-CPU 火焰图
1 2 |
perf script -i /root/perf.data | ./stackcollapse-perf.pl | ./flamegraph.pl > output.svg |
本文作者:张同浩