eBCC性能分析最佳实践(0) - 开启性能分析新篇章

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: BCC是基于4.x kernel版本上的ebpf发展出来的一套性能分析工具集; eBCC,顾名思义则是extended BCC的缩写,是阿里巴巴内核团队在Aliyun Linux上对BCC项目的拓展,包含BCC本身已有的工具集,和我们新开发的一些小的工具; eBCC则是基于在最新的BCC版本0.9之上做了一些拓展。

Guide:

0. eBCC Introduction

BCC是基于4.x kernel版本上的ebpf发展出来的一套性能分析工具集;

eBCC,顾名思义则是extended BCC的缩写,是阿里巴巴内核团队在Aliyun Linux 2上对BCC项目的拓展,包含BCC本身已有的工具集,和我们新开发的一些小的工具; eBCC则是基于在最新的BCC版本0.9之上做了一些拓展。

Aliyun Linux则使用了相对比较前沿,较新的kernel版本,支持ebpf特性,所以,如果想尝试ebpf,eBCC带来的系统上对“性能优化调试” 和 “问题诊断”上的新体验,那就请赶快升级到Aliyun Linux 2上吧。

1. Linux未来监控tracing框架:eBPF

eBPF源于早年间的成型于 BSD 之上的传统技术 BPF(Berkeley Packet Filter)。BPF 的全称是 Berkeley Packet Filter,顾名思义,这是一个用于过滤(filter)网络报文(packet)的架构。

BPF 是在 1997 年首次被引入 Linux 的,Linux 内核中的报文过滤机制其实是有自己的名字的:Linux Socket Filter,简称 LSF。

从 3.15 开始,一个套源于 BPF 的全新设计开始,在3.17被添置到了 kernel/bpf 下。全新设计最终被命名为了 extended BPF(eBPF);为了后向兼容,传统的 BPF 仍被保留了下来,并被重命名为 classical BPF(cBPF)。相对于 cBPF,eBPF 带来的改变可谓是革命性的:一方面,它已经为内核追踪(Kernel Tracing)、应用性能调优/监控、流控(Traffic Control)等领域带来了激动人心的变革;另一方面,在接口的设计以及易用性上,eBPF 也有了较大的改进。

cBPF 所覆盖的功能范围很简单,就是网络监控和 seccomp 两块,数据接口设计的粗放;而 eBPF 的利用范围要广的多,性能调优、内核监控、流量控制什么的,数据接口的多样性设计。

由一个文件(net/core/filter.c)进化到一个目录(kernel/bpf)

目前,支持生成 BPF 伪代码的编译器只有 llvm 一家,即使是通篇使用 gcc 编译的 Linux 内核,samples 目录下的 bpf 范例也要借用 llvm 来编译完成。

下图是ebpf的工作机制:

image

2. eBCC是什么?

用一句话简单的说: eBCC是一个工具集, 用来做Kernel space 和 User space 用户程序的, 问题排查,和性能诊断!

eBCC能做什么呢?

image

现在可以用 C 来实现 BPF,但编译出来的却仍然是 ELF 文件,开发者需要手动析出真正可以注入内核的代码。这工作有些麻烦,于是就有人设计了 BPF Compiler Collection(BCC),BCC 是一个 python 库,但是其中有很大一部分的实现是基于 C 和 C++的,python实现了对 BCC 应用层接口的封装。而eBCC则是对BCC的拓展和开发。

使用 eBCC 进行 BPF 的开发仍然需要开发者自行利用 C 来设计 BPF 程序——但也仅此而已,余下的工作,包括编译、解析 ELF、加载 BPF 代码块以及创建 map 等等基本可以由 eBCC 一力承担,无需多劳开发者费心。

eBCC tracing:

image

3. eBCC安装

3.1 方式:RPM包安装:

安装eBCC:

# yum install -y ebcc
# yum install -y ebcc-osstat

完事儿。

