mor*_*ndg 2 c performance embedded-linux strace
我编写了一个接受不同远程客户端的应用程序,并基于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
...
Run Code Online (Sandbox Code Playgroud)
但是,如果我从远程客户端连续向应用程序发送数据,则选择使用更少的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
...
Run Code Online (Sandbox Code Playgroud)
我想知道是否select()
实施繁忙的等待.但是,在较旧的平台上,运行MIPS处理器和2.6.30.10 Linux内核时,这个问题没有出现,尽管我应该交叉编译strace来确认......!由于数据"很少"发送,我大多数情况下最糟糕!
我想知道问题可能来自哪里!C图书馆?Linux内核?另一方面,我不确定写多线程应用程序是否会因为pthread
关键部分而导致更好的性能......?
我在互联网上阅读了两篇有趣的文章:
不幸的是它们已经很老了(从'98/'99)我想知道是否有其他人遇到过那种问题,或者你是否有其他建议来提高性能或指出真正的问题?
编辑:
我注意到更多的客户端连接更多我的应用程序使用CPU,这尽管客户端不发送任何数据!由于大部分时间花在选择上,我虽然选择本身消耗更多的CPU!我可以在ARM下使用哪些其他免费工具来分析我的应用程序并指出问题?Valgrind在ARM9上还没有工作......
strace -c
不测量花费的CPU时间,而是测量系统调用所花费的总时间.请参阅其联机帮助页:
计算每个系统调用的时间,调用和错误,并报告程序退出的摘要.
因此,如果你select
在低负荷时不会有很高的百分比,那实际上会很糟糕!
您可以使用perf
(linux-tools
在debian/ubuntu上打包)来衡量整体性能,包括内核代码.
归档时间: |
|
查看次数: |
2494 次 |
最近记录: |