我怎么知道为什么我的Perl代码在内核空间花了这么多时间(顶部的“sy”)?

时间:2012-11-13 22:19:22

标签: linux performance perl

当我运行我的程序时,“top”报告我在“sy”(内核空间)中花费了30 +%。

如何获得有关此内容的更多信息?什么系统调用正在吞噬所有 这一次,等等。

感谢回应者:

  • 听起来像Devel :: NYTProf很适合分析整个程序 - 但我在亚马逊Linux上安装它时遇到了麻烦。

  • 如果我只想要一个系统调用的快照,那么strace似乎很棒。

更新:我这样做了,系统调用花费的时间实际上可以忽略不计。我最好的猜测是线程在某些资源上等待。答案仍然很好,但任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:10)

您可以使用strace(1) - trace system calls and signals-c标志将生成由syscall分组的聚合结果。 -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

答案 1 :(得分:5)

我想你应该对你的脚本进行分析 - 我强烈建议在这种情况下使用Devel::NYTProf模块。

运行起来非常简单(什么比perl -d:NYTProf yourscript.pl更容易?),并且探查器工作的结果可以很容易地转换成一个完整的报告 - 使用此包中包含的实用程序 - 或者使用更多'graphicky'工具KCachegrind