博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pt-pmp
阅读量:6593 次
发布时间:2019-06-24

本文共 3226 字,大约阅读时间需要 10 分钟。

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 mysqldSat Oct 29 17:32:34 CST 2016/usr/local/bin/pt-pmp: line 663: gdb: command not found

 

下面看看其具体参数

--binary

指定分析的进程名,如果不指定,则默认是mysqld,从这个参数可以看出,pt-pmp不仅仅适用于mysqld。

short form: -b; type: string; default: mysqldWhich 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: 0Number of seconds to sleep between --iterations.

 

 --iterations

从上面的源代码可以看出,所谓的迭代其实就是执行gdb命令的次数

short form: -i; type: int; default: 1How many traces to gather and aggregate.

 

--lines

指定打印汇总后每一个分类中的头几个函数。

譬如原始汇总信息如下:

# pt-pmp 1.txt    1928 poll(libc.so.6),vio_io_wait(viosocket.c:771),vio_socket_io_wait(viosocket.c:68),vio_read(viosocket.c:123),net_read_raw_loop(net_serv.cc:669),net_read_packet_header(net_serv.cc:751),net_read_packet(net_serv.cc:751),my_net_read(net_serv.cc:894),do_command(sql_parse.cc:969),do_handle_one_connection(sql_connect.cc:982),handle_one_connection(sql_connect.cc:898),pfs_spawn_thread(pfs.cc:1860),start_thread(libpthread.so.0),clone(libc.so.6)        80 libaio::??(libaio.so.1),os_aio_linux_collect(os0file.cc:4977),os_aio_linux_handle(os0file.cc:4977),fil_aio_wait(fil0fil.cc:5809),io_handler_thread(srv0start.cc:492),start_thread(libpthread.so.0),clone(libc.so.6)        69 poll(libc.so.6),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.0),clone(libc.so.6)    ...

如果指定--line参数,则输出如下:

# pt-pmp --lines 2 1.txt    1928 poll(libc.so.6),vio_io_wait(viosocket.c:771)   80 libaio::??(libaio.so.1),os_aio_linux_collect(os0file.cc:4977)   69 poll(libc.so.6),vio_io_wait

 

short form: -l; type: int; default: 0Aggregate only first specified number of many functions; 0=infinity.

 

--pid

指定进程的pid,该参数会覆盖--binary参数。

short form: -p; type: intProcess ID of the process to trace; overrides --binary.

 

--save-samples

是否将gdb获取的原始堆栈信息(注意,没有汇总)保存在文件中。

short form: -k; type: stringKeep 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

   

   

转载地址:http://aedio.baihongyu.com/

你可能感兴趣的文章
3.Knockout.Js(属性绑定)
查看>>
v140平台工具集与v110工具集选择
查看>>
EF6+Sqlite连接字符串的动态设置
查看>>
下拉加载更多
查看>>
SQL SERVER 2012 只能识别20个CPU的问题
查看>>
设计模式(十)外观模式
查看>>
ASP开发基础
查看>>
LVM自动扩容
查看>>
如何写出兼容大部分浏览器的CSS 代码
查看>>
第二阶段冲刺第八天,6月7日。
查看>>
struts2 action 返回类型分析
查看>>
【原创】FPGA开发手记(三) PS/2键盘
查看>>
linux统计多个文件大小总和
查看>>
JS常见的字符串操作
查看>>
JAVA中的编码分析
查看>>
查看源代码Source not found及在eclipse中配置jdk的src.zip源代码
查看>>
uniGUI试用笔记(二)
查看>>
HOG特征-理解篇
查看>>
Microsoft.AlphaImageLoader滤镜解说
查看>>
extjs_02_grid(显示本地数据,显示跨域数据)
查看>>