Copy and format for POD docu from Aspersa User's Manual to forked Aspersa tools.

This commit is contained in:
Daniel Nichter
2011-07-22 12:35:18 -06:00
parent 7108054565
commit d0580626a8
11 changed files with 957 additions and 525 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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/>)

View File

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

View File

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

View File

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

View File

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

View File

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