博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用strace+pstack利器分析程序性能
阅读量:7192 次
发布时间:2019-06-29

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

hot3.png

引言

有时我们需要对程序进行优化、减少程序响应时间。除了一段段地对代码进行时间复杂度分析,我们还有更便捷的方法吗?

若能直接找到影响程序运行时间的函数调用,再有针对地对相关函数进行代码分析和优化,那相比漫无目的地看代码,效率就高多了。
将strace和pstack工具结合起来使用,就可以达到以上目的。strace跟踪程序使用的底层系统调用,可输出系统调用被执行的时间点以及各个调用耗时;pstack工具对指定PID的进程输出函数调用栈。
下面我们通过一个简单的消息收发程序,说明使用strace、pstack进行程序分析的具体方法。

strace查看系统调用

首先我们拉起server/client程序,并使用对server进程进行跟踪:

# ps -elf | grep server | grep -v grep0 S root 16739 22642 0 76 0 - 634 1024 14:26 pts/2 00:00:00 ./server# strace -o server.strace -Ttt -p 16739Process 16739 attached - interrupt to quit

 

稍等一段时间之后,我们将strace停掉, server.strace文件中有以下输出:

复制代码

14:46:39.741366 select(8, [3 4], NULL, NULL, {1, 0}) = 1 (in [4], left {0, 1648}) <0.998415>14:46:40.739965 recvfrom(4, "hello", 6, 0, NULL, NULL) = 5 <0.000068>14:46:40.740241 write(1, "hello\n", 6)  = 6 <0.000066>14:46:40.740414 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 <0.000046>14:46:40.740565 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 <0.000048>14:46:40.740715 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000046>14:46:40.740853 nanosleep({1, 0}, {1, 0}) = 0 <1.000276>14:46:41.741284 sendto(4, "hello\0", 6, 0, NULL, 0) = 6 <0.000111>

可以看到server接收数据之后(对应recvfrom调用),经过1s左右时间将消息发出(对应sendto调用),从响应时间看,与抓包的结果吻合。又可以看出nanosleep系统调用耗费了1s时间。

因而可以断定响应延时由nanosleep对应的函数调用造成。
那具体是哪一个函数调用呢?在strace输出结果中并不能找到答案,因其输出显示都是系统调用,要显示程序中函数调用栈信息,就轮到pstack上场了。

 

pstack查看函数堆栈

pstack是一个脚本工具,其核心实现就是使用了gdb以及thread apply all bt命令,下面我们使用pstack查看server进程函数堆栈:

# sh pstack.sh 16739#0 0x00002ba1f8152650 in __nanosleep_nocancel () from /lib64/libc.so.6#1 0x00002ba1f8152489 in sleep () from /lib64/libc.so.6#2 0x00000000004007bb in ha_ha ()#3 0x0000000000400a53 in main ()

从以上信息可以看出,函数调用关系为:main->ha_ha->sleep,因而我们可以找到ha_ha函数进行分析和优化修改。
小结
本文通过一个server/client程序事例,说明了使用strace和pstack分析响应延时的方法。

由最初server端响应慢现象,到使用strace跟踪出具体耗时的系统调用,再到使用pstack查到程序中具体的耗时函数,一步步找到了影响程序运行时间的程序代码。

更多地了解底层,从操作系统层面着手,更有助于程序性能分析与优化。

转载于:https://my.oschina.net/u/347414/blog/823055

你可能感兴趣的文章
安装配置rabbitmq
查看>>
linux服务器运维 -- 路线、架构
查看>>
Sqoop数据分析引擎安装与使用
查看>>
polysh批量执行shell命令
查看>>
如何使用GNS3和Cisco IOU搭建路由交换实验-IOU篇
查看>>
keepalived 多实例
查看>>
mysql部分参数注解
查看>>
***PHP Notice: Undefined index: ..问题的解决方法
查看>>
php模块安装
查看>>
Python3.2 --- Print函数用法
查看>>
ssh免密码登录 rsh rcp部署
查看>>
RHEL7普通权限、特殊权限、acl的设置
查看>>
Centos6.6安装选包及基础场景说明
查看>>
修改kvm虚拟机的root密码和其他用户密码
查看>>
在C#中实现截获shell程序的输出
查看>>
七年之“养”【我与51CTO一“七”成长】
查看>>
互联网时代还要不要读报纸杂志、看电视?
查看>>
Flash CS3 中改变组件的样式
查看>>
python中pickle使用学习-字典小程序函数化
查看>>
闲谈IPv6-现状和过渡
查看>>