我编写了一个接受不同远程客户端的应用程序,并基于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
...
但是,如果我从远程客户端连续向应用程序发送数据,则 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上,我认为select本身会消耗更多的CPU!我可以在 ARM 下使用哪些其他免费工具来分析我的应用程序并指出问题?Valgrind 在 ARM9 上(还)不工作......