4. eBCC使用

  • eBCC 里面包含了一系列的 “工具集”,这些工具是module化的开发,主要运用场景是 “profiling” 性能优化 和“出现性能问题的时候的debug” 场景,但是,对于某些重要的module,我们也增加了 monitor的监控的方式,可以直接将数据 传送到 alimonitor(需要简单配置一下alimonitor的监控项,但是数据量大的时候开销可能会比较大);
  • 运行方式:支持command line(主要,推荐), daemonize(部分module)的方式运行;

    • command line: 直接打印到console上,支持排序等功能。
    • daemonize:需要配置化管理(/etc/osstat/osstat.conf),将数据json格式打印到 (/var/log/osstat.log)
  • 工具集:

    • /usr/share/ebcc/tools
    • /usr/share/ebcc/osstat/tools/
    • osstat:

      • syscall:支持将所有的syscall的次数和时间统计上来,并且可以根据时间或者次数排序输出
      • softirq
      • 等等

比如,eBCC中的一个工具:osstat,osstat将会包含多个module

4.0 ebcc

首先,我们先看下ebcc下都有哪些小工具呢?

这里我们提供了一个简单的ebcc小命令:

#ebcc
  An advanced Linux Performance Profling toolset: eBCC

  Usage ebcc:
    -h   - Help
    -t   - Show all supported tools, classify with type
    -a   - Show all supported tools totally

  Examples:
    ebcc -h
    ebcc -t
    ebcc syscount -h
    ebcc vfsstat 1 10
    ebcc osstat -m syscall -h

ebcc -t 对小工具进行分类:

#ebcc -t
tcp:
    tcpaccept
    tcpconnect
    tcpconnlat
    tcplife
    tcpretrans
    tcpstates
    tcpsubnet
    tcptop
    tcptracer
func:
    funccount
    funclatency
    funcslower
vfs:
    vfscount
    vfsstat
syscall:
    syscount
    osstat -m syscall -h
ext4:
    ext4dist
    ext4slower
file:
    filelife
    fileslower
    filetop
    
...

决定使用哪个工具,只需要在ebcc 后面直接添加 "工具名字 -h", 便可以查看工具对应的功能

# ebcc vfscount -h 

4.1 工具:osstat

osstat是一个比较重要的工具之一, osstat中的syscall module 可以将从将一个OS系统上的, 所有的syscall 捕获,并且将 次数和时间统计出来,并且,支持sys, pid 两个级别。 syscall 是用户态进入 内核态的 入口。 osstat -m syscall 可以帮助 分析 cpu sys的开销究竟是用户态的 疯狂使用导致,还是 内核函数本身存在 latency? 这非常有助于 用户态开发者和内核态开发者一起分析性能问题。

# ebcc osstat -h 
...
...
...
Examples:
  command mode: (-l)
  #osstat -m syscall -t 10 -i 1 -u 1 -l sys
  #osstat -m syscall -t 10 -i 1 -u 1 -l sys -n 10
  #osstat -m syscall -t 10 -i 1 -u 1 -l sys -n 10 -T
  #osstat -m syscall -t 10 -i 1 -u 1 -l pid
  #osstat -m syscall -t 10 -i 1 -u 1 -l pid -p 1
  daemonize mode: (-d)
  #osstat -d -i 7 -u 3
  #osstat -d -i 7 -u 3 -n 3
  #osstat -d -i 7 -u 3 -f /etc/osstat/osstat.conf

4.1.1 首先看看osstat 工具包含了哪些模块

#ebcc osstat -M
Supported Modules:
    -m syscall
    -m softirq
    -m pgfault

4.1.2 osstat -m syscall sys级别

