mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-08 23:19:01 +00:00
Copy and format for POD docu from Aspersa User's Manual to forked Aspersa tools.
This commit is contained in:
76
bin/pt-align
76
bin/pt-align
@@ -6,7 +6,6 @@
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
use constant MKDEBUG => $ENV{MKDEBUG} || 0;
|
||||
|
||||
# Finds the max element in the list
|
||||
sub max {
|
||||
@@ -49,6 +48,8 @@ foreach my $l ( @lines ) {
|
||||
printf $fmt, @$l;
|
||||
}
|
||||
|
||||
exit 0;
|
||||
|
||||
# ############################################################################
|
||||
# Documentation
|
||||
# ############################################################################
|
||||
@@ -60,53 +61,38 @@ pt-align - Read lines and split them into words.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-align [OPTION...]
|
||||
Usage: pt-align [FILES]
|
||||
|
||||
pt-align reads lines in files and splits them into words. This is useful for
|
||||
things like aligning the output of vmstat or iostat so it is easier to read.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This program reads in lines and splits them into words. It counts how many
|
||||
words each line has, and if there is one number that predominates, it assumes
|
||||
this is the number of words in each line. Then it discards all lines that
|
||||
don't have that many words, and looks at the 2nd line that DOES. It assumes
|
||||
this is the first non-header line. Based on whether each word looks numeric
|
||||
or not, it decides on column alignment. Finally, it goes through and decides
|
||||
how wide each column should be, and then prints them out.
|
||||
pt-align counts how many words each line has, and if there is one number that
|
||||
predominates, it assumes this is the number of words in each line. Then it
|
||||
discards all lines that don't have that many words, and looks at the 2nd line
|
||||
that does. It assumes this is the first non-header line. Based on whether
|
||||
each word looks numeric or not, it decides on column alignment. Finally, it
|
||||
goes through and decides how wide each column should be, and then prints them
|
||||
out.
|
||||
|
||||
This is useful for things like aligning the output of vmstat or iostat so it
|
||||
is easier to read.
|
||||
The tool's behavior has some important consequences. Reading the entire input
|
||||
before formatting means that you can't use it for aligning data as it is
|
||||
generated incrementally, and you probably don't want to use this tool on very
|
||||
large files. Discarding lines with the wrong number of words means that some
|
||||
lines won't be printed.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
=head1 OPTIONS
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
This tool does not have any command-line options.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-align ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Perl, DBI, DBD::mysql, and some core packages that ought to be
|
||||
installed in any reasonably new version of Perl.
|
||||
This tool requires Perl v5.8 or newer built with core modules.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -132,6 +118,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
128
bin/pt-collect
128
bin/pt-collect
@@ -4,28 +4,12 @@
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
# notices and disclaimers.
|
||||
|
||||
# Print a usage message and exit.
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}"
|
||||
echo "${OPT_ERR}" >&2
|
||||
fi
|
||||
cat <<-USAGE
|
||||
Usage: $0 OPTIONS [MYSQL-OPTIONS]
|
||||
Collects diagnostic data on a MySQL server and stores it into files.
|
||||
The MYSQL-OPTIONS are standard options to connect to MySQL: -uhPpS. Any
|
||||
options or arguments that follow this tool's -digos options will be treated
|
||||
as options to pass directly to mysql and mysqladmin.
|
||||
Options: (required: -dfigmos)
|
||||
-d DESTINATION Where to store the resulting data; must already exist.
|
||||
-f PERCENT Exit if the disk is more than this percent full.
|
||||
-i INTERVAL How many seconds to collect data.
|
||||
-g <yes/no> Collect GDB stack traces.
|
||||
-m MEGABYTES Exit unless there are this many megabytes free disk space.
|
||||
-o <yes/no> Collect oprofile data; disables -s.
|
||||
-p PREFIX Store the data into files with this prefix (optional).
|
||||
-s <yes/no> Collect strace data.
|
||||
-t <yes/no> Collect tcpdump data.
|
||||
USAGE
|
||||
echo "Usage: pt-collect -d -g -i -o -s [OPTIONS] [-- MYSQL-OPTIONS]" >&2
|
||||
echo "For more information, 'man pt-collect' or 'perldoc $0'." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -83,8 +67,9 @@ for o; do
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
if [ -z "${OPT_d}" -o -z "${OPT_i}" -o -z "${OPT_o}" -o -z "${OPT_g}" -o -z "${OPT_s}" ]; then
|
||||
OPT_ERR="Missing command-line option."
|
||||
OPT_ERR="Missing command-line argument."
|
||||
usage
|
||||
fi
|
||||
|
||||
@@ -241,17 +226,17 @@ echo "Gathering info for $d"
|
||||
opcontrol --stop
|
||||
opcontrol --dump
|
||||
kill $(pidof oprofiled);
|
||||
opcontrol --save=aspersa_collect_$d
|
||||
opcontrol --save=percona_toolkit_collect_$d
|
||||
|
||||
# Attempt to generate a report; if this fails, then just tell the user how
|
||||
# to generate the report.
|
||||
path_to_binary=$(which mysqld);
|
||||
if [ "${path_to_binary}" -a -f "${path_to_binary}" ]; then
|
||||
opreport --demangle=smart --symbols --merge tgid session:aspersa_collect_$d "${path_to_binary}" > "$OPT_d/$d-opreport"
|
||||
opreport --demangle=smart --symbols --merge tgid session:percona_toolkit_collect_$d "${path_to_binary}" > "$OPT_d/$d-opreport"
|
||||
else
|
||||
echo "oprofile data saved to aspersa_collect_$d; you should now be able to get a report" > "$OPT_d/$d-opreport"
|
||||
echo "oprofile data saved to percona_toolkit_collect_$d; you should now be able to get a report" > "$OPT_d/$d-opreport"
|
||||
echo "by running something like" >> "$OPT_d/$d-opreport"
|
||||
echo "opreport --demangle=smart --symbols --merge tgid session:aspersa_collect_$d /path/to/mysqld" >> "$OPT_d/$d-opreport"
|
||||
echo "opreport --demangle=smart --symbols --merge tgid session:percona_toolkit_collect_$d /path/to/mysqld" >> "$OPT_d/$d-opreport"
|
||||
fi
|
||||
elif [ "${OPT_s}" = "yes" ]; then
|
||||
kill -s 2 ${strace_pid}
|
||||
@@ -277,7 +262,7 @@ echo "Gathering info for $d"
|
||||
|
||||
# Finally, record what system we collected this data from.
|
||||
hostname > "$OPT_d/$d-hostname"
|
||||
)200>/tmp/aspersa-collect-lockfile >> "$OPT_d/$d-output" 2>&1
|
||||
)200>/tmp/percona-toolkit-collect-lockfile >> "$OPT_d/$d-output" 2>&1
|
||||
|
||||
# ############################################################################
|
||||
# Documentation
|
||||
@@ -291,44 +276,77 @@ pt-collect - Collect information from a server for some period of time.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-collect [OPTION...]
|
||||
Usage: pt-collect -d -g -i -o -s [OPTIONS] [-- MYSQL-OPTIONS]
|
||||
|
||||
pt-collect tool gathers a variety of information about a system for a period
|
||||
of time. It is typically executed when the stalk tool detects a condition
|
||||
and wants to collect information to assist in diagnosis. Four options
|
||||
must be specified on the command line: -dgios.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
pt-collect focuses on gathering diagnostic data during a MySQL performance
|
||||
problem. It is typically executed by C<stalk>.
|
||||
pt-collect creates a lock to ensure that only one instance runs at a time,
|
||||
and then saves a variety of performance and status data into files in the
|
||||
configured directory. Files are named with a timestamp so they can be
|
||||
grouped together. The tool is MySQL-centric by default, and gathers quite
|
||||
a bit of diagnostic data that's useful for understanding the behavior of
|
||||
a MySQL database server.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
Options after C<--> are passed to C<mysql> and C<mysqladmin>.
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
=head1 OPTIONS
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
=over
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
=item -d (required)
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
DESTINATION Where to store the resulting data; must already exist.
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
=item -g <yes/no> (required)
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
Collect GDB stack traces.
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
=item -i INTERVAL (required)
|
||||
|
||||
How many seconds to collect data.
|
||||
|
||||
=item -o <yes/no> (required)
|
||||
|
||||
Collect oprofile data; disables -s.
|
||||
|
||||
=item -s <yes/no> (required)
|
||||
|
||||
Collect strace data.
|
||||
|
||||
=item -f PERCENT
|
||||
|
||||
Exit if the disk is more than this percent full.
|
||||
|
||||
=item -m MEGABYTES
|
||||
|
||||
Exit unless there are this many megabytes free disk space.
|
||||
|
||||
=item -p PREFIX
|
||||
|
||||
Store the data into files with this prefix (optional).
|
||||
|
||||
=item -t <yes/no>
|
||||
|
||||
Collect tcpdump data.
|
||||
|
||||
=back
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-collect ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Bash.
|
||||
This tool requires Bash v3 or newer and assumes that these programs
|
||||
are installed, in the PATH, and executable: sysctl, top, vmstat, iostat,
|
||||
mpstat, lsof, mysql, mysqladmin, df, netstat, pidof, flock, and others
|
||||
depending on what command-line options are specified. If some of those
|
||||
programs are not available, the tool will still run but may print warnings.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -354,6 +372,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
274
bin/pt-diskstats
274
bin/pt-diskstats
@@ -4,6 +4,31 @@
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
# notices and disclaimers.
|
||||
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}" >&2
|
||||
fi
|
||||
echo "Usage: pt-diskstats [OPTIONS] [FILES]" >&2
|
||||
echo "For more information, 'man pt-diskstats' or 'perldoc $0'" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Show current help and settings
|
||||
print_help() {
|
||||
cat <<-HELP
|
||||
You can control this program by key presses:
|
||||
------------------- Key ------------------- ---- Current Setting ----
|
||||
A, D, S) Set the group-by mode ${OPT_g:-(none)}
|
||||
c) Enter an awk regex to match column names ${OPT_c:-(none)}
|
||||
d) Enter an awk regex to match disk names ${OPT_d:-(none)}
|
||||
i) Set the sample size in seconds ${OPT_i:-(none)}
|
||||
s) Set the redisplay interval in seconds ${OPT_s:-(none)}
|
||||
p) Pause the program
|
||||
q) Quit the program
|
||||
------------------- Press any key to continue -----------------------
|
||||
HELP
|
||||
}
|
||||
|
||||
# ########################################################################
|
||||
# A bunch of snippets of awk code, to be reused in the functions below.
|
||||
# ########################################################################
|
||||
@@ -259,7 +284,7 @@ design_print_formats() {
|
||||
# last sample.
|
||||
group_by_disk () {
|
||||
[ -z "${awk_print_line}" ] && design_print_formats
|
||||
cat > /tmp/aspersa.awk <<EOF
|
||||
cat > /tmp/percona-toolkit.awk <<EOF
|
||||
BEGIN {
|
||||
devs = 0;
|
||||
devname = "${OPT_d}";
|
||||
@@ -292,13 +317,13 @@ group_by_disk () {
|
||||
}
|
||||
}
|
||||
EOF
|
||||
awk -f /tmp/aspersa.awk "$@"
|
||||
awk -f /tmp/percona-toolkit.awk "$@"
|
||||
}
|
||||
|
||||
# Prints out one line for each sample, summing up all disks together.
|
||||
group_by_sample() {
|
||||
[ -z "${awk_print_line}" ] && design_print_formats
|
||||
cat > /tmp/aspersa.awk <<EOF
|
||||
cat > /tmp/percona-toolkit.awk <<EOF
|
||||
BEGIN {
|
||||
devs = 0;
|
||||
devname = "${OPT_d}";
|
||||
@@ -359,14 +384,14 @@ group_by_sample() {
|
||||
}
|
||||
}
|
||||
EOF
|
||||
awk -f /tmp/aspersa.awk "$@"
|
||||
awk -f /tmp/percona-toolkit.awk "$@"
|
||||
}
|
||||
|
||||
# Prints out one line for each sample, for each disk that matches the pattern.
|
||||
# TODO: omits the first sample.
|
||||
group_by_all () {
|
||||
[ -z "${awk_print_line}" ] && design_print_formats
|
||||
cat > /tmp/aspersa.awk <<EOF
|
||||
cat > /tmp/percona-toolkit.awk <<EOF
|
||||
BEGIN {
|
||||
devs = 0;
|
||||
devname = "${OPT_d}";
|
||||
@@ -398,49 +423,9 @@ group_by_all () {
|
||||
${awk_save_curr_as_prev}
|
||||
}
|
||||
EOF
|
||||
awk -f /tmp/aspersa.awk "$@"
|
||||
awk -f /tmp/percona-toolkit.awk "$@"
|
||||
}
|
||||
|
||||
# Show current help and settings
|
||||
print_help() {
|
||||
cat <<-HELP
|
||||
You can control this program by key presses:
|
||||
------------------- Key ------------------- ---- Current Setting ----
|
||||
A, D, S) Set the group-by mode ${OPT_g:-(none)}
|
||||
c) Enter an awk regex to match column names ${OPT_c:-(none)}
|
||||
d) Enter an awk regex to match disk names ${OPT_d:-(none)}
|
||||
i) Set the sample size in seconds ${OPT_i:-(none)}
|
||||
s) Set the redisplay interval in seconds ${OPT_s:-(none)}
|
||||
p) Pause the program
|
||||
q) Quit the program
|
||||
------------------- Press any key to continue -----------------------
|
||||
HELP
|
||||
}
|
||||
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}"
|
||||
fi
|
||||
cat <<-USAGE
|
||||
Usage: $0 [OPTIONS] [FILE]
|
||||
$0 does two things: 1) get /proc/diskstats periodically 2) aggregate the result.
|
||||
If you specify a FILE, or send input to STDIN, then step 1) is not performed.
|
||||
Options:
|
||||
-c COLS Awk regex of which columns to include (default cnc|rt|mb|busy|prg).
|
||||
-d DEVICES Awk regex of which devices to include.
|
||||
-g GROUPBY Group-by mode (default disk); specify one of the following:
|
||||
disk) # Each line of output shows one disk device.
|
||||
sample) # Each line of output shows one sample of statistics.
|
||||
all) # Each line of output shows one sample and one disk device.
|
||||
-i INTERVAL In -g sample mode, include INTERVAL seconds per sample.
|
||||
-k KEEPFILE File to save diskstats samples in (default /tmp/aspersa).
|
||||
If a non-default filename is used, it will be saved for later
|
||||
analysis.
|
||||
-n SAMPLES When in interactive mode, stop after N samples.
|
||||
-s INTERVAL Sample /proc/diskstats every N seconds (default 1).
|
||||
USAGE
|
||||
exit 1
|
||||
}
|
||||
|
||||
# The main code that runs by default. Arguments are the command-line options.
|
||||
main() {
|
||||
@@ -494,7 +479,7 @@ main() {
|
||||
esac
|
||||
done
|
||||
OPT_i="${OPT_i:-}"; export OPT_i;
|
||||
OPT_k="${OPT_k:-/tmp/aspersa}"; export OPT_k;
|
||||
OPT_k="${OPT_k:-/tmp/diskstats-samples}"; export OPT_k;
|
||||
OPT_n="${OPT_n:-}"; export OPT_n;
|
||||
OPT_c="${OPT_c:-cnc|rt|mb|busy|prg}"; export OPT_c;
|
||||
OPT_d="${OPT_d:-}"; export OPT_d;
|
||||
@@ -524,8 +509,8 @@ main() {
|
||||
fi
|
||||
fi
|
||||
if [ "${finished}" ]; then
|
||||
if [ "${OPT_k}" = "/tmp/aspersa" ]; then
|
||||
rm -f /tmp/aspersa
|
||||
if [ "${OPT_k}" = "/tmp/diskstats-samples" ]; then
|
||||
rm -f /tmp/diskstats-samples
|
||||
fi
|
||||
break;
|
||||
fi
|
||||
@@ -620,10 +605,10 @@ main() {
|
||||
|
||||
done
|
||||
|
||||
if [ "${OPT_k}" = "/tmp/aspersa" ]; then
|
||||
rm -f "/tmp/aspersa"
|
||||
if [ "${OPT_k}" = "/tmp/diskstats-samples" ]; then
|
||||
rm -f "/tmp/diskstats-samples"
|
||||
fi
|
||||
rm -f /tmp/aspersa.awk
|
||||
rm -f /tmp/percona-toolkit.awk
|
||||
}
|
||||
|
||||
# Execute the program if it was not included from another file. This makes it
|
||||
@@ -640,15 +625,37 @@ fi
|
||||
|
||||
=head1 NAME
|
||||
|
||||
pt-diskstats - Read a file generated from /proc/diskstats and summarize it.
|
||||
pt-diskstats - Aggregate and summarize F</proc/diskstats>.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-diskstats [OPTION...]
|
||||
Usage: pt-diskstats [OPTIONS] [FILES]
|
||||
|
||||
pt-diskstats reads F</proc/diskstats> periodically, or files with the
|
||||
contents of F</proc/diskstats>, aggregates the data, and prints it nicely.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The file read should look like this:
|
||||
pt-diskstats tool is similar to iostat, but has some advantages. It separates
|
||||
reads and writes, for example, and computes some things that iostat does in
|
||||
either incorrect or confusing ways. It is also menu-driven and interactive
|
||||
with several different ways to aggregate the data, and integrates well with
|
||||
the L<pt-collect> tool. These properties make it very convenient for quickly
|
||||
drilling down into I/O performance at the desired level of granularity.
|
||||
|
||||
This program works in two main modes. One way is to process a file with saved
|
||||
disk statistics, which you specify on the command line. The other way is to
|
||||
start a background process gathering samples at intervals and saving them into
|
||||
a file, and process this file in the foreground. In both cases, the tool is
|
||||
interactively controlled by keystrokes, so you can redisplay and slice the
|
||||
data flexibly and easily. If the tool is not attached to a terminal, it
|
||||
doesn't run interactively; it just processes and prints its output, then exits.
|
||||
Otherwise it loops until you exit with the 'q' key.
|
||||
|
||||
If you press the '?' key, you will bring up the interactive help menu that
|
||||
shows which keys control the program.
|
||||
|
||||
Files should have this format:
|
||||
|
||||
<contents of /proc/diskstats>
|
||||
TS <timestamp>
|
||||
@@ -656,38 +663,139 @@ The file read should look like this:
|
||||
... et cetera
|
||||
TS <timestamp> <-- must end with a TS line.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
See L<http://aspersa.googlecode.com/svn/html/diskstats.html> for a detailed
|
||||
example of using the tool.
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
=head1 OUTPUT
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
The columns are as follows:
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
=over
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
=item #ts
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
The number of seconds of samples in the line. If there is only one, then
|
||||
the timestamp itself is shown, without the {curly braces}.
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
=item device
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
The device name. If there is more than one device, then instead the number
|
||||
of devices aggregated into the line is shown, in {curly braces}.
|
||||
|
||||
=item rd_mb_s
|
||||
|
||||
The number of megabytes read per second, average, during the sampled interval.
|
||||
|
||||
=item rd_cnc
|
||||
|
||||
The average concurrency of the read operations, as computed by Little's Law
|
||||
(a.k.a. queueing theory).
|
||||
|
||||
=item rd_rt
|
||||
|
||||
The average response time of the read operations, in milliseconds.
|
||||
|
||||
=item wr_mb_s
|
||||
|
||||
Megabytes written per second, average.
|
||||
|
||||
=item wr_cnc
|
||||
|
||||
Write concurrency, similar to read concurrency.
|
||||
|
||||
=item wr_rt
|
||||
|
||||
Write response time, similar to read response time.
|
||||
|
||||
=item busy
|
||||
|
||||
The fraction of time that the device had at least one request in progress;
|
||||
this is what iostat calls %util (which is a misleading name).
|
||||
|
||||
=item in_prg
|
||||
|
||||
The number of requests that were in progress. Unlike the read and write
|
||||
concurrencies, which are averages that are generated from reliable numbers,
|
||||
this number is an instantaneous sample, and you can see that it might
|
||||
represent a spike of requests, rather than the true long-term average.
|
||||
|
||||
=back
|
||||
|
||||
In addition to the above columns, there are a few columns that are hidden by
|
||||
default. If you press the 'c' key, and then press Enter, you will blank out
|
||||
the regular expression pattern that selects columns to display, and you will
|
||||
then see the extra columns:
|
||||
|
||||
=over
|
||||
|
||||
=item rd_s
|
||||
|
||||
The number of reads per second.
|
||||
|
||||
=item rd_avkb
|
||||
|
||||
The average size of the reads, in kilobytes.
|
||||
|
||||
=item rd_mrg
|
||||
|
||||
The percentage of read requests that were merged together in the disk
|
||||
scheduler before reaching the device.
|
||||
|
||||
=item wr_s, wr_avgkb, and wr_mrg
|
||||
|
||||
These are analogous to their rd_* cousins.
|
||||
|
||||
=back
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
Options must precede files on the command line.
|
||||
|
||||
=over
|
||||
|
||||
=item -c COLS
|
||||
|
||||
Awk regex of which columns to include (default cnc|rt|mb|busy|prg).
|
||||
|
||||
=item -d DEVICES
|
||||
|
||||
Awk regex of which devices to include.
|
||||
|
||||
=item -g GROUPBY
|
||||
|
||||
Group-by mode (default disk); specify one of the following:
|
||||
|
||||
disk - Each line of output shows one disk device.
|
||||
sample - Each line of output shows one sample of statistics.
|
||||
all - Each line of output shows one sample and one disk device.
|
||||
|
||||
=item -i INTERVAL
|
||||
|
||||
In -g sample mode, include INTERVAL seconds per sample.
|
||||
|
||||
=item -k KEEPFILE
|
||||
|
||||
File to save diskstats samples in (default /tmp/diskstats-samples).
|
||||
If a non-default filename is used, it will be saved for later analysis.
|
||||
|
||||
=item -n SAMPLES
|
||||
|
||||
When in interactive mode, stop after N samples.
|
||||
|
||||
=item -s INTERVAL
|
||||
|
||||
Sample /proc/diskstats every N seconds (default 1).
|
||||
|
||||
=back
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-diskstats ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Perl, DBI, DBD::mysql, and some core packages that ought to be
|
||||
installed in any reasonably new version of Perl.
|
||||
This tool requires Bash v3 or newer and the F</proc> filesystem unless
|
||||
reading from files.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -713,6 +821,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
83
bin/pt-mext
83
bin/pt-mext
@@ -1,18 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
#!/bin/sh
|
||||
|
||||
# This program is part of Percona Toolkit: http://www.percona.com/software/
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
# notices and disclaimers.
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 [-r] -- commandline"
|
||||
echo " -r Relative: subtract each column from the previous column."
|
||||
echo " -- Option separator; after this, all arguments are passed"
|
||||
echo " to the program whose output mext will columnize."
|
||||
echo "mext columnizes repeated output from a program like mysqladmin extended:"
|
||||
echo " mext -r -- mysqladmin ext -i10 -c3"
|
||||
echo "You can also work with data from a file:"
|
||||
echo " mext -r -- cat mysqladmin-output.txt"
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}" >&2
|
||||
fi
|
||||
echo "Usage: pt-mext [OPTIONS] -- COMMAND" >&2
|
||||
echo "For more information, 'man pt-mext' or 'perldoc $0'" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -102,47 +99,49 @@ rm -f $FILE*;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
pt-mext - Aggregate and summarize mysqladmin extended output.
|
||||
pt-mext - Look at many samples of MySQL C<SHOW GLOBAL STATUS> side-by-side.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-mext [OPTION...]
|
||||
Usage: pt-mext [OPTIONS] -- COMMAND
|
||||
|
||||
pt-mext columnizes repeated output from a program like mysqladmin extended.
|
||||
|
||||
Get output from C<mysqladmin>:
|
||||
|
||||
mext -r -- mysqladmin ext -i10 -c3"
|
||||
|
||||
Get output from a file:
|
||||
|
||||
mext -r -- cat mysqladmin-output.txt
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
pt-mext aggregates and summarizes mysqladmin extended output.
|
||||
pt-mext executes the C<COMMAND> you specify, and reads through the result one
|
||||
line at a time. It places each line into a temporary file. When it finds a
|
||||
blank line, it assumes that a new sample of SHOW GLOBAL STATUS is starting,
|
||||
and it creates a new temporary file. At the end of this process, it has a
|
||||
number of temporary files. It joins the temporary files together side-by-side
|
||||
and prints the result. If the L<"-r"> option is given, it first subtracts
|
||||
each sample from the one after it before printing results.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
=head1 OPTIONS
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
=over
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
=item -r
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
Relative: subtract each column from the previous column.
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
=back
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-mext ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Bash.
|
||||
This tool requires the Bourne shell (F</bin/sh>).
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -168,6 +167,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
@@ -4,6 +4,15 @@
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
# notices and disclaimers.
|
||||
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}" >&2
|
||||
fi
|
||||
echo "Usage: pt-mysql-summary [MYSQL-OPTIONS]" >&2
|
||||
echo "For more information, 'man pt-mysql-summary' or 'perldoc $0'" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ########################################################################
|
||||
# Some global setup is necessary for cross-platform compatibility, even
|
||||
# when sourcing this script for testing purposes.
|
||||
@@ -53,9 +62,9 @@ fuzzy_formula='
|
||||
# symlink them to /etc/passwd and then run this program as root. Call this
|
||||
# function with "rm" or "touch" as an argument.
|
||||
temp_files() {
|
||||
for file in /tmp/aspersa{,-mysql-variables,-mysql-status,-innodb-status} \
|
||||
/tmp/aspersa{2,-mysql-databases,-mysql-processlist,-noncounters} \
|
||||
/tmp/aspersa-mysql{dump,-slave};
|
||||
for file in /tmp/percona-toolkit{,-mysql-variables,-mysql-status,-innodb-status} \
|
||||
/tmp/percona-toolkit{2,-mysql-databases,-mysql-processlist,-noncounters} \
|
||||
/tmp/percona-toolkit-mysql{dump,-slave};
|
||||
do
|
||||
case "$1" in
|
||||
touch)
|
||||
@@ -118,16 +127,16 @@ secs_to_time () {
|
||||
}'
|
||||
}
|
||||
|
||||
# gets a value from /tmp/aspersa-mysql-variables. Returns zero if it doesn't
|
||||
# gets a value from /tmp/percona-toolkit-mysql-variables. Returns zero if it doesn't
|
||||
# exist.
|
||||
get_var () {
|
||||
v="$($AP_AWK "\$1 ~ /^$1$/ { print \$2 }" /tmp/aspersa-mysql-variables)"
|
||||
v="$($AP_AWK "\$1 ~ /^$1$/ { print \$2 }" /tmp/percona-toolkit-mysql-variables)"
|
||||
echo "${v:-0}"
|
||||
}
|
||||
|
||||
# Returns true if a variable exists
|
||||
var_exists () {
|
||||
$AP_GREP "$1" /tmp/aspersa-mysql-variables >/dev/null 2>&1;
|
||||
$AP_GREP "$1" /tmp/percona-toolkit-mysql-variables >/dev/null 2>&1;
|
||||
}
|
||||
|
||||
# Returns "Enabled", "Disabled", or "Not Supported" depending on whether the
|
||||
@@ -136,7 +145,7 @@ var_exists () {
|
||||
# (string equal) to some value.
|
||||
feat_on() {
|
||||
if var_exists $1 ; then
|
||||
var="$($AP_AWK "\$1 ~ /^$1$/ { print \$2 }" /tmp/aspersa-mysql-variables)"
|
||||
var="$($AP_AWK "\$1 ~ /^$1$/ { print \$2 }" /tmp/percona-toolkit-mysql-variables)"
|
||||
if [ "${var}" = "ON" ]; then
|
||||
echo "Enabled"
|
||||
elif [ "${var}" = "OFF" -o "${var}" = "0" -o -z "${var}" ]; then
|
||||
@@ -163,10 +172,10 @@ feat_on() {
|
||||
fi
|
||||
}
|
||||
|
||||
# gets a value from /tmp/aspersa-mysql-status. Returns zero if it doesn't
|
||||
# gets a value from /tmp/percona-toolkit-mysql-status. Returns zero if it doesn't
|
||||
# exist.
|
||||
get_stat () {
|
||||
v="$($AP_AWK "\$1 ~ /^$1$/ { print \$2 }" /tmp/aspersa-mysql-status)"
|
||||
v="$($AP_AWK "\$1 ~ /^$1$/ { print \$2 }" /tmp/percona-toolkit-mysql-status)"
|
||||
echo "${v:-0}"
|
||||
}
|
||||
|
||||
@@ -186,16 +195,16 @@ fuzzy_pct () {
|
||||
# Functions for parsing specific files and getting desired info from them.
|
||||
# These are called from within main() and are separated so they can be tested
|
||||
# easily. The calling convention is that the data they need to run is prepared
|
||||
# first by putting it into /tmp/aspersa. Then code that's testing just needs to
|
||||
# put sample data into /tmp/aspersa and call it.
|
||||
# first by putting it into /tmp/percona-toolkit. Then code that's testing just needs to
|
||||
# put sample data into /tmp/percona-toolkit and call it.
|
||||
# ##############################################################################
|
||||
|
||||
# Parses the output of 'ps -e -o args | $AP_GREP mysqld' or 'ps auxww...'
|
||||
# which should be in /tmp/aspersa.
|
||||
# which should be in /tmp/percona-toolkit.
|
||||
parse_mysqld_instances () {
|
||||
echo " Port Data Directory Socket"
|
||||
echo " ===== ========================== ======"
|
||||
$AP_GREP '/mysqld ' /tmp/aspersa | while read line; do
|
||||
$AP_GREP '/mysqld ' /tmp/percona-toolkit | while read line; do
|
||||
for word in ${line}; do
|
||||
# Some grep doesn't have -o, so I have to pull out the words I want by
|
||||
# looking at each word
|
||||
@@ -214,21 +223,21 @@ parse_mysqld_instances () {
|
||||
}
|
||||
|
||||
# Tries to find the my.cnf file by examining 'ps' output, which should be in
|
||||
# /tmp/aspersa. You have to specify the port for the instance you are
|
||||
# /tmp/percona-toolkit. You have to specify the port for the instance you are
|
||||
# interested in, in case there are multiple instances.
|
||||
find_my_cnf_file() {
|
||||
if test -n "$1" && $AP_GREP -- "/mysqld.*--port=$1" /tmp/aspersa >/dev/null 2>&1 ; then
|
||||
$AP_GREP -- "/mysqld.*--port=$1" /tmp/aspersa \
|
||||
if test -n "$1" && $AP_GREP -- "/mysqld.*--port=$1" /tmp/percona-toolkit >/dev/null 2>&1 ; then
|
||||
$AP_GREP -- "/mysqld.*--port=$1" /tmp/percona-toolkit \
|
||||
| $AP_AWK 'BEGIN{RS=" "; FS="=";} $1 ~ /--defaults-file/ { print $2; }' \
|
||||
| head -n1
|
||||
else
|
||||
$AP_GREP '/mysqld' /tmp/aspersa \
|
||||
$AP_GREP '/mysqld' /tmp/percona-toolkit \
|
||||
| $AP_AWK 'BEGIN{RS=" "; FS="=";} $1 ~ /--defaults-file/ { print $2; }' \
|
||||
| head -n1
|
||||
fi
|
||||
}
|
||||
|
||||
# Gets the MySQL system time. Uses input from /tmp/aspersa-mysql-variables.
|
||||
# Gets the MySQL system time. Uses input from /tmp/percona-toolkit-mysql-variables.
|
||||
get_mysql_timezone () {
|
||||
tz="$(get_var time_zone)"
|
||||
if [ "${tz}" = "SYSTEM" ]; then
|
||||
@@ -237,43 +246,43 @@ get_mysql_timezone () {
|
||||
echo "${tz}"
|
||||
}
|
||||
|
||||
# Gets the MySQL system version. Uses input from /tmp/aspersa-mysql-variables.
|
||||
# Gets the MySQL system version. Uses input from /tmp/percona-toolkit-mysql-variables.
|
||||
get_mysql_version () {
|
||||
name_val Version "$(get_var version) $(get_var version_comment)"
|
||||
name_val "Built On" "$(get_var version_compile_os) $(get_var version_compile_machine)"
|
||||
}
|
||||
|
||||
# Gets the system start and uptime in human readable format. Last restart date
|
||||
# should be in /tmp/aspersa.
|
||||
# should be in /tmp/percona-toolkit.
|
||||
get_mysql_uptime () {
|
||||
restart="$(cat /tmp/aspersa)"
|
||||
restart="$(cat /tmp/percona-toolkit)"
|
||||
uptime="$(get_stat Uptime)"
|
||||
uptime="$(secs_to_time ${uptime})"
|
||||
echo "${restart} (up ${uptime})"
|
||||
}
|
||||
|
||||
# Summarizes the output of SHOW MASTER LOGS, which is in /tmp/aspersa
|
||||
# Summarizes the output of SHOW MASTER LOGS, which is in /tmp/percona-toolkit
|
||||
summarize_binlogs () {
|
||||
name_val "Binlogs" $(wc -l /tmp/aspersa)
|
||||
name_val "Zero-Sized" $($AP_GREP -c '\<0$' /tmp/aspersa)
|
||||
size=$($AP_AWK '{t += $2} END{printf "%0.f\n", t}' /tmp/aspersa)
|
||||
name_val "Binlogs" $(wc -l /tmp/percona-toolkit)
|
||||
name_val "Zero-Sized" $($AP_GREP -c '\<0$' /tmp/percona-toolkit)
|
||||
size=$($AP_AWK '{t += $2} END{printf "%0.f\n", t}' /tmp/percona-toolkit)
|
||||
name_val "Total Size" $(shorten ${size} 1)
|
||||
}
|
||||
|
||||
# Print out binlog_do_db and binlog_ignore_db
|
||||
format_binlog_filters () {
|
||||
name_val "binlog_do_db" $(cut -f3 /tmp/aspersa)
|
||||
name_val "binlog_ignore_db" $(cut -f4 /tmp/aspersa)
|
||||
name_val "binlog_do_db" $(cut -f3 /tmp/percona-toolkit)
|
||||
name_val "binlog_ignore_db" $(cut -f4 /tmp/percona-toolkit)
|
||||
}
|
||||
|
||||
# Takes as input a file that has two samples of SHOW STATUS, columnized next to
|
||||
# each other. These should be in /tmp/aspersa. Outputs fuzzy-ed numbers:
|
||||
# each other. These should be in /tmp/percona-toolkit. Outputs fuzzy-ed numbers:
|
||||
# absolute, all-time per second, and per-second over the interval between the
|
||||
# samples. Omits any rows that are all zeroes.
|
||||
format_status_variables () {
|
||||
# First, figure out the intervals.
|
||||
utime1=$($AP_AWK '/Uptime /{print $2}' /tmp/aspersa);
|
||||
utime2=$($AP_AWK '/Uptime /{print $3}' /tmp/aspersa);
|
||||
utime1=$($AP_AWK '/Uptime /{print $2}' /tmp/percona-toolkit);
|
||||
utime2=$($AP_AWK '/Uptime /{print $3}' /tmp/percona-toolkit);
|
||||
${AP_AWK} "
|
||||
BEGIN {
|
||||
utime1 = ${utime1};
|
||||
@@ -310,11 +319,11 @@ format_status_variables () {
|
||||
printf(format, \$1, perday, persec, nowsec);
|
||||
}
|
||||
}
|
||||
}" /tmp/aspersa
|
||||
}" /tmp/percona-toolkit
|
||||
}
|
||||
|
||||
# Slices the processlist a bunch of different ways. Uses input from
|
||||
# /tmp/aspersa-mysql-processlist. The processlist should be created with the \G
|
||||
# /tmp/percona-toolkit-mysql-processlist. The processlist should be created with the \G
|
||||
# flag so it's vertical. The parsing is a bit awkward because different
|
||||
# versions of awk have limitations like "too many fields on line xyz". So we
|
||||
# use 'cut' to shorten the lines. We count all things into temporary variables
|
||||
@@ -329,7 +338,7 @@ summarize_processlist () {
|
||||
"${param}" "COUNT(*)" Working "SUM(Time)" "MAX(Time)"
|
||||
echo " ------------------------------" \
|
||||
"-------- ------- --------- ---------"
|
||||
cut -c1-80 /tmp/aspersa-mysql-processlist \
|
||||
cut -c1-80 /tmp/percona-toolkit-mysql-processlist \
|
||||
| $AP_AWK "
|
||||
\$1 == \"${param}:\" {
|
||||
p = substr(\$0, index(\$0, \":\") + 2);
|
||||
@@ -370,7 +379,7 @@ summarize_processlist () {
|
||||
echo
|
||||
}
|
||||
|
||||
# Pretty-prints the my.cnf file, which should be in /tmp/aspersa. It's super
|
||||
# Pretty-prints the my.cnf file, which should be in /tmp/percona-toolkit. It's super
|
||||
# annoying, but some *modern* versions of awk don't support POSIX character
|
||||
# sets in regular expressions, like [[:space:]] (looking at you, Debian). So
|
||||
# the below patterns contain [<space><tab>] and must remain that way.
|
||||
@@ -394,7 +403,7 @@ pretty_print_cnf_file () {
|
||||
else {
|
||||
print $1;
|
||||
}
|
||||
}' /tmp/aspersa
|
||||
}' /tmp/percona-toolkit
|
||||
}
|
||||
|
||||
find_checkpoint_age() {
|
||||
@@ -526,8 +535,8 @@ format_innodb_status () {
|
||||
name_val "Pending I/O Writes" "$(find_pending_io_writes "${1}")"
|
||||
name_val "Pending I/O Flushes" "$(find_pending_io_flushes "${1}")"
|
||||
$AP_AWK -F, '/^---TRANSACTION/{print $2}' "${1}" \
|
||||
| $AP_SED -e 's/ [0-9]* sec.*//' | sort | uniq -c > /tmp/aspersa2
|
||||
name_val "Transaction States" "$(group_concat /tmp/aspersa2)"
|
||||
| $AP_SED -e 's/ [0-9]* sec.*//' | sort | uniq -c > /tmp/percona-toolkit2
|
||||
name_val "Transaction States" "$(group_concat /tmp/percona-toolkit2)"
|
||||
if $AP_GREP 'TABLE LOCK table' "${1}" >/dev/null ; then
|
||||
echo "Tables Locked"
|
||||
$AP_AWK '/^TABLE LOCK table/{print $4}' "${1}" \
|
||||
@@ -613,9 +622,9 @@ format_overall_db_stats () {
|
||||
printf fmt, db, counts[db ",tables"], counts[db ",views"], counts[db ",sps"], counts[db ",trg"], counts[db ",func"], counts[db ",fk"], counts[db ",partn"];
|
||||
}
|
||||
}
|
||||
' /tmp/aspersa-mysqldump > /tmp/aspersa
|
||||
head -n2 /tmp/aspersa
|
||||
tail -n +3 /tmp/aspersa | sort
|
||||
' /tmp/percona-toolkit-mysqldump > /tmp/percona-toolkit
|
||||
head -n2 /tmp/percona-toolkit
|
||||
tail -n +3 /tmp/percona-toolkit | sort
|
||||
|
||||
echo
|
||||
# Now do the summary of engines per DB
|
||||
@@ -673,9 +682,9 @@ format_overall_db_stats () {
|
||||
print "";
|
||||
}
|
||||
}
|
||||
' /tmp/aspersa-mysqldump > /tmp/aspersa
|
||||
head -n1 /tmp/aspersa
|
||||
tail -n +2 /tmp/aspersa | sort
|
||||
' /tmp/percona-toolkit-mysqldump > /tmp/percona-toolkit
|
||||
head -n1 /tmp/percona-toolkit
|
||||
tail -n +2 /tmp/percona-toolkit | sort
|
||||
|
||||
echo
|
||||
# Now do the summary of index types per DB. Careful -- index is a reserved
|
||||
@@ -746,9 +755,9 @@ format_overall_db_stats () {
|
||||
print "";
|
||||
}
|
||||
}
|
||||
' /tmp/aspersa-mysqldump > /tmp/aspersa
|
||||
head -n1 /tmp/aspersa
|
||||
tail -n +2 /tmp/aspersa | sort
|
||||
' /tmp/percona-toolkit-mysqldump > /tmp/percona-toolkit
|
||||
head -n1 /tmp/percona-toolkit
|
||||
tail -n +2 /tmp/percona-toolkit | sort
|
||||
|
||||
echo
|
||||
# Now do the summary of datatypes per DB
|
||||
@@ -837,10 +846,10 @@ format_overall_db_stats () {
|
||||
print "";
|
||||
}
|
||||
}
|
||||
' /tmp/aspersa-mysqldump > /tmp/aspersa
|
||||
hdr=$($AP_GREP -n Database /tmp/aspersa | cut -d: -f1);
|
||||
head -n${hdr} /tmp/aspersa
|
||||
tail -n +$((${hdr} + 1)) /tmp/aspersa | sort
|
||||
' /tmp/percona-toolkit-mysqldump > /tmp/percona-toolkit
|
||||
hdr=$($AP_GREP -n Database /tmp/percona-toolkit | cut -d: -f1);
|
||||
head -n${hdr} /tmp/percona-toolkit
|
||||
tail -n +$((${hdr} + 1)) /tmp/percona-toolkit | sort
|
||||
echo
|
||||
|
||||
}
|
||||
@@ -865,28 +874,28 @@ main() {
|
||||
# ########################################################################
|
||||
# Header for the whole thing, table of discovered instances
|
||||
# ########################################################################
|
||||
section Aspersa_MySQL_Summary_Report
|
||||
section Percona_Toolkit_MySQL_Summary_Report
|
||||
name_val "System time" "`date -u +'%F %T UTC'` (local TZ: `date +'%Z %z'`)"
|
||||
section Instances
|
||||
ps auxww 2>/dev/null | $AP_GREP mysqld > /tmp/aspersa
|
||||
ps auxww 2>/dev/null | $AP_GREP mysqld > /tmp/percona-toolkit
|
||||
parse_mysqld_instances
|
||||
|
||||
# ########################################################################
|
||||
# Fetch some basic info so we can start
|
||||
# ########################################################################
|
||||
mysql "$@" -ss -e 'SELECT CURRENT_USER()' > /tmp/aspersa
|
||||
mysql "$@" -ss -e 'SELECT CURRENT_USER()' > /tmp/percona-toolkit
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Cannot connect to mysql, please specify command-line options."
|
||||
temp_files "rm"
|
||||
exit 1
|
||||
fi
|
||||
user="$(cat /tmp/aspersa)";
|
||||
mysql -ss -e 'SHOW /*!40100 GLOBAL*/ VARIABLES' "$@" > /tmp/aspersa-mysql-variables
|
||||
mysql -ss -e 'SHOW /*!50000 GLOBAL*/ STATUS' "$@" > /tmp/aspersa-mysql-status
|
||||
mysql -ss -e 'SHOW DATABASES' "$@" > /tmp/aspersa-mysql-databases 2>/dev/null
|
||||
mysql -ssE -e 'SHOW SLAVE STATUS' "$@" > /tmp/aspersa-mysql-slave 2>/dev/null
|
||||
mysql -ssE -e 'SHOW /*!50000 ENGINE*/ INNODB STATUS' "$@" > /tmp/aspersa-innodb-status 2>/dev/null
|
||||
mysql -ssE -e 'SHOW FULL PROCESSLIST' "$@" > /tmp/aspersa-mysql-processlist 2>/dev/null
|
||||
user="$(cat /tmp/percona-toolkit)";
|
||||
mysql -ss -e 'SHOW /*!40100 GLOBAL*/ VARIABLES' "$@" > /tmp/percona-toolkit-mysql-variables
|
||||
mysql -ss -e 'SHOW /*!50000 GLOBAL*/ STATUS' "$@" > /tmp/percona-toolkit-mysql-status
|
||||
mysql -ss -e 'SHOW DATABASES' "$@" > /tmp/percona-toolkit-mysql-databases 2>/dev/null
|
||||
mysql -ssE -e 'SHOW SLAVE STATUS' "$@" > /tmp/percona-toolkit-mysql-slave 2>/dev/null
|
||||
mysql -ssE -e 'SHOW /*!50000 ENGINE*/ INNODB STATUS' "$@" > /tmp/percona-toolkit-innodb-status 2>/dev/null
|
||||
mysql -ssE -e 'SHOW FULL PROCESSLIST' "$@" > /tmp/percona-toolkit-mysql-processlist 2>/dev/null
|
||||
now="$(mysql -ss -e 'SELECT NOW()' "$@")"
|
||||
port="$(get_var port)"
|
||||
|
||||
@@ -901,16 +910,16 @@ main() {
|
||||
|
||||
uptime="$(get_stat Uptime)"
|
||||
mysql -ss -e "SELECT LEFT(NOW() - INTERVAL ${uptime} SECOND, 16)" "$@" \
|
||||
> /tmp/aspersa
|
||||
> /tmp/percona-toolkit
|
||||
name_val Started "$(get_mysql_uptime)"
|
||||
|
||||
name_val Databases "$($AP_GREP -c . /tmp/aspersa-mysql-databases)"
|
||||
name_val Databases "$($AP_GREP -c . /tmp/percona-toolkit-mysql-databases)"
|
||||
name_val Datadir "$(get_var datadir)"
|
||||
procs="$(get_stat Threads_connected)"
|
||||
procr="$(get_stat Threads_running)"
|
||||
name_val Processes "$(fuzz ${procs}) connected, $(fuzz ${procr}) running"
|
||||
if [ -s /tmp/aspersa-mysql-slave ]; then slave=""; else slave="not "; fi
|
||||
slavecount=$($AP_GREP -c 'Binlog Dump' /tmp/aspersa-mysql-processlist)
|
||||
if [ -s /tmp/percona-toolkit-mysql-slave ]; then slave=""; else slave="not "; fi
|
||||
slavecount=$($AP_GREP -c 'Binlog Dump' /tmp/percona-toolkit-mysql-processlist)
|
||||
name_val Replication "Is ${slave}a slave, has ${slavecount} slaves connected"
|
||||
|
||||
# TODO move this into a section with other files: error log, slow log and
|
||||
@@ -932,7 +941,7 @@ main() {
|
||||
sleep 10
|
||||
# TODO: gather this data in the same format as normal: stats, TS line
|
||||
mysql -ss -e 'SHOW /*!50000 GLOBAL*/ STATUS' "$@" \
|
||||
| join /tmp/aspersa-mysql-status - > /tmp/aspersa
|
||||
| join /tmp/percona-toolkit-mysql-status - > /tmp/percona-toolkit
|
||||
# Make a file with a list of things we want to omit because they aren't
|
||||
# counters, they are gauges (in RRDTool terminology). Gauges are shown
|
||||
# elsewhere in the output.
|
||||
@@ -956,9 +965,9 @@ main() {
|
||||
Threads_cached Threads_connected Threads_running \
|
||||
Uptime_since_flush_status;
|
||||
do
|
||||
echo "${var}" >> /tmp/aspersa-noncounters
|
||||
echo "${var}" >> /tmp/percona-toolkit-noncounters
|
||||
done
|
||||
format_status_variables | $AP_GREP -v -f /tmp/aspersa-noncounters
|
||||
format_status_variables | $AP_GREP -v -f /tmp/percona-toolkit-noncounters
|
||||
|
||||
# ########################################################################
|
||||
# Table cache
|
||||
@@ -1035,22 +1044,22 @@ main() {
|
||||
trg_arg="${trg_arg} ${triggers}";
|
||||
fi
|
||||
# Find out which databases to dump
|
||||
num_dbs="$($AP_GREP -c . /tmp/aspersa-mysql-databases)"
|
||||
num_dbs="$($AP_GREP -c . /tmp/percona-toolkit-mysql-databases)"
|
||||
echo "There are ${num_dbs} databases. Would you like to dump all, or just one?"
|
||||
echo -n "Type the name of the database, or press Enter to dump all of them. "
|
||||
read dbtodump
|
||||
mysqldump --no-data --skip-comments \
|
||||
--skip-add-locks --skip-add-drop-table --compact \
|
||||
--skip-lock-all-tables --skip-lock-tables --skip-set-charset \
|
||||
${trg_arg} "$@" ${dbtodump:---all-databases} > /tmp/aspersa-mysqldump
|
||||
${trg_arg} "$@" ${dbtodump:---all-databases} > /tmp/percona-toolkit-mysqldump
|
||||
# Test the result by checking the file, not by the exit status, because we
|
||||
# might get partway through and then die, and the info is worth analyzing
|
||||
# anyway.
|
||||
if $AP_GREP 'CREATE TABLE' /tmp/aspersa-mysqldump >/dev/null 2>&1; then
|
||||
if $AP_GREP 'CREATE TABLE' /tmp/percona-toolkit-mysqldump >/dev/null 2>&1; then
|
||||
format_overall_db_stats
|
||||
else
|
||||
echo "Skipping schema analysis due to apparent error in dump file"
|
||||
rm -f /tmp/aspersa-mysqldump
|
||||
rm -f /tmp/percona-toolkit-mysqldump
|
||||
fi
|
||||
else
|
||||
echo "Skipping schema analysis"
|
||||
@@ -1060,23 +1069,23 @@ main() {
|
||||
# Noteworthy Technologies
|
||||
# ########################################################################
|
||||
section Noteworthy_Technologies
|
||||
if [ -e /tmp/aspersa-mysqldump ]; then
|
||||
if $AP_GREP FULLTEXT /tmp/aspersa-mysqldump > /dev/null; then
|
||||
if [ -e /tmp/percona-toolkit-mysqldump ]; then
|
||||
if $AP_GREP FULLTEXT /tmp/percona-toolkit-mysqldump > /dev/null; then
|
||||
name_val "Full Text Indexing" Yes
|
||||
else
|
||||
name_val "Full Text Indexing" No
|
||||
fi
|
||||
if $AP_GREP 'GEOMETRY\|POINT\|LINESTRING\|POLYGON' /tmp/aspersa-mysqldump > /dev/null; then
|
||||
if $AP_GREP 'GEOMETRY\|POINT\|LINESTRING\|POLYGON' /tmp/percona-toolkit-mysqldump > /dev/null; then
|
||||
name_val "Geospatial Types" Yes
|
||||
else
|
||||
name_val "Geospatial Types" No
|
||||
fi
|
||||
if $AP_GREP 'FOREIGN KEY' /tmp/aspersa-mysqldump > /dev/null; then
|
||||
if $AP_GREP 'FOREIGN KEY' /tmp/percona-toolkit-mysqldump > /dev/null; then
|
||||
name_val "Foreign Keys" Yes
|
||||
else
|
||||
name_val "Foreign Keys" No
|
||||
fi
|
||||
if $AP_GREP 'PARTITION BY' /tmp/aspersa-mysqldump > /dev/null; then
|
||||
if $AP_GREP 'PARTITION BY' /tmp/percona-toolkit-mysqldump > /dev/null; then
|
||||
name_val "Partitioning" Yes
|
||||
else
|
||||
name_val "Partitioning" No
|
||||
@@ -1156,8 +1165,8 @@ main() {
|
||||
name_val "Adaptive Flushing" $(get_var innodb_adaptive_flushing)
|
||||
name_val "Adaptive Checkpoint" $(get_var innodb_adaptive_checkpoint)
|
||||
|
||||
if [ -s /tmp/aspersa-innodb-status ]; then
|
||||
format_innodb_status /tmp/aspersa-innodb-status
|
||||
if [ -s /tmp/percona-toolkit-innodb-status ]; then
|
||||
format_innodb_status /tmp/percona-toolkit-innodb-status
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1192,14 +1201,14 @@ main() {
|
||||
section Binary_Logging
|
||||
binlog=$(get_var log_bin)
|
||||
if [ "${binlog}" ]; then
|
||||
mysql -ss -e 'SHOW MASTER LOGS' "$@" > /tmp/aspersa 2>/dev/null
|
||||
mysql -ss -e 'SHOW MASTER LOGS' "$@" > /tmp/percona-toolkit 2>/dev/null
|
||||
summarize_binlogs
|
||||
format="$(get_var binlog_format)"
|
||||
name_val binlog_format "${format:-STATEMENT}"
|
||||
name_val expire_logs_days $(get_var expire_logs_days)
|
||||
name_val sync_binlog $(get_var sync_binlog)
|
||||
name_val server_id $(get_var server_id)
|
||||
mysql -ss -e 'SHOW MASTER STATUS' "$@" > /tmp/aspersa 2>/dev/null
|
||||
mysql -ss -e 'SHOW MASTER STATUS' "$@" > /tmp/percona-toolkit 2>/dev/null
|
||||
format_binlog_filters
|
||||
fi
|
||||
|
||||
@@ -1233,7 +1242,7 @@ main() {
|
||||
# If there is a my.cnf in a standard location, see if we can pretty-print it.
|
||||
# ########################################################################
|
||||
section Configuration_File
|
||||
ps auxww 2>/dev/null | $AP_GREP mysqld > /tmp/aspersa
|
||||
ps auxww 2>/dev/null | $AP_GREP mysqld > /tmp/percona-toolkit
|
||||
cnf_file=$(find_my_cnf_file ${port});
|
||||
if [ ! -e "${cnf_file}" ]; then
|
||||
name_val "Config File" "Cannot autodetect, trying common locations"
|
||||
@@ -1247,7 +1256,7 @@ main() {
|
||||
fi
|
||||
if [ -e "${cnf_file}" ]; then
|
||||
name_val "Config File" "${cnf_file}"
|
||||
cat "${cnf_file}" > /tmp/aspersa
|
||||
cat "${cnf_file}" > /tmp/percona-toolkit
|
||||
pretty_print_cnf_file
|
||||
else
|
||||
name_val "Config File" "Cannot autodetect or find, giving up"
|
||||
@@ -1275,52 +1284,57 @@ pt-mysql-summary - Summarize MySQL information in a nice way.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-mysql-summary [OPTION...]
|
||||
Usage: pt-mysql-summary [MYSQL-OPTIONS]
|
||||
|
||||
pt-mysql-summary conveniently summarizes the status and configuration of a
|
||||
MySQL database server so that you can learn about it at a glance. It is not
|
||||
a tuning tool or diagnosis tool. It produces a report that is easy to diff
|
||||
and can be pasted into emails without losing the formatting. It should work
|
||||
well on any modern UNIX systems.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Goals: work well on all UNIXes; create a compact diff-able report that is
|
||||
easy to paste into a wiki or email, and easy to scan and compare too.
|
||||
pt-mysql-summary works by connecting to a MySQL database server and querying
|
||||
it for status and configuration information. It saves these bits of data
|
||||
into files in /tmp, and then formats them neatly with awk and other scripting
|
||||
languages.
|
||||
|
||||
To use, simply execute it. Optionally add the same command-line options
|
||||
you would use to connect to MySQL, such as "./mysql-summary --user=foo"
|
||||
you would use to connect to MySQL, like C<pt-mysql-summary --user=foo>.
|
||||
|
||||
=head1 TODO
|
||||
The tool interacts minimally with the server upon which it runs. It assumes
|
||||
that you'll run it on the same server you're inspecting, and therefore it
|
||||
assumes that it will be able to find the my.cnf configuration file, for
|
||||
example. However, it should degrade gracefully if this is not the case.
|
||||
Note, however, that its output does not indicate which information comes from
|
||||
the MySQL database and which comes from the host operating system, so it is
|
||||
possible for confusing output to be generated if you run the tool on one
|
||||
server and direct it to connect to a MySQL database server running on another
|
||||
server.
|
||||
|
||||
* Parse queries out of processlist and aggregate them.
|
||||
=head1 Fuzzy-Rounding
|
||||
|
||||
=head1 DOWNLOADING
|
||||
Many of the outputs from this tool are deliberately rounded to show their
|
||||
magnitude but not the exact detail. This is called fuzzy-rounding. The idea
|
||||
is that it doesn't matter whether a server is running 918 queries per second
|
||||
or 921 queries per second; such a small variation is insignificant, and only
|
||||
makes the output hard to compare to other servers. Fuzzy-rounding rounds in
|
||||
larger increments as the input grows. It begins by rounding to the nearest 5,
|
||||
then the nearest 10, nearest 25, and then repeats by a factor of 10 larger
|
||||
(50, 100, 250), and so on, as the input grows.
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
=head1 OPTIONS
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
This tool does not have any command-line options of its own. All options
|
||||
are passed to C<mysql>.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-mysql-summary ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Perl, DBI, DBD::mysql, and some core packages that ought to be
|
||||
installed in any reasonably new version of Perl.
|
||||
This tool requires Bash v3 or newer.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -1346,6 +1360,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
112
bin/pt-pmp
112
bin/pt-pmp
@@ -4,23 +4,12 @@
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
# notices and disclaimers.
|
||||
|
||||
# Print a usage message and exit.
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}"
|
||||
echo "${OPT_ERR}" >&2
|
||||
fi
|
||||
cat <<-USAGE
|
||||
Usage: $0 [OPTIONS] [FILE]
|
||||
$0 does two things: 1) get a GDB backtrace 2) aggregate it.
|
||||
If you specify a FILE, then step 1) is not performed.
|
||||
Options:
|
||||
-b BINARY Which binary to trace (default mysqld)
|
||||
-i ITERATIONS How many traces to gather and aggregate (default 1)
|
||||
-k KEEPFILE Keep the raw traces in this file after aggregation
|
||||
-l NUMBER Aggregate only first NUMBER functions; 0=infinity (default 0)
|
||||
-p PID Process ID of the process to trace; overrides -b
|
||||
-s SLEEPTIME Number of seconds to sleep between iterations (default 0)
|
||||
USAGE
|
||||
echo "Usage: pt-pmp [OPTIONS] [FILES]" >&2
|
||||
echo "For more information, 'man pt-pmp' or 'perldoc $0'" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -29,7 +18,7 @@ Options:
|
||||
# to pass the maxlen argument into this function to make maxlen testable.
|
||||
aggregate_stacktrace() {
|
||||
maxlen="$1";
|
||||
cat > /tmp/aspersa.awk <<EOF
|
||||
cat > /tmp/percona-toolkit.awk <<EOF
|
||||
BEGIN {
|
||||
s = "";
|
||||
}
|
||||
@@ -106,13 +95,13 @@ aggregate_stacktrace() {
|
||||
print s
|
||||
}
|
||||
EOF
|
||||
awk -f /tmp/aspersa.awk "$2" | sort | uniq -c | sort -r -n -k 1,1
|
||||
rm -f /tmp/aspersa
|
||||
awk -f /tmp/percona-toolkit.awk "$2" | sort | uniq -c | sort -r -n -k 1,1
|
||||
rm -f /tmp/percona-toolkit
|
||||
}
|
||||
|
||||
# The main program to run.
|
||||
main() {
|
||||
rm -f /tmp/aspersa
|
||||
rm -f /tmp/percona-toolkit
|
||||
|
||||
# Get command-line options
|
||||
for o; do
|
||||
@@ -167,15 +156,15 @@ main() {
|
||||
fi
|
||||
date;
|
||||
for x in $(seq 1 $OPT_i); do
|
||||
gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $OPT_p >> "${OPT_k:-/tmp/aspersa}"
|
||||
date +'TS %N.%s %F %T' >> "${OPT_k:-/tmp/aspersa}"
|
||||
gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $OPT_p >> "${OPT_k:-/tmp/percona-toolkit}"
|
||||
date +'TS %N.%s %F %T' >> "${OPT_k:-/tmp/percona-toolkit}"
|
||||
sleep $OPT_s
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
aggregate_stacktrace "${OPT_l}" "${OPT_k:-/tmp/aspersa}"
|
||||
rm -f /tmp/aspersa
|
||||
aggregate_stacktrace "${OPT_l}" "${OPT_k:-/tmp/percona-toolkit}"
|
||||
rm -f /tmp/percona-toolkit
|
||||
else
|
||||
aggregate_stacktrace "${OPT_l}" "$@"
|
||||
fi
|
||||
@@ -199,44 +188,63 @@ pt-pmp - Aggregate GDB stack traces for a selected program.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-pmp [OPTION...]
|
||||
Usage: pt-pmp [OPTIONS] [FILES]
|
||||
|
||||
pt-pmp is a poor man's profiler, inspired by L<http://poormansprofiler.org>.
|
||||
It can create and summarize full stack traces of processes on Linux.
|
||||
Summaries of stack traces can be an invaluable tool for diagnosing what
|
||||
a process is waiting for.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
pt-pmp aggregates stack traces.
|
||||
pt-pmp performs two tasks: it gets a stack trace, and it summarizes the stack
|
||||
trace. If a file is given on the command line, the tool skips the first step
|
||||
and just aggregates the file.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
To summarize the stack trace, the tool extracts the function name (symbol)
|
||||
from each level of the stack, and combines them with commas. It does this
|
||||
for each thread in the output. Afterwards, it sorts similar threads together
|
||||
and counts how many of each one there are, then sorts them most-frequent first.
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
=head1 OPTIONS
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
Options must precede files on the command line.
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
=over
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
=item -b BINARY
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
Which binary to trace (default mysqld)
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
=item -i ITERATIONS
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
How many traces to gather and aggregate (default 1)
|
||||
|
||||
=item -k KEEPFILE
|
||||
|
||||
Keep the raw traces in this file after aggregation
|
||||
|
||||
=item -l NUMBER
|
||||
|
||||
Aggregate only first NUMBER functions; 0=infinity (default 0)
|
||||
|
||||
=item -p PID
|
||||
|
||||
Process ID of the process to trace; overrides -b
|
||||
|
||||
=item -s SLEEPTIME
|
||||
|
||||
Number of seconds to sleep between iterations (default 0)
|
||||
|
||||
=back
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-pmp ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Perl, DBI, DBD::mysql, and some core packages that ought to be
|
||||
installed in any reasonably new version of Perl.
|
||||
This tool requires Bash v3 or newer.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -262,6 +270,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz, based on a script by Domas Mituzas (L<http://poormansprofiler.org/>)
|
||||
|
54
bin/pt-rel
54
bin/pt-rel
@@ -53,7 +53,6 @@ while ( my $line = <$fh> ) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
close $fh or warn "Cannot close $file: $OS_ERROR";
|
||||
exit;
|
||||
|
||||
@@ -61,14 +60,17 @@ exit;
|
||||
|
||||
=head1 NAME
|
||||
|
||||
rel - Make each number in a line of text relative to the previous matching line.
|
||||
pt-rel - Relativize values to previous matching lines.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Given a file with some lines of text that follow a repeated pattern, including
|
||||
numbers,
|
||||
Usage: pt-rel [FILES]
|
||||
|
||||
rel /path/to/file.txt
|
||||
pt-rel matches lines and subtracts the value of the previous line's values
|
||||
from the current line's values. The lines must be text with numeric values
|
||||
that repeat, varying only the values.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
For example, if the text is this:
|
||||
|
||||
@@ -77,30 +79,20 @@ For example, if the text is this:
|
||||
Mutex spin waits 0, rounds 99591465498, OS waits 437698122
|
||||
RW-shared spins 834352175, OS waits 20259032; RW-excl spins 1769762980
|
||||
|
||||
The output will be
|
||||
Then the output will be:
|
||||
|
||||
Mutex spin waits 0, rounds 99584819933, OS waits 437663963
|
||||
RW-shared spins 834337527, OS waits 20258150; RW-excl spins 1769749834
|
||||
Mutex spin waits 0, rounds 6645565, OS waits 34159
|
||||
RW-shared spins 14648, OS waits 882; RW-excl spins 13146
|
||||
|
||||
=head1 DOWNLOADING
|
||||
The first values (line 1) for "Mutex spin waits", "rounds", and "OS waits"
|
||||
were subtracted from the second values (line 3); the same happened for values
|
||||
from lines 2 and 4.
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
=head1 OPTIONS
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
This tool does not have any command-line options.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
@@ -114,7 +106,7 @@ of output.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Bash.
|
||||
This tool requires Perl v5.8 or newer.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -140,6 +132,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
125
bin/pt-sift
125
bin/pt-sift
@@ -4,6 +4,15 @@
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
# notices and disclaimers.
|
||||
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}" >&2
|
||||
fi
|
||||
echo "Usage: pt-sift FILE|PREFIX|DIRECTORY" >&2
|
||||
echo "For more information, 'man pt-sift' or 'perldoc $0'." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Show current help and settings
|
||||
print_help() {
|
||||
cat <<-HELP
|
||||
@@ -23,19 +32,6 @@ print_help() {
|
||||
HELP
|
||||
}
|
||||
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}"
|
||||
fi
|
||||
cat <<-USAGE
|
||||
Usage: $0 [OPTIONS] [FILE|PREFIX|DIRECTORY]
|
||||
$0 helps you browse the files written by the collect tool.
|
||||
If you specify a FILE or PREFIX, it browses only files with that prefix. If you
|
||||
specify a DIRECTORY, then it browses all files within that directory.
|
||||
USAGE
|
||||
exit 1
|
||||
}
|
||||
|
||||
# The main code that runs by default. Arguments are the command-line options.
|
||||
main() {
|
||||
|
||||
@@ -55,7 +51,7 @@ main() {
|
||||
fi
|
||||
|
||||
# If the programs we need don't exist, try to get them.
|
||||
for prog in align diskstats pmp mext; do
|
||||
for prog in pt-align pt-diskstats pt-pmp pt-mext; do
|
||||
if which $prog >/dev/null 2>&1 ; then
|
||||
eval "PR_$prog"="$(which $prog)"
|
||||
elif [ -f $prog -a -x $prog ]; then
|
||||
@@ -64,7 +60,7 @@ main() {
|
||||
eval "PR_$prog"="${BASEDIR}/$prog"
|
||||
else
|
||||
echo "Fetching $prog"
|
||||
curl http://aspersa.googlecode.com/svn/trunk/$prog > "$prog" && chmod +x "$prog"
|
||||
curl http://percona.com/get/$prog > "$prog" && chmod +x "$prog"
|
||||
eval "PR_$prog"="./$prog"
|
||||
fi
|
||||
done
|
||||
@@ -471,47 +467,86 @@ fi
|
||||
|
||||
=head1 NAME
|
||||
|
||||
pt-sift - Browses the files created by the collect tool.
|
||||
pt-sift - Browses files created by pt-collect.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-sift [OPTION...]
|
||||
Usage: pt-sift FILE|PREFIX|DIRECTORY
|
||||
|
||||
pt-sift browses the files created by L<pt-collect>. If you specify a
|
||||
FILE or PREFIX, it browses only files with that prefix. If you specify a
|
||||
DIRECTORY, then it browses all files within that directory.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
pt-sift browses the files created by the collect tool.
|
||||
pt-sift downloads other tools that it might need, such as L<pt-diskstats>,
|
||||
and then makes a list of the unique timestamp prefixes of all the files in
|
||||
the directory, as written by the L<pt-collect> tool. If the user specified
|
||||
a timestamp on the command line, then it begins with that sample of data;
|
||||
otherwise it begins by showing a list of the timestamps and prompting for
|
||||
a selection. Thereafter, it displays a summary of the selected sample, and
|
||||
the user can navigate and inspect with keystrokes. The keystroke commands
|
||||
you can use are as follows:
|
||||
|
||||
=head1 DOWNLOADING
|
||||
=over
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
=item d
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
Sets the action to start the L<pt-diskstats> tool on the sample's disk
|
||||
performance statistics.
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
=item i
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
Sets the action to view the first INNODB STATUS sample in less.
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
=item m
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
Displays the first 4 samples of SHOW STATUS counters side by side with the
|
||||
L<pt-mext> tool.
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
=item n
|
||||
|
||||
Summarizes the first sample of netstat data in two ways: by originating host,
|
||||
and by connection state.
|
||||
|
||||
=item j
|
||||
|
||||
Select the next timestamp as the active sample.
|
||||
|
||||
=item k
|
||||
|
||||
Select the previous timestamp as the active sample.
|
||||
|
||||
=item q
|
||||
|
||||
Quit the program.
|
||||
|
||||
=item 1
|
||||
|
||||
Sets the action for each sample to the default, which is to view a summary
|
||||
of the sample.
|
||||
|
||||
=item 0
|
||||
|
||||
Sets the action to just list the files in the sample.
|
||||
|
||||
=item *
|
||||
|
||||
Sets the action to view all of the samples's files in the less program.
|
||||
|
||||
=back
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
This tool does not have any command-line options.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-sift ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Bash.
|
||||
This tool requires Bash v3 or newer.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -537,6 +572,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
171
bin/pt-stalk
171
bin/pt-stalk
@@ -51,7 +51,7 @@ MAYBE_EMPTY=${MAYBE_EMPTY:-no}
|
||||
|
||||
# This is the location of the 'collect' script.
|
||||
if [ -z "${COLLECT}" ]; then
|
||||
COLLECT="${HOME}/bin/collect";
|
||||
COLLECT="${HOME}/bin/pt-collect";
|
||||
fi
|
||||
|
||||
# This is where to store the collected data.
|
||||
@@ -167,52 +167,155 @@ done
|
||||
|
||||
=head1 NAME
|
||||
|
||||
pt-stalk - Watch MySQL and run the 'collect' program when some condition becomes true.
|
||||
pt-stalk - Wait for a condition to occur then begin collecting data.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-stalk [OPTION...]
|
||||
Usage: pt-stalk
|
||||
|
||||
pt-stalk watches for a condition to become true, and when it does, executes
|
||||
a script. By default it executes L<pt-collect>, but that can be customized.
|
||||
This tool is useful for gathering diagnostic data when an infrequent event
|
||||
occurs, so an expert person can review the data later.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
By default, it watches for a too-many-connections condition.
|
||||
This is a good script to run in a screen session. It's separate from the
|
||||
'collect' script because that lets you change 'collect' without stopping
|
||||
and restarting this one.
|
||||
Although pt-stalk comes pre-configured to do a specific thing, in general
|
||||
this tool is just a skeleton script for the following flow of actions:
|
||||
|
||||
=over
|
||||
|
||||
=item 1.
|
||||
|
||||
Loop infinitely, sleeping between iterations.
|
||||
|
||||
=item 2.
|
||||
|
||||
In each iteration, run some command and get the output.
|
||||
|
||||
=item 3.
|
||||
|
||||
If the command fails or the output is larger than the threshold,
|
||||
execute the collection script; but do not execute if the destination disk
|
||||
is too full.
|
||||
|
||||
=back
|
||||
|
||||
By default, the tool is configured to execute mysqladmin extended-status and
|
||||
extract the value of the Threads_connected variable; if this is greater than
|
||||
100, it runs the collection script. This is really just placeholder code,
|
||||
and almost certainly needs to be customized!
|
||||
|
||||
If the tool does execute the collection script, it will wait for a while
|
||||
before checking and executing again. This is to prevent a continuous
|
||||
condition from causing a huge number of executions to fire off.
|
||||
|
||||
The name 'stalk' is because 'watch' is already taken, and 'stalk' is fun.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
=head1 CONFIGURING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
If the file F<pt-stalk.conf> exists in the current working directory, then
|
||||
L<"ENVIRONMENT"> variables are imported from it. For example, the config
|
||||
file has the format:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
INTERVAL=10
|
||||
GDB=yes
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
See L<"ENVIRONMENT">.
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
=head1 OPTIONS
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
This tool does not have any command-line options, but see
|
||||
L<"ENVIRONMENT"> and L<"CONFIGURING">.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
The following environment variables configure how, what, and when the tool
|
||||
runs. They are all optional and can be specified either on the command line
|
||||
or in the F<pt-stalk.conf> config file (see L<"CONFIGURING">).
|
||||
|
||||
PTDEBUG=1 pt-stalk ... > FILE 2>&1
|
||||
=over
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
=item THRESHOLD (default 100)
|
||||
|
||||
This is the max number of <whatever> we want to tolerate.
|
||||
|
||||
=item VARIABLE (default Threads_connected}
|
||||
|
||||
This is the thing to check for.
|
||||
|
||||
=item CYCLES (default 1)
|
||||
|
||||
How many times must the condition be met before the script will fire?
|
||||
|
||||
=item GDB (default no)
|
||||
|
||||
Collect GDB stacktraces?
|
||||
|
||||
=item OPROFILE (default yes)
|
||||
|
||||
Collect oprofile data?
|
||||
|
||||
=item STRACE (default no)
|
||||
|
||||
Collect strace data?
|
||||
|
||||
=item TCPDUMP (default yes)
|
||||
|
||||
Collect tcpdump data?
|
||||
|
||||
=item EMAIL
|
||||
|
||||
Send mail to this list of addresses when the script triggers.
|
||||
|
||||
=item MYSQLOPTIONS
|
||||
|
||||
Any options to pass to mysql/mysqladmin, such as -u, -p, etc
|
||||
|
||||
=item INTERVAL (default 30)
|
||||
|
||||
This is the interval between checks.
|
||||
|
||||
=item MAYBE_EMPTY (default no)
|
||||
|
||||
If the command you're running to detect the condition is allowed to return
|
||||
nothing (e.g. a grep line that might not even exist if there's no problem),
|
||||
then set this to "yes".
|
||||
|
||||
=item COLLECT (default ${HOME}/bin/pt-collect)
|
||||
|
||||
This is the location of the 'collect' script.
|
||||
|
||||
=item DEST (default ${HOME}/collected/)
|
||||
|
||||
This is where to store the collected data.
|
||||
|
||||
=item DURATION (default 30)
|
||||
|
||||
How long to collect statistics data for? Make sure that this isn't longer
|
||||
than SLEEP.
|
||||
|
||||
=item SLEEP (default DURATION * 10)
|
||||
|
||||
How long to sleep after collecting?
|
||||
|
||||
=item PCT_THRESHOLD (default 95)
|
||||
|
||||
Bail out if the disk is more than this %full.
|
||||
|
||||
=item MB_THRESHOLD (default 100)
|
||||
|
||||
Bail out if the disk has less than this many MB free.
|
||||
|
||||
=item PURGE (default 30)
|
||||
|
||||
Remove samples after this many days.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Bash.
|
||||
This tool requires Bash v3 or newer.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -238,6 +341,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz, Justin Swanhart, and Fernando Ipar
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
#!/bin/sh
|
||||
|
||||
# This program is part of Percona Toolkit: http://www.percona.com/software/
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
@@ -1187,53 +1187,46 @@ pt-summary - Summarize system information in a nice way.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-collect [OPTION...]
|
||||
Usage: pt-summary
|
||||
|
||||
pt-summary conveniently summarizes the status and configuration of a server.
|
||||
It is not a tuning tool or diagnosis tool. It produces a report that is easy
|
||||
to diff and can be pasted into emails without losing the formatting. This
|
||||
tool works well on Linux systems.
|
||||
|
||||
Download and run:
|
||||
|
||||
wget http://aspersa.googlecode.com/svn/trunk/summary
|
||||
bash ./summary
|
||||
|
||||
Download and run in a single step:
|
||||
|
||||
wget -O- http://aspersa.googlecode.com/svn/trunk/summary | bash
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Goals: work well on Linux; create a compact diff-able report that is
|
||||
easy to paste into a wiki or email, and easy to scan and compare too.
|
||||
pt-summary runs a large variety of commands to inspect system status and
|
||||
configuration, saves the output into files in /tmp, and then runs Unix
|
||||
commands on these results to format them nicely. It works best when
|
||||
executed as a privileged user, but will also work without privileges,
|
||||
although some output might not be possible to generate without root.
|
||||
|
||||
Usage: $ wget -O- http://aspersa.googlecode.com/svn/trunk/summary |bash
|
||||
Options are set through the ASPERSA_SKIP environment variable. Set this
|
||||
variable to a comma-separated list of things you want to omit.
|
||||
=head1 OPTIONS
|
||||
|
||||
This tool does not have any command-line options.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The ASPERSA_SKIP environment variable specifies a comma-separated list
|
||||
of things to skip:
|
||||
|
||||
Options:
|
||||
MOUNT: Don't print out mounted filesystems and disk fullness.
|
||||
NETWORK: Don't print out information on network controllers & config.
|
||||
PROCESS: Don't print out top processes and vmstat information.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-summary ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Bash.
|
||||
This tool requires the Bourne shell (F</bin/sh>).
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -1259,6 +1252,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz and Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
|
118
bin/pt-usl
118
bin/pt-usl
@@ -4,43 +4,12 @@
|
||||
# See "COPYRIGHT, LICENSE, AND WARRANTY" at the end of this file for legal
|
||||
# notices and disclaimers.
|
||||
|
||||
# Print a usage message and exit.
|
||||
usage() {
|
||||
if [ "${OPT_ERR}" ]; then
|
||||
echo "${OPT_ERR}"
|
||||
echo "${OPT_ERR}" >&2
|
||||
fi
|
||||
cat <<-EOF
|
||||
Usage: $0 [OPTIONS] FILE [FILE...]
|
||||
$0 performs Universal Scalability Law modelling.
|
||||
It expects as input a file with columns N (load; concurrency; independentvar)
|
||||
and C (throughput). The file may contain comment lines beginning with the #
|
||||
character. The tool outputs .png images with the deviation, efficiency,
|
||||
residuals, and model-vs-actual data. It also prints out information from the
|
||||
process of fitting the curve to the data, such as gnuplot's error estimates.
|
||||
Options:
|
||||
-a Set X-axis label to 'node count' (default is concurrency).
|
||||
-c CONVERSION Converts the input file into N-vs-C format as specified:
|
||||
globalstatus Convert from MySQL's SHOW GLOBAL STATUS
|
||||
tcpdump Convert from 'tcpdump -tttt -nnq' format
|
||||
-d Don't delete the gnuplot files used to generate the charts.
|
||||
-e Draw error lines on the final plot.
|
||||
-i INTERVAL When -c is given, group the input into -i second intervals.
|
||||
-k KEEPFILE Save the N-vs-C data in the specified file.
|
||||
-l LIMIT X-axis limit for the final plot.
|
||||
-L COLOR The color for plotting points (default lt rgb "#8B0000").
|
||||
-m THREADS When -c is given, max valid value of N, to filter outliers.
|
||||
-n ADJUSTMENT Adjust the N variable downwards to compensate for known
|
||||
errors such as error of observation.
|
||||
-o ONLY Only produce plots specified in this comma-separated list.
|
||||
-p PREFIX Prefix for the generated image file names.
|
||||
-P PORT TCP port for when -c tcpdump is used (default 3306).
|
||||
-r Render pdf and eps plots in color.
|
||||
-R Don't re-fit the data; use the results from quadratic fit.
|
||||
-t FILETYPE Type for the image files (png, pdf, eps).
|
||||
-T POINTTYPE Point-type and options for the plots (default 6).
|
||||
-x ADJUSTMENT Multiply the C(1) regression parameter by this factor.
|
||||
-X Include C(1) as a fit parameter for USL regression.
|
||||
EOF
|
||||
echo "Usage: pt-usl [OPTIONS] [FILES]" >&2
|
||||
echo "For more information, 'man pt-usl' or 'perldoc $0'." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -777,12 +746,45 @@ pt-usl - Model Universal Scalability Law.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage: pt-usl [OPTION...]
|
||||
Usage: pt-usl [OPTIONS] [FILES]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This tool is based on Neil Gunther's book Guerrilla Capacity Planning.
|
||||
|
||||
It expects as input a file with columns N (load; concurrency; independentvar)
|
||||
and C (throughput). The file may contain comment lines beginning with the #
|
||||
character. The tool outputs .png images with the deviation, efficiency,
|
||||
residuals, and model-vs-actual data. It also prints out information from the
|
||||
process of fitting the curve to the data, such as gnuplot's error estimates.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
Options must precede files on the command line.
|
||||
|
||||
-a Set X-axis label to 'node count' (default is concurrency).
|
||||
-c CONVERSION Converts the input file into N-vs-C format as specified:
|
||||
globalstatus Convert from MySQL's SHOW GLOBAL STATUS
|
||||
tcpdump Convert from 'tcpdump -tttt -nnq' format
|
||||
-d Don't delete the gnuplot files used to generate the charts.
|
||||
-e Draw error lines on the final plot.
|
||||
-i INTERVAL When -c is given, group the input into -i second intervals.
|
||||
-k KEEPFILE Save the N-vs-C data in the specified file.
|
||||
-l LIMIT X-axis limit for the final plot.
|
||||
-L COLOR The color for plotting points (default lt rgb "#8B0000").
|
||||
-m THREADS When -c is given, max valid value of N, to filter outliers.
|
||||
-n ADJUSTMENT Adjust the N variable downwards to compensate for known
|
||||
errors such as error of observation.
|
||||
-o ONLY Only produce plots specified in this comma-separated list.
|
||||
-p PREFIX Prefix for the generated image file names.
|
||||
-P PORT TCP port for when -c tcpdump is used (default 3306).
|
||||
-r Render pdf and eps plots in color.
|
||||
-R Don't re-fit the data; use the results from quadratic fit.
|
||||
-t FILETYPE Type for the image files (png, pdf, eps).
|
||||
-T POINTTYPE Point-type and options for the plots (default 6).
|
||||
-x ADJUSTMENT Multiply the C(1) regression parameter by this factor.
|
||||
-X Include C(1) as a fit parameter for USL regression.
|
||||
|
||||
=head1 TODO
|
||||
|
||||
* Need to make it optionally make logarithmic X axis graph. Also, apply
|
||||
@@ -794,37 +796,13 @@ This tool is based on Neil Gunther's book Guerrilla Capacity Planning.
|
||||
other samples; it will introduce skew into the throughput for that sample,
|
||||
too.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 ENVIRONMENT
|
||||
|
||||
The environment variable C<PTDEBUG> enables verbose debugging output to STDERR.
|
||||
To enable debugging and capture all output to a file, run the tool like:
|
||||
|
||||
PTDEBUG=1 pt-usl ... > FILE 2>&1
|
||||
|
||||
Be careful: debugging output is voluminous and can generate several megabytes
|
||||
of output.
|
||||
This tool does not use any environment variables.
|
||||
|
||||
=head1 SYSTEM REQUIREMENTS
|
||||
|
||||
You need Bash.
|
||||
This tool requires Bash v3 or newer and gnuplot.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
@@ -850,6 +828,24 @@ Include the following information in your bug report:
|
||||
If possible, include debugging output by running the tool with C<PTDEBUG>;
|
||||
see L<"ENVIRONMENT">.
|
||||
|
||||
=head1 DOWNLOADING
|
||||
|
||||
Visit L<http://www.percona.com/software/percona-toolkit/> to download the
|
||||
latest release of Percona Toolkit. Or, get the latest release from the
|
||||
command line:
|
||||
|
||||
wget percona.com/get/percona-toolkit.tar.gz
|
||||
|
||||
wget percona.com/get/percona-toolkit.rpm
|
||||
|
||||
wget percona.com/get/percona-toolkit.deb
|
||||
|
||||
You can also get individual tools from the latest release:
|
||||
|
||||
wget percona.com/get/TOOL
|
||||
|
||||
Replace C<TOOL> with the name of any tool.
|
||||
|
||||
=head1 AUTHORS
|
||||
|
||||
Baron Schwartz
|
||||
|
Reference in New Issue
Block a user