2012-06-22 63 views
2

我编写了一个应用程序,接受不同的远程客户端,并且基于select()将作业分配给不同的处理程序。我注意到在一个运行ARM926EJ-S和内核2.6.33-rc4的平台上,应用程序使用了大量的CPU!以下是我可以通过我的运行与strace的30秒应用-c看到:select()系统调用是CPU消耗

% time  seconds usecs/call  calls errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
98.47 3.680000  204444  18   select 
... 

但是,如果我从我的远程客户端不断地发送数据到应用,CPU选择使用少得多!

% time  seconds usecs/call  calls errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
44.69 0.340278   175  1945   gettimeofday 
40.71 0.310000  25833  12   select 
    3.94 0.030000  30000   1   fsync 
... 

我想知道是否select()实施与繁忙的等待。然而,在一个运行MIPS处理器和2.6.30.10 Linux内核的旧版平台上,尽管我应该交叉编译strace以确认......,但这个问题并没有出现。而且由于数据“很少”发送,所以我大部分情况都是最糟糕的!

我想知道问题出在哪里! C库? Linux内核?另一方面,由于pthread,临界区......,我不确定写多线程应用程序是否会带来更好的性能?

我在网上看了两个有趣的文章:

不幸的是,他们是很老的(从98年/ 99年),我想知道,如果有人遇到过这种问题,或者如果您有任何其他建议来改善性能或指出真正的问题?

编辑
我注意到,更多的客户端连接更多的我的应用程序使用的CPU,这尽管客户端不发送任何数据!由于大部分时间都花在select上,我通过选择本身消耗更多的CPU! 我可以在ARM下使用哪些其他免费工具来分析我的应用程序并指出问题所在? Valgrind在ARM9上不工作(还)...

+1

是什么让你说选择消耗大量的CPU时间?第一个痕迹清楚地表明,选择花费了很多时间,是的,但这就是你期望看到的。呼叫会阻止,直到有数据可以采取行动。 –

回答

7

strace -c不测量CPU花费的时间,但在系统调用花费的总时间。请参阅其手册页:

计算每个系统调用的时间,调用和错误并报告程序退出时的摘要摘要 。

因此,如果您在低负载下不会有select的高百分比,实际上会很糟糕!

您可以使用perflinux-tools包在debian/ubuntu上)来测量整体性能,包括内核代码。

+0

当然,但也许这个评论混淆了我的manpage,比你的引用稍微深一点:“在Linux上,它试图显示与挂钟时间无关的系统时间(在内核中运行的CPU时间)。“ – morandg

+0

是的,但是因为'select'是特殊的,所以它会阻塞,直到发生一些外部事件,但是”尝试“可能会失败,尽管我不熟悉strace的内部结构。它会在这种情况下测量CPU时间。 – mensi