如何使用 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 延遲-愛可生


分享到:


相關文章: