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.
91 lines
3.9 KiB
91 lines
3.9 KiB
Demonstrations of dbslower, the Linux eBPF/bcc version.
|
|
|
|
|
|
dbslower traces queries served by a MySQL or PostgreSQL server, and prints
|
|
those that exceed a latency (query time) threshold. By default a threshold of
|
|
1 ms is used. For example:
|
|
|
|
# dbslower mysql
|
|
Tracing database queries for pids 25776 slower than 1 ms...
|
|
TIME(s) PID MS QUERY
|
|
1.315800 25776 2000.999 call getproduct(97)
|
|
3.360380 25776 3.226 call getproduct(6)
|
|
^C
|
|
|
|
This traced two queries slower than 1ms, one of which is very slow: over 2
|
|
seconds. We can filter out the shorter ones and keep only the really slow ones:
|
|
|
|
# dbslower mysql -m 1000
|
|
Tracing database queries for pids 25776 slower than 1000 ms...
|
|
TIME(s) PID MS QUERY
|
|
1.421264 25776 2002.183 call getproduct(97)
|
|
3.572617 25776 2001.381 call getproduct(97)
|
|
5.661411 25776 2001.867 call getproduct(97)
|
|
7.748296 25776 2001.329 call getproduct(97)
|
|
^C
|
|
|
|
This looks like a pattern -- we keep making this slow query every 2 seconds
|
|
or so, and it takes approximately 2 seconds to run.
|
|
|
|
By default, dbslower will try to detect mysqld and postgres processes, but if
|
|
necessary, you can specify the process ids with the -p switch:
|
|
|
|
# dbslower mysql -p $(pidof mysql)
|
|
Tracing database queries for pids 25776 slower than 1 ms...
|
|
TIME(s) PID MS QUERY
|
|
2.002125 25776 3.340 call getproduct(7)
|
|
2.045006 25776 2001.558 call getproduct(97)
|
|
4.131863 25776 2002.275 call getproduct(97)
|
|
6.190513 25776 3.248 call getproduct(33)
|
|
^C
|
|
|
|
Specifying 0 as the threshold will print all the queries:
|
|
|
|
# dbslower mysql -m 0
|
|
Tracing database queries for pids 25776 slower than 0 ms...
|
|
TIME(s) PID MS QUERY
|
|
6.003720 25776 2.363 /* mysql-connector-java-5.1.40 ( Revision: 402933ef52cad9aa82624e80acbea46e3a701ce6 ) */SELECT @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_conn
|
|
6.599219 25776 0.068 SET NAMES latin1
|
|
6.613944 25776 0.057 SET character_set_results = NULL
|
|
6.645228 25776 0.059 SET autocommit=1
|
|
6.653798 25776 0.059 SET sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
|
|
6.682184 25776 2.526 select * from users where id = 0
|
|
6.767888 25776 0.288 select id from products where userid = 0
|
|
6.790642 25776 2.255 call getproduct(0)
|
|
6.809865 25776 0.218 call getproduct(1)
|
|
6.846878 25776 0.248 select * from users where id = 1
|
|
6.847623 25776 0.166 select id from products where userid = 1
|
|
6.867363 25776 0.244 call getproduct(2)
|
|
6.868162 25776 0.107 call getproduct(3)
|
|
6.874726 25776 0.208 select * from users where id = 2
|
|
6.881722 25776 0.260 select id from products where userid = 2
|
|
^C
|
|
|
|
Here we can see the MySQL connector initialization and connection establishment,
|
|
before the actual queries start coming in.
|
|
|
|
|
|
USAGE:
|
|
# dbslower -h
|
|
usage: dbslower.py [-h] [-v] [-p [PIDS [PIDS ...]]] [-x PATH] [-m THRESHOLD]
|
|
{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
|
|
-x PATH, --exe PATH path to binary
|
|
-m THRESHOLD, --threshold THRESHOLD
|
|
trace queries slower than this threshold (ms)
|
|
|
|
examples:
|
|
dbslower postgres # trace PostgreSQL queries slower than 1ms
|
|
dbslower postgres -p 188 322 # trace specific PostgreSQL processes
|
|
dbslower mysql -p 480 -m 30 # trace MySQL queries slower than 30ms
|
|
dbslower mysql -p 480 -v # trace MySQL queries and print the BPF program
|
|
dbslower mysql -x $(which mysqld) # trace MySQL queries with uprobes
|