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