我正在使用套接字并使用fcntl设置O_NONBLOCK,但仍然使用占用100%CPU的应用程序。即使我使用选择等待时间1毫秒。
为了阅读目的,我正在使用recv。
我在没有O_NONBLOCK的情况下尝试了它,在这种情况下它不消耗100%的CPU,但是recv需要很长时间。我尝试使用O_NONBLOCK选项进行recv,但仍然需要花费很多时间(有时候是200毫秒)才能读取。 我们正在使用select然后为什么recv需要花费很多时间?
我不能使用第一个选项(带有O_NONBLOCK的套接字)因为CPU被占用而在第二个选项中有时间延迟。
任何人都可以提出意见。它是一个客户端应用程序。
答案 0 :(得分:2)
select()被优化为进入有效的等待状态(不消耗太多CPU)。尝试用30秒的时间。当其中一个观察文件描述符发生活动时,它会立即返回,因此您可以完成工作。
尝试在strace -v -ttt或tcpdump下查看您的进程以查找高延迟的提示,或显示相关代码。
另请注意,select可以更改timeval结构,因此请记住重置select()调用之间的值。
答案 1 :(得分:1)
我不认为这是出乎意料的。如果您设置非阻止模式,recv
将不会阻止等待某事。换句话说,它将返回数据是否可用以及非常可能会损坏您的CPU。
我还考虑稍微增加select
超时。没有真正的理由让它变小,因为也可能会咀嚼CPU。
我倾向于使用select
超时的值,因为这是我需要的其他事情的延迟(比如及时处理CTRL-BREAK信号)。
这使得进程在等待数据可用时充足的非CPU密集时间。如果它在 less 中比一秒钟可用,那么您之前就会知道它(select
将返回)。