我编写了一个应用程序,接受不同的远程客户端,并且基于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
,临界区......,我不确定写多线程应用程序是否会带来更好的性能?
我在网上看了两个有趣的文章:
- "Scalable kernel performance for Internet servers under realistic loads"
- "A scalable and explicit event delivery mechanism for UNIX"
不幸的是,他们是很老的(从98年/ 99年),我想知道,如果有人遇到过这种问题,或者如果您有任何其他建议来改善性能或指出真正的问题?
编辑:
我注意到,更多的客户端连接更多的我的应用程序使用的CPU,这尽管客户端不发送任何数据!由于大部分时间都花在select上,我通过选择本身消耗更多的CPU! 我可以在ARM下使用哪些其他免费工具来分析我的应用程序并指出问题所在? Valgrind在ARM9上不工作(还)...
是什么让你说选择消耗大量的CPU时间?第一个痕迹清楚地表明,选择花费了很多时间,是的,但这就是你期望看到的。呼叫会阻止,直到有数据可以采取行动。 –