| 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 |