Don't print errors in data files; let the general -output file catch them. Print TS lines before data. Try to find sysctl manually. Add _pidof() to alt_cmds.sh.

This commit is contained in:
Daniel Nichter
2012-01-27 17:37:59 -07:00
parent 81ae556f8b
commit e954505dd2
4 changed files with 177 additions and 90 deletions

View File

@@ -464,11 +464,29 @@ rm_tmpdir() {
set -u set -u
CMD_PIDOF="$(which pidof)"
CMD_PGREP="$(which pgrep)"
_seq() { _seq() {
local i="$1" local i="$1"
awk "BEGIN { for(i=1; i<=$i; i++) print i; }" awk "BEGIN { for(i=1; i<=$i; i++) print i; }"
} }
_pidof() {
local proc="$1" # process name
local pat="${2:-""}" # pattern in case we must grep for proc
local pid=""
[ "$CMD_PIDOF" ] && pid=$(pidof -s "$proc");
[ -z "$pid" ] && [ "$CMD_PGREP" ] && pid=$(pgrep -o -x "$proc");
[ -z "$pid" ] && pid=$(ps -eaf | grep "$pat" | grep -v mysqld_safe | awk '{print $2}' | head -n1)
echo $pid
}
# ########################################################################### # ###########################################################################
# End alt_cmds package # End alt_cmds package
# ########################################################################### # ###########################################################################
@@ -592,6 +610,7 @@ set -u
CMD_GDB="$(which gdb)" CMD_GDB="$(which gdb)"
CMD_IOSTAT="$(which iostat)" CMD_IOSTAT="$(which iostat)"
CMD_LSOF="$(which lsof)"
CMD_MPSTAT="$(which mpstat)" CMD_MPSTAT="$(which mpstat)"
CMD_MYSQL="$(which mysql)" CMD_MYSQL="$(which mysql)"
CMD_MYSQLADMIN="$(which mysqladmin)" CMD_MYSQLADMIN="$(which mysqladmin)"
@@ -599,20 +618,17 @@ CMD_OPCONTROL="$(which opcontrol)"
CMD_OPREPORT="$(which opreport)" CMD_OPREPORT="$(which opreport)"
CMD_PMAP="$(which pmap)" CMD_PMAP="$(which pmap)"
CMD_STRACE="$(which strace)" CMD_STRACE="$(which strace)"
CMD_SYSCTL="$(which sysctl)"
CMD_TCPDUMP="$(which tcpdump)" CMD_TCPDUMP="$(which tcpdump)"
CMD_VMSTAT="$(which vmstat)" CMD_VMSTAT="$(which vmstat)"
[ -z "$CMD_SYSCTL" -a -x "/sbin/sysctl" ] && CMD_SYSCTL="/sbin/sysctl"
collect() { collect() {
local d="$1" # directory to save results in local d="$1" # directory to save results in
local p="$2" # prefix for each result file local p="$2" # prefix for each result file
local mysqld_pid=$(pidof -s mysqld); local mysqld_pid=$(_pidof mysqld mysql[d]);
if [ -z "$mysqld_pid" ]; then
mysqld_pid=$(pgrep -o -x mysqld);
fi
if [ -z "$mysqld_pid" ]; then
mysqld_pid=$(ps -eaf | grep 'mysql[d]' | grep -v mysqld_safe | awk '{print $2}' | head -n1);
fi
if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then
if $CMD_PMAP --help 2>&1 | grep -- -x >/dev/null 2>&1 ; then if $CMD_PMAP --help 2>&1 | grep -- -x >/dev/null 2>&1 ; then
@@ -630,7 +646,7 @@ collect() {
>> "$d/$p-stacktrace" >> "$d/$p-stacktrace"
fi fi
$CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" 2>&1 & $CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" &
sleep .2 sleep .2
local mysql_version="$(awk '/^version[^_]/{print substr($2,1,3)}' "$d/$p-variables")" local mysql_version="$(awk '/^version[^_]/{print substr($2,1,3)}' "$d/$p-variables")"
@@ -643,11 +659,12 @@ collect() {
local tail_error_log_pid="" local tail_error_log_pid=""
if [ "$mysql_error_log" ]; then if [ "$mysql_error_log" ]; then
echo "The MySQL error log seems to be ${mysql_error_log}" echo "The MySQL error log seems to be ${mysql_error_log}"
tail -f "$mysql_error_log" >"$d/$p-log_error" 2>&1 & tail -f "$mysql_error_log" >"$d/$p-log_error" &
tail_error_log_pid=$! tail_error_log_pid=$!
$CMD_MYSQLADMIN $EXT_ARGV debug $CMD_MYSQLADMIN $EXT_ARGV debug
else else
echo "Could not find the MySQL error log" echo "Could not find the MySQL error log" >&2
fi fi
local innostat="SHOW /*!40100 ENGINE*/ INNODB STATUS\G" local innostat="SHOW /*!40100 ENGINE*/ INNODB STATUS\G"
@@ -656,9 +673,9 @@ collect() {
else else
local mutex="SHOW MUTEX STATUS" local mutex="SHOW MUTEX STATUS"
fi fi
$CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" &
$CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" &
open_tables >> "$d/$p-opentables1" 2>&1 & open_tables >> "$d/$p-opentables1" &
local tcpdump_pid="" local tcpdump_pid=""
if [ "$CMD_TCPDUMP" -a "$OPT_COLLECT_TCPDUMP" ]; then if [ "$CMD_TCPDUMP" -a "$OPT_COLLECT_TCPDUMP" ]; then
@@ -676,28 +693,33 @@ collect() {
have_oprofile="yes" have_oprofile="yes"
fi fi
elif [ "$CMD_STRACE" -a "$OPT_COLLECT_STRACE" ]; then elif [ "$CMD_STRACE" -a "$OPT_COLLECT_STRACE" ]; then
$CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" 2>&1 & $CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" &
local strace_pid=$! local strace_pid=$!
fi fi
ps -eaf >> "$d/$p-ps" 2>&1 & ps -eaf >> "$d/$p-ps" &
sysctl -a >> "$d/$p-sysctl" 2>&1 & top -bn1 >> "$d/$p-top" &
top -bn1 >> "$d/$p-top" 2>&1 &
lsof -nP -p $mysqld_pid -bw >> "$d/$p-lsof" 2>&1 & if [ "$CMD_LSOF" ]; then
$CMD_LSOF -nP -p $mysqld_pid -bw >> "$d/$p-lsof" &
fi
if [ "$CMD_SYSCTL" ]; then
$CMD_SYSCTL -a >> "$d/$p-sysctl" &
fi
if [ "$CMD_VMSTAT" ]; then if [ "$CMD_VMSTAT" ]; then
$CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" 2>&1 & $CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" &
$CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" 2>&1 & $CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" &
fi fi
if [ "$CMD_IOSTAT" ]; then if [ "$CMD_IOSTAT" ]; then
$CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" 2>&1 & $CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" &
$CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" 2>&1 & $CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" &
fi fi
if [ "$CMD_MPSTAT" ]; then if [ "$CMD_MPSTAT" ]; then
$CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" 2>&1 & $CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" &
$CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" 2>&1 & $CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" &
fi fi
$CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" 2>&1 & $CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" &
local mysqladmin_pid=$! local mysqladmin_pid=$!
local have_lock_waits_table=0 local have_lock_waits_table=0
@@ -719,35 +741,38 @@ collect() {
sleep $(date +%s.%N | awk '{print 1 - ($1 % 1)}') sleep $(date +%s.%N | awk '{print 1 - ($1 % 1)}')
local ts="$(date +"TS %s.%N %F %T")" local ts="$(date +"TS %s.%N %F %T")"
if [ -d "/proc" ]; then if [ -d "/proc" ]; then
if [ -f "/proc/diskstats" ]; then if [ -f "/proc/diskstats" ]; then
(cat /proc/diskstats 2>&1; echo $ts) >> "$d/$p-diskstats" & (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" &
fi fi
if [ -f "/proc/stat" ]; then if [ -f "/proc/stat" ]; then
(cat /proc/stat 2>&1; echo $ts) >> "$d/$p-procstat" & (echo $ts; cat /proc/stat) >> "$d/$p-procstat" &
fi fi
if [ -f "/proc/vmstat" ]; then if [ -f "/proc/vmstat" ]; then
(cat /proc/vmstat 2>&1; echo $ts) >> "$d/$p-procvmstat" & (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" &
fi fi
if [ -f "/proc/meminfo" ]; then if [ -f "/proc/meminfo" ]; then
(cat /proc/meminfo 2>&1; echo $ts) >> "$d/$p-meminfo" & (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" &
fi fi
if [ -f "/proc/slabinfo" ]; then if [ -f "/proc/slabinfo" ]; then
(cat /proc/slabinfo 2>&1; echo $ts) >> "$d/$p-slabinfo" & (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" &
fi fi
if [ -f "/proc/interrupts" ]; then if [ -f "/proc/interrupts" ]; then
(cat /proc/interrupts 2>&1; echo $ts) >> "$d/$p-interrupts" & (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" &
fi fi
fi fi
(df -h 2>&1; echo $ts) >> "$d/$p-df" &
(netstat -antp 2>&1; echo $ts) >> "$d/$p-netstat" &
(netstat -s 2>&1; echo $ts) >> "$d/$p-netstat_s" &
($CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G" 2>&1; echo $ts) \ (echo $ts; df -h) >> "$d/$p-df" &
>> "$d/$p-processlist"
(echo $ts; netstat -antp) >> "$d/$p-netstat" &
(echo $ts; netstat -s) >> "$d/$p-netstat_s" &
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
>> "$d/$p-processlist" &
if [ $have_lock_waits_table -eq 1 ]; then if [ $have_lock_waits_table -eq 1 ]; then
(lock_waits 2>&1; echo $ts) >>"$d/$p-lock-waits" (echo $ts; lock_waits) >>"$d/$p-lock-waits" &
fi fi
done done
echo "Loop end: $(date +'TS %s.%N %F %T')" echo "Loop end: $(date +'TS %s.%N %F %T')"
@@ -781,21 +806,28 @@ collect() {
kill -s 18 $mysqld_pid kill -s 18 $mysqld_pid
fi fi
$CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" &
$CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" &
open_tables >> "$d/$p-opentables2" 2>&1 & open_tables >> "$d/$p-opentables2" &
kill $mysqladmin_pid kill $mysqladmin_pid
[ "$tail_error_log_pid" ] && kill $tail_error_log_pid [ "$tail_error_log_pid" ] && kill $tail_error_log_pid
[ "$tcpdump_pid" ] && kill $tcpdump_pid [ "$tcpdump_pid" ] && kill $tcpdump_pid
hostname > "$d/$p-hostname" hostname > "$d/$p-hostname"
for file in "$d/$p-"*; do
if [ -z "$(grep -v '^TS ' --max-count 1 "$file")" ]; then
log "Removing empty file $file";
rm "$file"
fi
done
} }
open_tables() { open_tables() {
local open_tables=$($CMD_MYSQLADMIN $EXT_ARGV ext | grep "Open_tables" | awk '{print $4}') local open_tables=$($CMD_MYSQLADMIN $EXT_ARGV ext | grep "Open_tables" | awk '{print $4}')
if [ -n "$open_tables" -a $open_tables -le 1000 ]; then if [ -n "$open_tables" -a $open_tables -le 1000 ]; then
$CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' 2>&1 & $CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' &
else else
echo "Too many open tables: $open_tables" echo "Too many open tables: $open_tables"
fi fi
@@ -843,7 +875,7 @@ lock_waits() {
# ########################################################################### # ###########################################################################
RAN_WITH="" RAN_WITH=""
EXIT_REASON="" EXIT_REASON=""
TOOL=$(basename $0) TOOL="pt-stalk"
OKTORUN=1 OKTORUN=1
ITER=1 ITER=1
@@ -1104,8 +1136,8 @@ main() {
# Execute the program if it was not included from another file. # Execute the program if it was not included from another file.
# This makes it possible to include without executing, and thus test. # This makes it possible to include without executing, and thus test.
if [ "$(basename "$0")" = "pt-stalk" ] \ if [ "${0##*/}" = "$TOOL" ] \
|| [ "$(basename "$0")" = "bash" -a "$_" = "$0" ]; then || [ "${0##*/}" = "bash" -a "$_" = "$0" ]; then
# Check that mysql and mysqladmin are in PATH. If not, we're # Check that mysql and mysqladmin are in PATH. If not, we're
# already dead in the water, so don't bother with cmd line opts, # already dead in the water, so don't bother with cmd line opts,

View File

@@ -23,12 +23,31 @@
set -u set -u
# Global variables.
CMD_PIDOF="$(which pidof)"
CMD_PGREP="$(which pgrep)"
# seq N, return 1, ..., 5 # seq N, return 1, ..., 5
_seq() { _seq() {
local i="$1" local i="$1"
awk "BEGIN { for(i=1; i<=$i; i++) print i; }" awk "BEGIN { for(i=1; i<=$i; i++) print i; }"
} }
_pidof() {
local proc="$1" # process name
local pat="${2:-""}" # pattern in case we must grep for proc
local pid=""
[ "$CMD_PIDOF" ] && pid=$(pidof -s "$proc");
[ -z "$pid" ] && [ "$CMD_PGREP" ] && pid=$(pgrep -o -x "$proc");
[ -z "$pid" ] && pid=$(ps -eaf | grep "$pat" | grep -v mysqld_safe | awk '{print $2}' | head -n1)
echo $pid
}
# ########################################################################### # ###########################################################################
# End alt_cmds package # End alt_cmds package
# ########################################################################### # ###########################################################################

View File

@@ -26,6 +26,7 @@ set -u
# Global variables. # Global variables.
CMD_GDB="$(which gdb)" CMD_GDB="$(which gdb)"
CMD_IOSTAT="$(which iostat)" CMD_IOSTAT="$(which iostat)"
CMD_LSOF="$(which lsof)"
CMD_MPSTAT="$(which mpstat)" CMD_MPSTAT="$(which mpstat)"
CMD_MYSQL="$(which mysql)" CMD_MYSQL="$(which mysql)"
CMD_MYSQLADMIN="$(which mysqladmin)" CMD_MYSQLADMIN="$(which mysqladmin)"
@@ -33,21 +34,19 @@ CMD_OPCONTROL="$(which opcontrol)"
CMD_OPREPORT="$(which opreport)" CMD_OPREPORT="$(which opreport)"
CMD_PMAP="$(which pmap)" CMD_PMAP="$(which pmap)"
CMD_STRACE="$(which strace)" CMD_STRACE="$(which strace)"
CMD_SYSCTL="$(which sysctl)"
CMD_TCPDUMP="$(which tcpdump)" CMD_TCPDUMP="$(which tcpdump)"
CMD_VMSTAT="$(which vmstat)" CMD_VMSTAT="$(which vmstat)"
# Try to find command manually.
[ -z "$CMD_SYSCTL" -a -x "/sbin/sysctl" ] && CMD_SYSCTL="/sbin/sysctl"
collect() { collect() {
local d="$1" # directory to save results in local d="$1" # directory to save results in
local p="$2" # prefix for each result file local p="$2" # prefix for each result file
# Get pidof mysqld; pidof doesn't exist on some systems. We try our best... # Get pidof mysqld.
local mysqld_pid=$(pidof -s mysqld); local mysqld_pid=$(_pidof mysqld mysql[d]);
if [ -z "$mysqld_pid" ]; then
mysqld_pid=$(pgrep -o -x mysqld);
fi
if [ -z "$mysqld_pid" ]; then
mysqld_pid=$(ps -eaf | grep 'mysql[d]' | grep -v mysqld_safe | awk '{print $2}' | head -n1);
fi
# Get memory allocation info before anything else. # Get memory allocation info before anything else.
if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then if [ "$CMD_PMAP" -a "$mysqld_pid" ]; then
@@ -72,7 +71,7 @@ collect() {
# Get MySQL's variables if possible. Then sleep long enough that we probably # Get MySQL's variables if possible. Then sleep long enough that we probably
# complete SHOW VARIABLES if all's well. (We don't want to run mysql in the # complete SHOW VARIABLES if all's well. (We don't want to run mysql in the
# foreground, because it could hang.) # foreground, because it could hang.)
$CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" 2>&1 & $CMD_MYSQL $EXT_ARGV -e 'SHOW GLOBAL VARIABLES' >> "$d/$p-variables" &
sleep .2 sleep .2
# Get the major.minor version number. Version 3.23 doesn't matter for our # Get the major.minor version number. Version 3.23 doesn't matter for our
@@ -89,13 +88,14 @@ collect() {
local tail_error_log_pid="" local tail_error_log_pid=""
if [ "$mysql_error_log" ]; then if [ "$mysql_error_log" ]; then
echo "The MySQL error log seems to be ${mysql_error_log}" echo "The MySQL error log seems to be ${mysql_error_log}"
tail -f "$mysql_error_log" >"$d/$p-log_error" 2>&1 & tail -f "$mysql_error_log" >"$d/$p-log_error" &
tail_error_log_pid=$! tail_error_log_pid=$!
# Send a mysqladmin debug to the server so we can potentially learn about # Send a mysqladmin debug to the server so we can potentially learn about
# locking etc. # locking etc.
$CMD_MYSQLADMIN $EXT_ARGV debug $CMD_MYSQLADMIN $EXT_ARGV debug
else else
echo "Could not find the MySQL error log" echo "Could not find the MySQL error log" >&2
fi fi
# Get a sample of these right away, so we can get these without interaction # Get a sample of these right away, so we can get these without interaction
@@ -106,9 +106,9 @@ collect() {
else else
local mutex="SHOW MUTEX STATUS" local mutex="SHOW MUTEX STATUS"
fi fi
$CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus1" &
$CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status1" &
open_tables >> "$d/$p-opentables1" 2>&1 & open_tables >> "$d/$p-opentables1" &
# If TCP dumping is specified, start that on the server's port. # If TCP dumping is specified, start that on the server's port.
local tcpdump_pid="" local tcpdump_pid=""
@@ -130,27 +130,32 @@ collect() {
fi fi
elif [ "$CMD_STRACE" -a "$OPT_COLLECT_STRACE" ]; then elif [ "$CMD_STRACE" -a "$OPT_COLLECT_STRACE" ]; then
# Don't run oprofile and strace at the same time. # Don't run oprofile and strace at the same time.
$CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" 2>&1 & $CMD_STRACE -T -s 0 -f -p $mysqld_pid > "${DEST}/$d-strace" &
local strace_pid=$! local strace_pid=$!
fi fi
# Grab a few general things first. Background all of these so we can start # Grab a few general things first. Background all of these so we can start
# them all up as quickly as possible. # them all up as quickly as possible.
ps -eaf >> "$d/$p-ps" 2>&1 & ps -eaf >> "$d/$p-ps" &
sysctl -a >> "$d/$p-sysctl" 2>&1 & top -bn1 >> "$d/$p-top" &
top -bn1 >> "$d/$p-top" 2>&1 &
lsof -nP -p $mysqld_pid -bw >> "$d/$p-lsof" 2>&1 & if [ "$CMD_LSOF" ]; then
$CMD_LSOF -nP -p $mysqld_pid -bw >> "$d/$p-lsof" &
fi
if [ "$CMD_SYSCTL" ]; then
$CMD_SYSCTL -a >> "$d/$p-sysctl" &
fi
if [ "$CMD_VMSTAT" ]; then if [ "$CMD_VMSTAT" ]; then
$CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" 2>&1 & $CMD_VMSTAT 1 $OPT_INTERVAL >> "$d/$p-vmstat" &
$CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" 2>&1 & $CMD_VMSTAT $OPT_INTERVAL 2 >> "$d/$p-vmstat-overall" &
fi fi
if [ "$CMD_IOSTAT" ]; then if [ "$CMD_IOSTAT" ]; then
$CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" 2>&1 & $CMD_IOSTAT -dx 1 $OPT_INTERVAL >> "$d/$p-iostat" &
$CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" 2>&1 & $CMD_IOSTAT -dx $OPT_INTERVAL 2 >> "$d/$p-iostat-overall" &
fi fi
if [ "$CMD_MPSTAT" ]; then if [ "$CMD_MPSTAT" ]; then
$CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" 2>&1 & $CMD_MPSTAT -P ALL 1 $OPT_INTERVAL >> "$d/$p-mpstat" &
$CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" 2>&1 & $CMD_MPSTAT -P ALL $OPT_INTERVAL 1 >> "$d/$p-mpstat-overall" &
fi fi
# Collect multiple snapshots of the status variables. We use # Collect multiple snapshots of the status variables. We use
@@ -159,7 +164,7 @@ collect() {
# get and keep a connection to the database; in troubled times # get and keep a connection to the database; in troubled times
# the database tends to exceed max_connections, so reconnecting # the database tends to exceed max_connections, so reconnecting
# in the loop tends not to work very well. # in the loop tends not to work very well.
$CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" 2>&1 & $CMD_MYSQLADMIN $EXT_ARGV ext -i1 -c$OPT_RUN_TIME >>"$d/$p-mysqladmin" &
local mysqladmin_pid=$! local mysqladmin_pid=$!
local have_lock_waits_table=0 local have_lock_waits_table=0
@@ -186,36 +191,41 @@ collect() {
sleep $(date +%s.%N | awk '{print 1 - ($1 % 1)}') sleep $(date +%s.%N | awk '{print 1 - ($1 % 1)}')
local ts="$(date +"TS %s.%N %F %T")" local ts="$(date +"TS %s.%N %F %T")"
# Collect the stuff for this cycle # #####################################################################
# Collect data for this cycle.
# #####################################################################
if [ -d "/proc" ]; then if [ -d "/proc" ]; then
if [ -f "/proc/diskstats" ]; then if [ -f "/proc/diskstats" ]; then
(cat /proc/diskstats 2>&1; echo $ts) >> "$d/$p-diskstats" & (echo $ts; cat /proc/diskstats) >> "$d/$p-diskstats" &
fi fi
if [ -f "/proc/stat" ]; then if [ -f "/proc/stat" ]; then
(cat /proc/stat 2>&1; echo $ts) >> "$d/$p-procstat" & (echo $ts; cat /proc/stat) >> "$d/$p-procstat" &
fi fi
if [ -f "/proc/vmstat" ]; then if [ -f "/proc/vmstat" ]; then
(cat /proc/vmstat 2>&1; echo $ts) >> "$d/$p-procvmstat" & (echo $ts; cat /proc/vmstat) >> "$d/$p-procvmstat" &
fi fi
if [ -f "/proc/meminfo" ]; then if [ -f "/proc/meminfo" ]; then
(cat /proc/meminfo 2>&1; echo $ts) >> "$d/$p-meminfo" & (echo $ts; cat /proc/meminfo) >> "$d/$p-meminfo" &
fi fi
if [ -f "/proc/slabinfo" ]; then if [ -f "/proc/slabinfo" ]; then
(cat /proc/slabinfo 2>&1; echo $ts) >> "$d/$p-slabinfo" & (echo $ts; cat /proc/slabinfo) >> "$d/$p-slabinfo" &
fi fi
if [ -f "/proc/interrupts" ]; then if [ -f "/proc/interrupts" ]; then
(cat /proc/interrupts 2>&1; echo $ts) >> "$d/$p-interrupts" & (echo $ts; cat /proc/interrupts) >> "$d/$p-interrupts" &
fi fi
fi fi
(df -h 2>&1; echo $ts) >> "$d/$p-df" &
(netstat -antp 2>&1; echo $ts) >> "$d/$p-netstat" &
(netstat -s 2>&1; echo $ts) >> "$d/$p-netstat_s" &
($CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G" 2>&1; echo $ts) \ (echo $ts; df -h) >> "$d/$p-df" &
>> "$d/$p-processlist"
(echo $ts; netstat -antp) >> "$d/$p-netstat" &
(echo $ts; netstat -s) >> "$d/$p-netstat_s" &
(echo $ts; $CMD_MYSQL $EXT_ARGV -e "SHOW FULL PROCESSLIST\G") \
>> "$d/$p-processlist" &
if [ $have_lock_waits_table -eq 1 ]; then if [ $have_lock_waits_table -eq 1 ]; then
(lock_waits 2>&1; echo $ts) >>"$d/$p-lock-waits" (echo $ts; lock_waits) >>"$d/$p-lock-waits" &
fi fi
done done
echo "Loop end: $(date +'TS %s.%N %F %T')" echo "Loop end: $(date +'TS %s.%N %F %T')"
@@ -252,9 +262,9 @@ collect() {
kill -s 18 $mysqld_pid kill -s 18 $mysqld_pid
fi fi
$CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$innostat" >> "$d/$p-innodbstatus2" &
$CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" 2>&1 & $CMD_MYSQL $EXT_ARGV -e "$mutex" >> "$d/$p-mutex-status2" &
open_tables >> "$d/$p-opentables2" 2>&1 & open_tables >> "$d/$p-opentables2" &
# Kill backgrounded tasks. # Kill backgrounded tasks.
kill $mysqladmin_pid kill $mysqladmin_pid
@@ -263,12 +273,24 @@ collect() {
# Finally, record what system we collected this data from. # Finally, record what system we collected this data from.
hostname > "$d/$p-hostname" hostname > "$d/$p-hostname"
# Remove "empty" files, i.e. ones that are truly empty or
# just contain timestamp lines. When a command above fails,
# it may leave an empty file.
for file in "$d/$p-"*; do
# If there's not at least 1 line that's not a TS,
# then the file is empty.
if [ -z "$(grep -v '^TS ' --max-count 1 "$file")" ]; then
log "Removing empty file $file";
rm "$file"
fi
done
} }
open_tables() { open_tables() {
local open_tables=$($CMD_MYSQLADMIN $EXT_ARGV ext | grep "Open_tables" | awk '{print $4}') local open_tables=$($CMD_MYSQLADMIN $EXT_ARGV ext | grep "Open_tables" | awk '{print $4}')
if [ -n "$open_tables" -a $open_tables -le 1000 ]; then if [ -n "$open_tables" -a $open_tables -le 1000 ]; then
$CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' 2>&1 & $CMD_MYSQL $EXT_ARGV -e 'SHOW OPEN TABLES' &
else else
echo "Too many open tables: $open_tables" echo "Too many open tables: $open_tables"
fi fi

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
TESTS=19 TESTS=20
TMPFILE="$TEST_TMPDIR/parse-opts-output" TMPFILE="$TEST_TMPDIR/parse-opts-output"
TMPDIR="$TEST_TMPDIR" TMPDIR="$TEST_TMPDIR"
@@ -108,6 +108,20 @@ cmd_ok \
local iters=$(cat $p-df | grep -c '^TS ') local iters=$(cat $p-df | grep -c '^TS ')
is "$iters" "1" "1 iteration/1s run time" is "$iters" "1" "1 iteration/1s run time"
empty_files=0
for file in $p-*; do
if ! [ -s $file ]; then
empty_files=1
break
fi
if [ -z "$(grep -v '^TS ' --max-count 1 $file)" ]; then
empty_files=1
break
fi
done
is "$empty_files" "0" "No empty files"
# ########################################################################### # ###########################################################################
# Try longer run time. # Try longer run time.
# ########################################################################### # ###########################################################################