#ebcc osstat -m syscall -t 10 -i 1 -u 1 -l sys -n 10 -T
NR           SYSCALL           COUNT              TIME               MIN                MAX
=================================================================================================
35          nanosleep         2883               907074501          236                3944864
281         epoll_pwait       27                 820857284          210                773773366
23          select            2619               762921173          100                2951538
232         epoll_wait        14404              551436152          58                 1048206
202         futex             304891             301412809          0                  1251552
6           lstat             130117             291113663          287                40958
0           read              45173              95759688           21                 656713
217         getdents64        26238              75171208           214                82231
1           write             8497               56316398           177                169597
270         pselect6          706                50987375           199                1391351
61          wait4             276                49677081           202                8727287
NR           SYSCALL           COUNT              TIME               MIN                MAX
=================================================================================================
35          nanosleep         3347               910159174          134                1103293
23          select            2529               764573883          129                3241268
232         epoll_wait        15093              528232341          80                 983735
202         futex             399478             312154858          2                  73387
6           lstat             109124             243709631          319                61048
281         epoll_pwait       41                 189470734          273                161519558
0           read              23374              94921119           88                 721009
1           write             10737              74747585           107                95367
217         getdents64        34223              73694555           211                80931
270         pselect6          1301               66246720           233                78281
7           poll              843                47574550           229                3452827
NR           SYSCALL           COUNT              TIME               MIN                MAX

4.1.3 osstat -m syscall pid级别

#ebcc osstat -m syscall -t 10 -i 1 -u 1 -l pid -n 10 -T
PID                NR           SYSCALL            COUNT              TIME               MIN                MAX
=================================================================================================================
110811             232         epoll_wait         290                1010778217         51616              60855391
23562              23          select             100                1005190909         10040021           10059593
94425              23          select             100                1005115914         10030841           10064314
5215               202         futex              71                 1001496291         118                50058356
4663               202         futex              67                 1001326053         248                50058880
4079               232         epoll_wait         1                  1001010674         1001010674         1001010674
14622              7           poll               3                  1000988330         470                1000987095
37574              23          select             40                 1000883822         13119428           36926820
22902              232         epoll_wait         33                 1000831340         188043             42588209
123536             61          wait4              3                  1000769383         388                1000768392
4513               232         epoll_wait         47                 1000573946         84183              117256230

4.1.4 osstat -m softirq sys级别

#ebcc -m softirq -t 10 -i 1 -u 1 -l sys -T  -n 10
NUM          SOFTIRQ           COUNT              TIME               MIN                MAX
=================================================================================================
1           timer             365                532979             389                35078
7           sched             148                371802             496                54114
3           net_rx            62                 326907             1508               25594
9           rcu               248                180176             320                4579
4           block             3                  13255              2669               6135
2           net_tx            1                  4666               4666               4666

NUM          SOFTIRQ           COUNT              TIME               MIN                MAX
=================================================================================================
3           net_rx            86                 461913             886                32398
1           timer             202                343770             222                18041
7           sched             161                216259             340                4418
9           rcu               175                106446             134                4195

NUM          SOFTIRQ           COUNT              TIME               MIN                MAX
=================================================================================================
3           net_rx            250                790444             500                38084
1           timer             241                481612             175                37471
7           sched             159                294294             304                47044
9           rcu               189                131113             249                7499

工具:funclatency

funclatency 可以将 内核中的重要的 函数的latency统计出来,并且,模拟做一个 柱状图, 主要关心的还是时间!

#ebcc funclatency -mTi 1 vfs_read
Tracing 1 functions for "vfs_read"... Hit Ctrl-C to end.

17:14:20
     msecs               : count     distribution
         0 -> 1          : 34376    |****************************************|
         2 -> 3          : 38       |                                        |
         4 -> 7          : 21       |                                        |
         8 -> 15         : 12       |                                        |
        16 -> 31         : 1        |                                        |
        32 -> 63         : 4        |                                        |
        64 -> 127        : 2        |                                        |
       128 -> 255        : 1        |                                        |

17:14:21
     msecs               : count     distribution
         0 -> 1          : 75623    |****************************************|
         2 -> 3          : 44       |                                        |
         4 -> 7          : 25       |                                        |
         8 -> 15         : 18       |                                        |
        16 -> 31         : 6        |                                        |
        32 -> 63         : 4        |                                        |
        64 -> 127        : 9        |                                        |
       128 -> 255        : 5        |                                        |
       256 -> 511        : 1        |                                        |
       512 -> 1023       : 5        |                                        |

