【问题标题】:High CPU usage while using poll system call to wait on fds使用 poll 系统调用等待 fds 时 CPU 使用率高
【发布时间】:2013-09-30 11:45:56
【问题描述】:

我有一个独特的问题,我的代码中使用的 linux 的 poll 系统调用获取了它等待轮询的 fds,我的意思是每毫秒 POLLIN。这会导致 CPU 使用率过高。我提供了 100 毫秒的超时,这似乎没有用。任何人都可以提出替代方案。

    for (;;) {

 ACE_Time_Value doWork(0, 20000);  
 ACE_OS::sleep(doWork);  ----------------------------> Causing low throughput, put to decrease CPU usage / On removing this we see high CPU , but throughput is achieved.
..
.
..
 if ((exitCode = fxDoWork()) < 0) {
  break;}

}

fxDoWork()
{
ACE_Time_Value selectTime;
selectTime.set(0, 100000);
..
..
..
ACE_INT32 waitResult = ACE_OS::poll(myPollfds, eventCount, &selectTime);-----------------------------> Pollin happens for every milli second/Timeout is not at all useful
..
..
..
}
===============================================================

【问题讨论】:

  • 你在轮询什么类型的 fd,sockets,fifo,pipe,files?
  • 能贴出代码吗?
  • @Tiran 他们是套接字 fds
  • poll 的返回值真的是错误吗?这意味着它没有等待,所以你的代码只是循环。
  • @samairtimer 如果您有数千个并发连接,epoll 可能会有所帮助,如果您只有几个连接到几百个,它不会有太大帮助。

标签: c++ c linux


【解决方案1】:

听起来您想积累足够的数据或发生特定的超时以减少 CPU 使用率,对吧?如果是这种情况,您可以使用 recvmmsg():http://man7.org/linux/man-pages/man2/recvmmsg.2.html

recvmmsg() 系统调用是 recvmsg(2) 的扩展,它允许 调用者使用单个套接字从套接字接收多条消息 系统调用。 (这对某些应用程序具有性能优势。) 对 recvmsg(2) 的进一步扩展是支持超时 接收操作。

【讨论】:

  • 当您发布链接时,请尝试引用网页的一部分,这样即使链接损坏,您的回答对未来用户仍然有用
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多