愛可生測試團隊成員,主要負責 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# CentOSyum install bcc-toolsexport PATH=$PATH:/usr/share/bcc/tools/<code>
以 CentOS 7.7 的系統為例,安裝後的工具集如下:
<code>[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/<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> # 使用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/<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。
dbslower man page:
https://github.com/iovisor/bcc/blob/master/man/man8/mysqld_qslower.8#L17-L18
閱讀更多 愛可生 的文章