PS-2033, proof of concept (#540)

This commit is contained in:
Sveta Smirnova
2022-07-11 15:51:29 +03:00
committed by GitHub
parent d881738e2f
commit 07ee5eb1bf
2 changed files with 102 additions and 70 deletions

View File

@@ -979,7 +979,7 @@ collect_mysql_data_loop() {
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
>> "$d/$p-processlist" & >> "$d/$p-processlist" &
if [ "$have_lock_waits_table" ]; then if [ "$have_lock_waits_table" ]; then
(echo $ts; lock_waits) >>"$d/$p-lock-waits" & (echo $ts; lock_waits "$d/lock_waits.running") >>"$d/$p-lock-waits" &
(echo $ts; transactions) >>"$d/$p-transactions" & (echo $ts; transactions) >>"$d/$p-transactions" &
fi fi
@@ -988,7 +988,7 @@ collect_mysql_data_loop() {
fi fi
if [ "${mysql_version}" '>' "5.6" ]; then if [ "${mysql_version}" '>' "5.6" ]; then
(echo $ts; ps_prepared_statements) >> "$d/$p-prepared-statements" & (echo $ts; ps_prepared_statements "$d/prepared_statements.isrunnning") >> "$d/$p-prepared-statements" &
fi fi
slave_status "$d/$p-slave-status" "${mysql_version}" slave_status "$d/$p-slave-status" "${mysql_version}"
@@ -1089,36 +1089,43 @@ open_tables() {
} }
lock_waits() { lock_waits() {
local sql1="SELECT SQL_NO_CACHE local flag_file=$1
CONCAT('thread ', b.trx_mysql_thread_id, ' from ', p.host) AS who_blocks, if test -f "$flag_file"; then
IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx, echo "Lock collection already running, skipping this iteration"
MAX(TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP)) AS max_wait_time, else
COUNT(*) AS num_waiters touch "$flag_file"
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w local sql1="SELECT SQL_NO_CACHE
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id CONCAT('thread ', b.trx_mysql_thread_id, ' from ', p.host) AS who_blocks,
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx,
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id MAX(TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP)) AS max_wait_time,
GROUP BY who_blocks ORDER BY num_waiters DESC\G" COUNT(*) AS num_waiters
$CMD_MYSQL $EXT_ARGV -e "$sql1" FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id
GROUP BY who_blocks ORDER BY num_waiters DESC\G"
$CMD_MYSQL $EXT_ARGV -e "$sql1"
local sql2="SELECT SQL_NO_CACHE local sql2="SELECT SQL_NO_CACHE
r.trx_id AS waiting_trx_id, r.trx_id AS waiting_trx_id,
r.trx_mysql_thread_id AS waiting_thread, r.trx_mysql_thread_id AS waiting_thread,
TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP) AS wait_time, TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP) AS wait_time,
r.trx_query AS waiting_query, r.trx_query AS waiting_query,
l.lock_table AS waiting_table_lock, l.lock_table AS waiting_table_lock,
b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_thread, b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_thread,
SUBSTRING(p.host, 1, INSTR(p.host, ':') - 1) AS blocking_host, SUBSTRING(p.host, 1, INSTR(p.host, ':') - 1) AS blocking_host,
SUBSTRING(p.host, INSTR(p.host, ':') +1) AS blocking_port, SUBSTRING(p.host, INSTR(p.host, ':') +1) AS blocking_port,
IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx, IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx,
b.trx_query AS blocking_query b.trx_query AS blocking_query
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_LOCKS AS l ON w.requested_lock_id = l.lock_id INNER JOIN INFORMATION_SCHEMA.INNODB_LOCKS AS l ON w.requested_lock_id = l.lock_id
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id
ORDER BY wait_time DESC\G" ORDER BY wait_time DESC\G"
$CMD_MYSQL $EXT_ARGV -e "$sql2" $CMD_MYSQL $EXT_ARGV -e "$sql2"
rm "$flag_file"
fi
} }
transactions() { transactions() {
@@ -1200,10 +1207,17 @@ ps_locks_transactions() {
} }
ps_prepared_statements() { ps_prepared_statements() {
$CMD_MYSQL $EXT_ARGV -e "SELECT t.processlist_id, pse.* \ local flag_file=$1
FROM performance_schema.prepared_statements_instances pse \ if test -f "$flag_file"; then
JOIN performance_schema.threads t \ echo "Prepared statements collection already running, skipping this iteration"
ON (pse.OWNER_THREAD_ID=t.thread_id)\G" else
touch "$flag_file"
$CMD_MYSQL $EXT_ARGV -e "SELECT t.processlist_id, pse.* \
FROM performance_schema.prepared_statements_instances pse \
JOIN performance_schema.threads t \
ON (pse.OWNER_THREAD_ID=t.thread_id)\G"
rm "$flag_file"
fi
} }
slave_status() { slave_status() {

View File

@@ -266,7 +266,7 @@ collect_mysql_data_loop() {
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \ (echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
>> "$d/$p-processlist" & >> "$d/$p-processlist" &
if [ "$have_lock_waits_table" ]; then if [ "$have_lock_waits_table" ]; then
(echo $ts; lock_waits) >>"$d/$p-lock-waits" & (echo $ts; lock_waits "$d/lock_waits.running") >>"$d/$p-lock-waits" &
(echo $ts; transactions) >>"$d/$p-transactions" & (echo $ts; transactions) >>"$d/$p-transactions" &
fi fi
@@ -275,7 +275,7 @@ collect_mysql_data_loop() {
fi fi
if [ "${mysql_version}" '>' "5.6" ]; then if [ "${mysql_version}" '>' "5.6" ]; then
(echo $ts; ps_prepared_statements) >> "$d/$p-prepared-statements" & (echo $ts; ps_prepared_statements "$d/prepared_statements.isrunnning") >> "$d/$p-prepared-statements" &
fi fi
slave_status "$d/$p-slave-status" "${mysql_version}" slave_status "$d/$p-slave-status" "${mysql_version}"
@@ -387,36 +387,43 @@ open_tables() {
} }
lock_waits() { lock_waits() {
local sql1="SELECT SQL_NO_CACHE local flag_file=$1
CONCAT('thread ', b.trx_mysql_thread_id, ' from ', p.host) AS who_blocks, if test -f "$flag_file"; then
IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx, echo "Lock collection already running, skipping this iteration"
MAX(TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP)) AS max_wait_time, else
COUNT(*) AS num_waiters touch "$flag_file"
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w local sql1="SELECT SQL_NO_CACHE
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id CONCAT('thread ', b.trx_mysql_thread_id, ' from ', p.host) AS who_blocks,
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx,
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id MAX(TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP)) AS max_wait_time,
GROUP BY who_blocks ORDER BY num_waiters DESC\G" COUNT(*) AS num_waiters
$CMD_MYSQL $EXT_ARGV -e "$sql1" FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id
GROUP BY who_blocks ORDER BY num_waiters DESC\G"
$CMD_MYSQL $EXT_ARGV -e "$sql1"
local sql2="SELECT SQL_NO_CACHE local sql2="SELECT SQL_NO_CACHE
r.trx_id AS waiting_trx_id, r.trx_id AS waiting_trx_id,
r.trx_mysql_thread_id AS waiting_thread, r.trx_mysql_thread_id AS waiting_thread,
TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP) AS wait_time, TIMESTAMPDIFF(SECOND, r.trx_wait_started, CURRENT_TIMESTAMP) AS wait_time,
r.trx_query AS waiting_query, r.trx_query AS waiting_query,
l.lock_table AS waiting_table_lock, l.lock_table AS waiting_table_lock,
b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_thread, b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_thread,
SUBSTRING(p.host, 1, INSTR(p.host, ':') - 1) AS blocking_host, SUBSTRING(p.host, 1, INSTR(p.host, ':') - 1) AS blocking_host,
SUBSTRING(p.host, INSTR(p.host, ':') +1) AS blocking_port, SUBSTRING(p.host, INSTR(p.host, ':') +1) AS blocking_port,
IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx, IF(p.command = \"Sleep\", p.time, 0) AS idle_in_trx,
b.trx_query AS blocking_query b.trx_query AS blocking_query
FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS AS w
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS b ON b.trx_id = w.blocking_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id INNER JOIN INFORMATION_SCHEMA.INNODB_TRX AS r ON r.trx_id = w.requesting_trx_id
INNER JOIN INFORMATION_SCHEMA.INNODB_LOCKS AS l ON w.requested_lock_id = l.lock_id INNER JOIN INFORMATION_SCHEMA.INNODB_LOCKS AS l ON w.requested_lock_id = l.lock_id
LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id LEFT JOIN INFORMATION_SCHEMA.PROCESSLIST AS p ON p.id = b.trx_mysql_thread_id
ORDER BY wait_time DESC\G" ORDER BY wait_time DESC\G"
$CMD_MYSQL $EXT_ARGV -e "$sql2" $CMD_MYSQL $EXT_ARGV -e "$sql2"
rm "$flag_file"
fi
} }
transactions() { transactions() {
@@ -498,10 +505,21 @@ ps_locks_transactions() {
} }
ps_prepared_statements() { ps_prepared_statements() {
$CMD_MYSQL $EXT_ARGV -e "SELECT t.processlist_id, pse.* \ # PS-2033:
FROM performance_schema.prepared_statements_instances pse \ # If no flag file exists, create it, then collect data
JOIN performance_schema.threads t \ # After data collected, remove the file
ON (pse.OWNER_THREAD_ID=t.thread_id)\G" # If flag file exists, skip current iteration
local flag_file=$1
if test -f "$flag_file"; then
echo "Prepared statements collection already running, skipping this iteration"
else
touch "$flag_file"
$CMD_MYSQL $EXT_ARGV -e "SELECT t.processlist_id, pse.* \
FROM performance_schema.prepared_statements_instances pse \
JOIN performance_schema.threads t \
ON (pse.OWNER_THREAD_ID=t.thread_id)\G"
rm "$flag_file"
fi
} }
slave_status() { slave_status() {