4.2 工具funccount

#ebcc funccount -Ti 1 'vfs_*'
Tracing 49 functions for "vfs_*"... Hit Ctrl-C to end.

17:24:16
FUNC                                    COUNT
vfs_readv                                   1
vfs_statfs                                 96
vfs_writev                                108
vfs_getxattr                              128
vfs_rename                                224
vfs_lock_file                             405
vfs_get_link                             1895
vfs_fstat                                3814
vfs_write                               10657
vfs_open                                17892
vfs_read                                20974
vfs_fstatat                            151758
vfs_getattr                            168803
vfs_getattr_nosec                      184572

4.2 工具mysqld_qslower

利用mysql中的USDT, 在mysql server端,追踪 mysql 语句执行的lantency

请使用CMake的-DENABLE_DTRACE = 1-DENABLE_DTRACE = 0 选项。

执行:

MariaDB [mysql]> select * from time_zone;
Empty set (0.00 sec)

MariaDB [mysql]>

trace latency:

可以看到 select * from time_zone SQL语句的lentency: 0.160ms

#ebcc mysqld_qslower 101983  0
Tracing MySQL server queries for PID 101983 slower than 0 ms...
TIME(s)        PID          MS QUERY
0.000000       54806     0.098 select @@version_comment limit 1
3.959677       54806     0.054 show datebases
15.462936      54806     0.269 show databases
23.710874      54806     0.090 SELECT DATABASE()
23.712041      54806     0.199 show databases
23.712308      54806     0.224 show tables
26.310581      54806     0.293 show tables
35.086895      54806     0.160 select * from time_zone
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
监控 NoSQL MongoDB
|
网络协议 Linux
eBCC性能分析最佳实践(2) - 一个简单的eBCC分析网络函数的latency
线上TCP链接是无处不在,经常出现的网络latency,究竟是发生在kernel的网络协议栈上?还是发生在网络本身链路上?静看eBCC如何分析?
1382 0
|
Linux
eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析
最近,在某个业务线上,发现 lstat 对cpu sys的开销占用比较大,需要查找凶手...
1463 0
|
2月前
|
算法 Unix Linux
【C/C++ 实用工具】性能分析工具一览
【C/C++ 实用工具】性能分析工具一览
79 0
|
2月前
|
Rust 数据可视化 安全
Rust性能分析工具概览:perf、flamegraph 与其他
Rust作为一种高性能、内存安全的编程语言,在构建大型系统和微服务时备受青睐。然而,优化Rust程序的性能需要有效的工具。本文将对Rust中常用的性能分析工具进行介绍,包括perf、flamegraph等,并探讨它们如何帮助开发者定位和解决性能瓶颈。
|
2月前
|
数据可视化 关系型数据库 编译器
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
401 2
|
2月前
|
Web App开发 JavaScript 前端开发
JavaScript中的性能优化:代码优化技巧与性能分析工具
【4月更文挑战第22天】本文探讨JavaScript性能优化,包括代码优化技巧和性能分析工具。建议避免全局查找、减少DOM操作、使用事件委托、优化循环和异步编程以提升代码效率。推荐使用Chrome DevTools、Lighthouse和jsPerf等工具进行性能检测和优化。持续学习和实践是提升JavaScript应用性能的关键。
|
2月前
|
监控 Java 开发者
Java一分钟之-Java性能分析与调优:JProfiler, VisualVM等工具
【5月更文挑战第21天】本文介绍了Java性能优化的两个利器——JProfiler和VisualVM。JProfiler通过CPU Profiler、内存分析器和线程视图帮助解决过度CPU使用、内存泄漏和线程阻塞问题;VisualVM则聚焦于GC行为调整和类加载优化,以减少内存压力和提高应用性能。使用这些工具进行定期性能检查,是提升Java应用效率的关键。
49 0
3个常用的Python性能分析工具及其使用方法
以下是几个常用的性能分析工具及其使用方法和常用命令: