【问题标题】:TCP receive usage 100% CPUTCP 接收使用 100% CPU
【发布时间】:2014-06-01 05:34:41
【问题描述】:

我通过tcp和以下代码读取高频数据

 while (1) {
    lrev = recv(fd, buff, 80, MSG_WAITALL);
    dowork();
 }

我正在通过一个线程运行此代码,并将此线程分配给特定的 CPU 内核。我可以看到特定核心使用 100% CPU。是因为 while(1) 循环吗?延迟目的是好是坏?

我的进程有 5 个线程,每个线程都在单独的核心上运行。我的总 CPU 使用率约为 400%。

谢谢

【问题讨论】:

  • 查看recv返回的值:/

标签: c++ multithreading sockets tcp cpu-usage


【解决方案1】:
  • 我可以看到特定内核使用 100% CPU。是因为 while(1) 循环吗?

我们没有看到您的所有代码,但是一段时间 (1) 处理非阻塞函数通常会在它所绑定的 CPU 上以 100% 的速度旋转

  • 对于延迟目的是好是坏?

对于对延迟非常敏感的系统,这通常很好(如果您想将数据包到达网卡和开始处理它的时间之间的时间/延迟最小化)

但是,您使用 MSG_WAITALL might block 接听电话,这对您的延迟不利

此标志请求操作阻塞,直到满足完整请求。

判断它是好是坏的唯一确定答案是:在所有情况下测量您的延迟。

编辑:

正如@Captain Obvlious 所评论的,您必须检查recv返回的值

【讨论】:

  • 测量延迟,看看它是否比传统的阻塞调用更好。
  • 其实挺好的,叫热烧。这种类型的代码避免了由于紧密循环导致的调度程序延迟,并且在 HFT 场景中是标准的。我只是想知道 OP 如何在这方面工作,而对如何以尽可能小的延迟处理数据的开发基础一无所知。
  • 明白。我使用 MSG_WAITALL 因为必须等待完整的请求。数据以压缩形式出现,除非我收到完整的一个数据包,否则我无法解压缩。
  • 是的,但您可能希望在等待完整数据包到达时对旋转的 CPU 执行其他操作..
  • 换句话说,更常见的是不使用MSG_WAITALL,只是在本地缓冲任何接收到的数据,然后根据需要处理你的缓冲区。
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 2017-05-23
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2017-08-25
相关资源
最近更新 更多