爱可生测试团队成员,紧张卖力 TXLE 开源项目干系测试任务,善于 Python 自动化测试开拓,最近醉心于 Linux 性能剖析优化的干系知识。
本文来源:原创投稿
爱可生开源社区出品,原创内容未经授权不得随意利用,转载请联系
最近在极客韶光长进修《Linux 性能优化实战》,打仗到了基于 eBPF 的 BCC 软件包。本日来分享一下 bcc 软件包中用来不雅观测 MySQL 的几个工具。

1. 什么是 BPF 和 eBPFBPF = Berkeley Packet Filterhttps://en.wikipedia.org/wiki/BerkeleyPacketFilterBPF 是类 Unix 系统上数据链路层的一种原始接口,供应原始链路层封包的收发BPF 支持过滤数据包——用户态的进程可以供应一个过滤程序来声明它想收到哪些数据包从 3.18 版本开始,Linux 内核供应了一种扩展的 BPF 虚拟机,被称为“extended BPF“,简称为 eBPF。它能够被用于非网络干系的功能,比如附在不同的 tracepoints 上,从而获取当前内核运行的许多信息
实际上 tcpdump 利用的 libpcap 便是基于 BPF 的。而接下来我们要先容的基于 eBPF 的 bcc 软件包可以大略的理解为过滤内核运行信息的 "tcpdump"。
以下是一张 BPF 的事情流程图:
2. 什么是 bccBcc 的开源项目:https://github.com/iovisor/bcceBPF 虚拟机利用的是类似于汇编措辞的指令,对付程序编写来说直策应用难度非常大。bcc 供应了一个名为 bcc 的 python 库,简化了 eBPF 运用的开拓过程Bcc 网络了大量现成的 eBPF 程序可以直接拿来利用,可以通过以下工具分布图感想熏染一下3. 安装 bcc
# 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# CentOSyum install bcc-toolsexport PATH=$PATH:/usr/share/bcc/tools
以 CentOS 7.7 的系统为例,安装后的工具集如下:
[root@liuan tools]# lsargdist btrfsslower dbslower ext4dist gethostlatency killsnoop nfsslower perlflow pythonflow rubystat solisten tclobjnew tcpstates vfsstatbashreadline cachestat dbstat ext4slower hardirqs lib nodegc perlstat pythongc runqlat sslsniff tclstat tcpsubnet wakeuptimebiolatency cachetop dcsnoop filelife javacalls llcstat nodestat phpcalls pythonstat runqlen stackcount tcpaccept tcptop xfsdistbiosnoop capable dcstat fileslower javaflow mdflush offcputime phpflow reset-trace runqslower statsnoop tcpconnect tcptracer xfsslowerbiotop cobjnew deadlock_detector filetop javagc memleak offwaketime phpstat rubycalls shmsnoop syncsnoop tcpconnlat tplistbitesize cpudist deadlock_detector.c funccount javaobjnew mountsnoop oomkill pidpersec rubyflow slabratetop syscount tcpdrop tracebpflist cpuunclaimed doc funclatency javastat mysqld_qslower opensnoop profile rubygc sofdsnoop tclcalls tcplife ttysnoopbtrfsdist criticalstat execsnoop funcslower javathreads nfsdist perlcalls pythoncalls rubyobjnew softirqs tclflow tcpretrans vfscount
1)dbstat
功能:将 MySQL/PostgreSQL 的查询延迟汇总为直方图
语法:
dbstat [-h] [-v] [-p [PID [PID ...]]] [-m THRESHOLD] [-u] [-i INTERVAL] {mysql,postgres}
选项:
{mysql,postgres} # 不雅观测哪种数据库-h, --help # 显示帮助然退却撤退出-v, --verbose # 显示BPF程序-p [PID [PID ...]], --pid [PID [PID ...]] # 要不雅观测的进程号,空格分隔-m THRESHOLD, --threshold THRESHOLD # 只统计查询延迟比此阈值高的-u, --microseconds # 以微秒为韶光单位来显示延迟(默认单位:毫秒)-i INTERVAL, --interval INTERVAL # 打印择要的韶光间隔(单位:秒)
示例:
# 利用 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 | |
2)dbslower
功能:跟踪 MySQL/PostgreSQL 的查询韶光高于阈值
语法:
dbslower [-h] [-v] [-p [PID [PID ...]]] [-x PATH] [-m THRESHOLD] {mysql,postgres}
参数:
{mysql,postgres} # 不雅观测哪种数据库 -h, --help # 显示帮助然退却撤退出 -v, --verbose # 显示BPF程序 -p [PID [PID ...]], --pid [PID [PID ...]] # 要不雅观测的进程号,空格分隔 -m THRESHOLD, --threshold THRESHOLD # 只统计查询延迟比此阈值高的 -x PATH, --exe PATH # 数据库二进制文件的位置
示例:
# 利用sysbench在被不雅观测数据库上实行update_index [root@liuan tools]# dbslower mysql -p `pidof mysqld` -m 2 Tracing database queries for pids 3350 slower than 2 ms... TIME(s) PID MS QUERY 1.765087 3350 2.996 UPDATE sbtest1 SET k=k+1 WHERE id=963 3.187147 3350 2.069 UPDATE sbtest1 SET k=k+1 WHERE id=628 5.945987 3350 2.171 UPDATE sbtest1 SET k=k+1 WHERE id=325 7.771761 3350 3.853 UPDATE sbtest1 SET k=k+1 WHERE id=595
dbslower man page:
https://github.com/iovisor/bcc/blob/master/man/man8/mysqld_qslower.8#L17-L18