gpt4 book ai didi

c - select() 系统调用很耗CPU

转载 作者:行者123 更新时间:2023-12-01 15:05:42 25 4
gpt4 key购买 nike

我编写了一个应用程序,它接受不同的远程客户端并基于 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,尽管客户端不发送任何数据!由于大部分时间花在选择上,我认为消耗更多CPU的选择本身!我可以在 ARM 下使用哪些其他免费工具来分析我的应用程序并指出问题所在? Valgrind 还不能在 ARM9 上工作 ...

最佳答案

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

Count time, calls, and errors for each system call and report a summary on program exit.

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

您可以使用perf(debian/ubuntu 上的linux-tools 包)来测量整体性能,包括内核代码。

关于c - select() 系统调用很耗CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11155901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com