pt-pmp有两方面的作用:一是获取进程的堆栈信息,二是对这些堆栈信息进行汇总。
进程的堆栈信息是利用gdb获取的,所以在获取的过程中,会对mysql服务端的性能有一定的影响。
用官方的话说:
This will freeze the program for some period of time, ranging from a second or so to much longer on very busy systems with a lot of memory and many threads in the program. In addition to freezing the server, there is also some risk of the server crashing or performing badly after GDB detaches from it.
pt-pmp脚本本身是用shell写的,用法也比较简单,唯一的要求是服务器上已安装gdb包。
不然会报如下错误:
[root@localhost ~]# pt-pmp --binary mysqld
Sat Oct :: CST
/usr/local/bin/pt-pmp: line : gdb: command not found
下面看看其具体参数
--binary
指定分析的进程名,如果不指定,则默认是mysqld,从这个参数可以看出,pt-pmp不仅仅适用于mysqld。
short form: -b; type: string; default: mysqld
Which binary to trace.
--help
Show help and exit.
--interval
迭代时间之间的间隔,从源代码也可以看出
for x in $(_seq $OPT_ITERATIONS); do
gdb -ex "set pagination 0" \
-ex "thread apply all bt" \
-batch \
-p $OPT_PID \
>> "$output_file"
date +'TS %N.%s %F %T' >> "$output_file"
sleep $OPT_INTERVAL
done
$OPT_ITERATIONS是下面--iterations参数,而$OPT_INTERVAL即sleep的时间。
short form: -s; type: int; default:
Number of seconds to sleep between --iterations.
--iterations
从上面的源代码可以看出,所谓的迭代其实就是执行gdb命令的次数
short form: -i; type: int; default:
How many traces to gather and aggregate.
--lines
指定打印汇总后每一个分类中的头几个函数。
譬如原始汇总信息如下:
# pt-pmp .txt
poll(libc.so.),vio_io_wait(viosocket.c:),vio_socket_io_wait(viosocket.c:),vio_read(viosocket.c:),net_read_raw_loop(net_serv.cc:),net_read_packet_header(net_serv.cc:),net_read_packet(net_serv.cc:),my_net_read(net_serv.cc:),do_command(sql_parse.cc:),do_handle_one_connection(sql_connect.cc:),handle_one_connection(sql_connect.cc:),pfs_spawn_thread(pfs.cc:),start_thread(libpthread.so.),clone(libc.so.)
libaio::??(libaio.so.),os_aio_linux_collect(os0file.cc:),os_aio_linux_handle(os0file.cc:),fil_aio_wait(fil0fil.cc:),io_handler_thread(srv0start.cc:),start_thread(libpthread.so.),clone(libc.so.)
poll(libc.so.),vio_io_wait,vio_socket_io_wait,vio_read,net_read_raw_loop,net_read_packet,my_net_read,do_command,do_handle_one_connection,handle_one_connection,pfs_spawn_thread,start_thread(libpthread.so.),clone(libc.so.)
...
如果指定--line参数,则输出如下:
# pt-pmp --lines .txt
poll(libc.so.),vio_io_wait(viosocket.c:)
libaio::??(libaio.so.),os_aio_linux_collect(os0file.cc:)
poll(libc.so.),vio_io_wait
short form: -l; type: int; default:
Aggregate only first specified number of many functions; =infinity.
--pid
指定进程的pid,该参数会覆盖--binary参数。
short form: -p; type: int
Process ID of the process to trace; overrides --binary.
--save-samples
是否将gdb获取的原始堆栈信息(注意,没有汇总)保存在文件中。
short form: -k; type: string
Keep the raw traces in this file after aggregation.
--version
Show version and exit.
所以,总结其可用用法如下:
1. 汇总pstack获取的结果
# ps -ef |grep mysqld
# pstack 10230 > 10230.info
# pt-pmp 10230.info
2. 直接根据进程名汇总堆栈信息
# pt-pmp --binary mysqld
3. 上述命令只是一次迭代的结果,如果要迭代多次,且每次相隔1s,可指定如下:
# pt-pmp --binary mysqld --iterations 2 --interval 1
4. 如果要同时保留汇总前的堆栈信息,可指定--save-samples参数
# pt-pmp --binary sshd --save-samples sshd.txt