如何使用strace+pstack利器分析程序性能

如何使用strace+pstack利器分析程序性能

2023年7月23日发(作者:)

如何使⽤strace+pstack利器分析程序性能引⾔有时我们需要对程序进⾏优化、减少程序响应时间。除了⼀段段地对代码进⾏时间复杂度分析,我们还有更便捷的⽅法吗?若能直接找到影响程序运⾏时间的函数调⽤,再有针对地对相关函数进⾏代码分析和优化,那相⽐漫⽆⽬的地看代码,效率就⾼多了。将strace和pstack⼯具结合起来使⽤,就可以达到以上⽬的。strace跟踪程序使⽤的底层系统调⽤,可输出系统调⽤被执⾏的时间点以及各个调⽤耗时;pstack⼯具对指定PID的进程输出函数调⽤栈。下⾯我们通过⼀个简单的消息收发程序,说明使⽤strace、pstack进⾏程序分析的具体⽅法。程序说明该程序是⼀个简单的socket程序,由server/client组成。server端监听某端⼝,等待client的连接,client连接server后定时向server发送消息,server每接收⼀条消息后向client发送响应消息。程序server与client交互如下图⽰:在程序运⾏起来之后,发现server接收到client的submit消息之后,需要较长时间才发出resp响应。通过tcpdump抓包发现,time2与time1的时间间隔在1s左右:由上初步分析可知,消息响应慢是server端程序问题。下⾯我们来看如何使⽤strace和pstack分析server端程序响应慢的原因。

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 -Ttt -p 16739Process 16739 attached - interrupt to quit

稍等⼀段时间之后,我们将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, "hellon", 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, "hello0", 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 16739#0 0x00002ba1f8152650 in __nanosleep_nocancel () from /lib64/.6#1 0x00002ba1f8152489 in sleep () from /lib64/.6#2 0x07bb in ha_ha ()#3 0x0a53 in main ()从以上信息可以看出,函数调⽤关系为:main->ha_ha->sleep,因⽽我们可以找到ha_ha函数进⾏分析和优化修改。⼩结本⽂通过⼀个server/client程序事例,说明了使⽤strace和pstack分析响应延时的⽅法。由最初server端响应慢现象,到使⽤strace跟踪出具体耗时的系统调⽤,再到使⽤pstack查到程序中具体的耗时函数,⼀步步找到了影响程序运⾏时间的程序代码。更多地了解底层,从操作系统层⾯着⼿,更有助于程序性能分析与优化。

本⽂中使⽤的server/client程序和pstack脚本可从下载。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690106903a306318.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信