作者:刘安
爱可生测试团队成员,主要负责 TXLE 开源项目相关测试任务,擅长 Python 自动化测试开发,最近醉心于 Linux 性能分析优化的相关知识。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
最近在极客时间上学习《Linux 性能优化实战》,接触到了基于 eBPF 的 BCC 软件包。今天来分享一下 bcc 软件包中用来观测 MySQL 的几个工具。
1. 什么是 BPF 和 eBPF
- BPF = Berkeley Packet Filterhttps://en.wikipedia.org/wiki/BerkeleyPacketFilter
- BPF 是类 Unix 系统上数据链路层的一种原始接口,提供原始链路层封包的收发
- BPF 支持过滤数据包——用户态的进程可以提供一个过滤程序来声明它想收到哪些数据包
- 从 3.18 版本开始,Linux 内核提供了一种扩展的 BPF 虚拟机,被称为“extended BPF“,简称为 eBPF。它能够被用于非网络相关的功能,比如附在不同的 tracepoints 上,从而获取当前内核运行的许多信息
实际上 tcpdump 使用的 libpcap 就是基于 BPF 的。而接下来我们要介绍的基于 eBPF 的 bcc 软件包可以简单的理解为过滤内核运行信息的 "tcpdump"。
以下是一张 BPF 的工作流程图:
2. 什么是 bcc
- Bcc 的开源项目:https://github.com/iovisor/bcc
- eBPF 虚拟机使用的是类似于汇编语言的指令,对于程序编写来说直接使用难度非常大。bcc 提供了一个名为 bcc 的 python 库,简化了 eBPF 应用的开发过程
- Bcc 收集了大量现成的 eBPF 程序可以直接拿来使用,可以通过以下工具分布图感受一下
3. 安装 bcc
<code>Ubuntusudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDDecho
"deb https://repo.iovisor.org/apt/
$(lsb_release -cs)
$(lsb_release -cs)
main" | sudo tee /etc/apt/sources.list.d/iovisor.listsudo apt-get updatesudo apt-get install bcc-tools libbcc-examples linux-headers-$(uname -r)export
PATH=$PATH
:/usr/share/bcc/tools/<code>
以 CentOS 7.7 的系统为例,安装后的工具集如下:
<code>[root@liuan tools]/<code>
4. 使用 bcc 工具观测 MySQL:
1)dbstat
功能:将 MySQL/PostgreSQL 的查询延迟汇总为直方图
语法:
<code>dbstat
[-h]
[-v]
[-p [PID [PID ...]
]][-m THRESHOLD]
[-u]
[-i INTERVAL]
{mysql
,postgres
}/<code>
选项:
<code>{mysql
,postgres
} # 观测哪种数据库-h
,--help
# 显示帮助然后退出-v
,--verbose
# 显示BPF
程序-p
[PID [PID ...]
],--pid
[PID [PID ...]
] # 要观测的进程号,空格分隔-m
THRESHOLD
,--threshold
THRESHOLD
# 只统计查询延迟比此阈值高的-u
,--microseconds
# 以微秒为时间单位来显示延迟(默认单位:毫秒)-i
INTERVAL
,--interval
INTERVAL
# 打印摘要的时间间隔(单位:秒)/<code>
示例:
<code># 使用 sysbench 在被观测数据库上执行 select[root@liuan tools]# dbstat mysql -p `pidof mysqld` -uTracing database queriesfor
pids3350
slower than0
ms...^C[14
:42
:26
] query latency (us) : count distribution0
->1
:0
| |2
->3
:0
| |4
->7
:0
| |8
->15
:0
| |16
->31
:0
| |32
->63
:0
| |64
->127
:0
| |128
->255
:0
| |256
->511
:0
| |512
->1023
:491612
|****************************************|1024
->2047
:46152
|**** |2048
->4095
:261
| |4096
->8191
:1
| |8192
->16383
:3
| |/<code>
2)dbslower
功能:跟踪 MySQL/PostgreSQL 的查询时间高于阈值
语法:
<code>dbslower
[-h]
[-v]
[-p [PID [PID ...]
]][-x PATH]
[-m THRESHOLD]
{mysql
,postgres
}/<code>
参数:
<code> {mysql,postgres} # 观测哪种数据库 -h, --help # 显示帮助然后退出 -v, --verbose # 显示BPF程序 -p
[PID [PID ...]
], --pid[PID [PID ...]
] # 要观测的进程号,空格分隔 -m THRESHOLD, --threshold THRESHOLD # 只统计查询延迟比此阈值高的 -x PATH, --exe PATH # 数据库二进制文件的位置/<code>
示例:
<code> /<code>
5. 使用限制
- bcc 基于 eBPF 开发(需要 Linux 3.15 及更高版本)。bcc 使用的大部分内容都需要 Linux 4.1 及更高版本。
- "bcc.usdt.USDTException: failed to enable probe 'query__start'; a possible cause can be that the probe requires a pid to enable" 需要 MySQL 具备 Dtrace tracepoint。