如何使用 bcc 工具观测 MySQL 延迟-爱可生

作者:刘安

爱可生测试团队成员,主要负责 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 的工作流程图:

如何使用 bcc 工具观测 MySQL 延迟-爱可生

2. 什么是 bcc

  • Bcc 的开源项目:https://github.com/iovisor/bcc
  • eBPF 虚拟机使用的是类似于汇编语言的指令,对于程序编写来说直接使用难度非常大。bcc 提供了一个名为 bcc 的 python 库,简化了 eBPF 应用的开发过程
  • Bcc 收集了大量现成的 eBPF 程序可以直接拿来使用,可以通过以下工具分布图感受一下
如何使用 bcc 工具观测 MySQL 延迟-爱可生

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 queries 

for

pids

3350

slower than

0

ms...^C[

14

:

42

:

26

] query latency (us) : count distribution

0

->

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。
如何使用 bcc 工具观测 MySQL 延迟-爱可生


分享到:


相關文章: