我编写了一个接受不同远程客户端的应用程序,它基于select()
将作业分发给不同的处理程序。我注意到在一个运行ARM926EJ-S和内核2.6.33-rc4的平台上,应用程序使用了大量的CPU!通过使用 strace -c 运行我的应用程序30秒,我可以看到以下内容:
% 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,这尽管客户端不发送任何数据!由于大部分时间花在选择上,我虽然选择本身消耗更多的CPU!
我可以在ARM下使用哪些其他免费工具来分析我的应用程序并指出问题? Valgrind在ARM9上还没有工作......
答案 0 :(得分:7)
strace -c
不会测量花费的CPU时间,而是测量系统调用所花费的总时间。请参阅其联机帮助页:
为每个系统调用计算时间,调用和错误并报告a 关于计划退出的摘要。
如果你在低负荷时没有select
高的百分比,那实际上会很糟糕!
您可以在debian / ubuntu上使用perf
(linux-tools
包)来衡量整体性能,包括内核代码。