【问题标题】:Boost asio async_read_some returning small amount of dataBoost asio async_read_some 返回少量数据
【发布时间】:2014-01-27 18:40:08
【问题描述】:

我正在基于HTTP Server 3 示例为Mac OS X 做一个Boost asio 网络程序。它使用 async_read_some 从 TCP 套接字异步读取数据。

问题是我的处理程序返回的数据量非常少。我给它一个 64k 的缓冲区,但它通常返回大约 1448 字节,这是一个完整的以太网数据包的大小。当有大量数据传输时,这反过来会导致 CPU 使用率很高,我无法想象所有这些内核到用户空间的跳转都是有效的。

以如此小的块获取数据是否正常?

有没有办法告诉 TCP 堆栈或 asio 框架在返回之前尝试在内核中缓冲更多数据?

【问题讨论】:

标签: c++ macos networking boost boost-asio


【解决方案1】:

这真的很简单:一旦事情变得繁忙,您就会立即开始获取大量数据。这就是它的全部。是的,在系统未加载时,以如此小的块获取数据是非常正常的。这实际上是期望的行为:您正在利用低系统负载来获得非常好的延迟。必要时,事情会从那时起优雅地降级。

【讨论】:

  • 感谢您的回答。但是,我仍然想知道,在某些情况下,人们是否希望通过降低延迟来保持低 CPU 使用率?例如,如果我想降低功耗并节省笔记本电脑电池。有能力告诉 TCP 堆栈或框架在内核中缓冲更多数据,这不是一个足够有效的场景吗?
  • @Matt 归根结底,这不是关于谁在哪里缓冲,而是 CPU 是否被唤醒。如果网络中断必须唤醒 CPU 并使内核忙碌,那么让用户空间不知道它几乎没有什么好处。一旦你起来了,你就差不多了。
  • @Matt 当然,TCP 堆栈是可调的,但这不仅与堆栈有关,还与硬件有关。现代、移动感知操作系统尽最大努力以最佳方式利用 CPU,因此如果可能,它们将调整网络适配器以降低中断频率,并合并来自多个来源的唤醒。这就是为什么,例如,最近的框架,如 Qt 5,除了提供精确计时器外,还提供粗略计时器。粗略的计时器浪费更少的电力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多