solaris 操作系统提供了 pstack 工具,用来打印运行程序的线程堆栈信息。redhat 公司发行的linux操作系统(rhel,centos等等) 也提供了pstack工具,只要按照 gbd:
yum install gdb
由于通过 pstack 获得的是快照形式的信息,因此不能判定是否一直是相同的状态。为了调查是否是相同的状态,需要同时 使用事件记录形式的工具来确认。
另外,因为是从OS层面看到的调用栈,所以可能会与应用程序端调用的函数名有所差异
一般来说,pstack 的负载 较低,很少会导致性能下降。
另外,通过pstack 知道函数名后,对于自己编写的程序,就能一边检查源代码,一边调查在哪个函数上耗费了时间。另一方面,很多时候外部产品的函数名
是非公开的,没办法对其进行调查。不过,调用栈上显示的OS的函数能在网上查到,可以对其进行调查
[root@localhost ~]# pstack 1372
#0 0x00007f01af75117c in waitpid () from /lib64/libc.so.6
#1 0x0000000000440b24 in waitchld.isra.10 ()
#2 0x0000000000441ddc in wait_for ()
#3 0x0000000000433aae in execute_command_internal ()
#4 0x0000000000433cce in execute_command ()
#5 0x000000000041e305 in reader_loop ()
#6 0x000000000041c96e in main ()
strace 是 使用 使用事件记录的形式,从OS看到的某个进程的系统调用信息,能知道在等待哪个系统调用,OS的哪个函数比较耗时
,注意在没有其他办法的时候才使用strace。如果要对外部产品使用strace,请先和该产品的支持部门确认一下。
因为strace 的负载很高,建议在测试环境下再现故障之后再使用。在生产环境中,请在确认允许处理之后再使用。此外,使用strace
分析性能故障的时候,请注意strace自身也会导致速度变慢
[root@localhost ~]# strace -p 1372
strace: Process 1372 attached
wait4(-1
通过 -o 选项,可以 输出 到指定文件
下面是 将 cat 命令 内部调用 记录 输入到bbb中
strace -o bbb cat aaa.txt
使用 -c 命令 可以 报告 执行 一个命令 每个系统调用 在内核 中 消耗时间的统计
[root@izm5efwaqhukrqgsmh2vw4z local]# strace -c cat aaa.txt
sse
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
58.14 0.000025 4 6 close
41.86 0.000018 6 3 read
0.00 0.000000 0 1 write
0.00 0.000000 0 4 open
0.00 0.000000 0 5 fstat
0.00 0.000000 0 8 mmap
0.00 0.000000 0 4 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 4 brk
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 1 fadvise64
------ ----------- ----------- --------- --------- ----------------
100.00 0.000043 40 1 total