You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
6.5 KiB
121 lines
6.5 KiB
7 months ago
|
Demonstrations of dbstat, the Linux eBPF/bcc version.
|
||
|
|
||
|
|
||
|
dbstat traces queries performed by a MySQL or PostgreSQL database process, and
|
||
|
displays a histogram of query latencies. For example:
|
||
|
|
||
|
# dbstat mysql
|
||
|
Tracing database queries for pids 25776 slower than 0 ms...
|
||
|
query latency (ms) : count distribution
|
||
|
0 -> 1 : 990 |****************************************|
|
||
|
2 -> 3 : 7 | |
|
||
|
4 -> 7 : 0 | |
|
||
|
8 -> 15 : 0 | |
|
||
|
16 -> 31 : 0 | |
|
||
|
32 -> 63 : 0 | |
|
||
|
64 -> 127 : 0 | |
|
||
|
128 -> 255 : 0 | |
|
||
|
256 -> 511 : 0 | |
|
||
|
512 -> 1023 : 0 | |
|
||
|
1024 -> 2047 : 2 | |
|
||
|
^C
|
||
|
|
||
|
It's immediately evident that the vast majority of queries finish very quickly,
|
||
|
in under 1ms, but there are some super-slow queries occasionally, in the 1-2
|
||
|
seconds bucket.
|
||
|
|
||
|
We can filter out the shorter queries with the -m switch:
|
||
|
|
||
|
# dbstat mysql -m 1000
|
||
|
Tracing database queries for pids 25776 slower than 1000 ms...
|
||
|
query latency (ms) : 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 : 0 | |
|
||
|
1024 -> 2047 : 8 |****************************************|
|
||
|
^C
|
||
|
|
||
|
By default, dbstat will try to detect mysqld and postgres processes, but if
|
||
|
necessary, you can specify the process ids with the -p switch. Here, the -i
|
||
|
switch is also used to request histograms at 3 second intervals:
|
||
|
|
||
|
# dbstat mysql -p $(pidof mysql) -i 3
|
||
|
Tracing database queries for pids 25776 slower than 0 ms...
|
||
|
[06:14:36]
|
||
|
query latency (ms) : count distribution
|
||
|
0 -> 1 : 758 |****************************************|
|
||
|
2 -> 3 : 1 | |
|
||
|
4 -> 7 : 0 | |
|
||
|
8 -> 15 : 0 | |
|
||
|
16 -> 31 : 0 | |
|
||
|
32 -> 63 : 0 | |
|
||
|
64 -> 127 : 0 | |
|
||
|
128 -> 255 : 0 | |
|
||
|
256 -> 511 : 0 | |
|
||
|
512 -> 1023 : 0 | |
|
||
|
1024 -> 2047 : 1 | |
|
||
|
|
||
|
[06:14:39]
|
||
|
query latency (ms) : count distribution
|
||
|
0 -> 1 : 436 |****************************************|
|
||
|
2 -> 3 : 2 | |
|
||
|
4 -> 7 : 0 | |
|
||
|
8 -> 15 : 0 | |
|
||
|
16 -> 31 : 0 | |
|
||
|
32 -> 63 : 0 | |
|
||
|
64 -> 127 : 0 | |
|
||
|
128 -> 255 : 0 | |
|
||
|
256 -> 511 : 0 | |
|
||
|
512 -> 1023 : 0 | |
|
||
|
1024 -> 2047 : 1 | |
|
||
|
|
||
|
[06:14:42]
|
||
|
query latency (ms) : count distribution
|
||
|
0 -> 1 : 399 |****************************************|
|
||
|
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 : 0 | |
|
||
|
1024 -> 2047 : 1 | |
|
||
|
^C
|
||
|
|
||
|
|
||
|
USAGE:
|
||
|
# dbstat -h
|
||
|
usage: dbstat.py [-h] [-v] [-p [PID [PID ...]]] [-m THRESHOLD] [-u]
|
||
|
[-i INTERVAL]
|
||
|
{mysql,postgres}
|
||
|
|
||
|
positional arguments:
|
||
|
{mysql,postgres} the database engine to use
|
||
|
|
||
|
optional arguments:
|
||
|
-h, --help show this help message and exit
|
||
|
-v, --verbose print the BPF program
|
||
|
-p [PID [PID ...]], --pid [PID [PID ...]]
|
||
|
the pid(s) to trace
|
||
|
-m THRESHOLD, --threshold THRESHOLD
|
||
|
trace queries slower than this threshold (ms)
|
||
|
-u, --microseconds display query latencies in microseconds (default:
|
||
|
milliseconds)
|
||
|
-i INTERVAL, --interval INTERVAL
|
||
|
print summary at this interval (seconds)
|
||
|
|
||
|
dbstat postgres # display a histogram of PostgreSQL query latencies
|
||
|
dbstat mysql -v # display MySQL latencies and print the BPF program
|
||
|
dbstat mysql -u # display query latencies in microseconds (default: ms)
|
||
|
dbstat mysql -m 5 # trace only queries slower than 5ms
|
||
|
dbstat mysql -p 408 # trace queries in a specific process
|