2

我编写了一个接受不同远程客户端的应用程序,并基于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 上(还)不工作......

4

1 回答 1

7

strace -c不测量花费的 CPU 时间,而是测量系统调用中花费的总时间。请参阅其联机帮助页:

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

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

您可以使用perflinux-toolsdebian/ubuntu 上的 package)来衡量整体性能,包括内核代码。

于 2012-06-22T12:16:40.743 回答