当我运行我的程序时,“top”报告说我在“sy”(内核空间)上花费了 30+%。
我怎样才能获得有关此的更多信息?什么系统调用一直在消耗等等。
感谢回复者:
听起来 Devel::NYTProf 非常适合分析整个程序——但我在 Amazon Linux 上安装它时遇到了麻烦。
如果我只想要系统调用的快照,strace 似乎很棒。
更新:我这样做了,系统调用所花费的时间实际上可以忽略不计。我最好的猜测是线程卡在等待某些资源上。下面的答案仍然很好,但任何建议都会有所帮助。
当我运行我的程序时,“top”报告说我在“sy”(内核空间)上花费了 30+%。
我怎样才能获得有关此的更多信息?什么系统调用一直在消耗等等。
感谢回复者:
听起来 Devel::NYTProf 非常适合分析整个程序——但我在 Amazon Linux 上安装它时遇到了麻烦。
如果我只想要系统调用的快照,strace 似乎很棒。
更新:我这样做了,系统调用所花费的时间实际上可以忽略不计。我最好的猜测是线程卡在等待某些资源上。下面的答案仍然很好,但任何建议都会有所帮助。
你可以使用strace(1) - trace system calls and signals
.
-c
flag 将产生按系统调用分组的聚合结果。-p NUM
是要附加的正在运行的进程的 PID。监控爬虫(例如)如下所示:
stas@crawler2:~/ScrapMe$ strace -c -p 32184
Process 32184 attached - interrupt to quit
^CProcess 32184 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
48.00 0.000024 0 128 sendto
26.00 0.000013 0 76 write
26.00 0.000013 0 2652 2652 stat
0.00 0.000000 0 24 close
0.00 0.000000 0 226 poll
0.00 0.000000 0 78 rt_sigaction
0.00 0.000000 0 26 rt_sigprocmask
0.00 0.000000 0 52 alarm
0.00 0.000000 0 26 socket
0.00 0.000000 0 26 26 connect
0.00 0.000000 0 75 recvfrom
0.00 0.000000 0 26 getsockname
0.00 0.000000 0 26 getpeername
0.00 0.000000 0 26 getsockopt
0.00 0.000000 0 310 fcntl
0.00 0.000000 0 13 epoll_wait
0.00 0.000000 0 26 epoll_ctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.000050 3816 2678 total
我想你应该分析你的脚本 - 我强烈建议在这种情况下使用Devel::NYTProf模块。
它很容易运行(还有什么比这更简单的perl -d:NYTProf yourscript.pl
呢?),并且分析器的工作结果可以很容易地转换成一个完整的报告——或者使用这个包中包含的实用程序——或者使用更多的“图形化”工具KCachegrind .