-1

可能重复:
boost::async_write 耗时太长

在我的服务器应用程序中,我在一次读取中运行 asio 服务来处理大约 100 个连接。我发现 async_write() 有时需要很长时间,大约 15 毫秒。(数据包非常小)

我的问题是为什么 async_write() 需要这么长时间?我认为 async_write() 应该立即返回。这么慢是很难发送很多数据的。我的意思是,函数不会立即返回。我不是说发送不会立即完成。15ms 对于同步函数来说太长了。并且该应用程序确实被阻止了。(不关心 GetTickCount )

测试代码如下:

uint64_t TStart = 0, TEnd = 0;
TStart = GetTickCount();

async_write(*this->m_Socket,
    boost::asio::buffer(pSendData->m_buf.GetBuffer(), pSendData->m_buf.GetSize()),
    boost::bind(&SttSocketConnection::OnSended, this,
    pSendData, placeholders::error, placeholders::bytes_transferred));

TEnd = GetTickCount();
if (TEnd - TStart > 1) {
    __asm int 3;
    TStart = TEnd;
}
4

1 回答 1

1

听起来您正在某处进行上下文切换。15ms 是多处理器 Windows 机器上的调度量。

如果它并不总是经常发生,请不要担心,您只是在进行系统调用时被上下文切换所击中。

如果每次调用都有问题,则应该跟踪系统调用,找出导致上下文切换的原因。我在使用 IO 完成端口、串行端口和小超时时遇到了类似的问题,其中一些系统调用总是以 15 毫秒的延迟结束。为了修复它,我不得不重组代码,以便异步操作的完成不涉及计时器。

我不知道究竟是什么导致了 asio 的这个问题。您应该跟踪系统调用并找出导致延迟的系统调用。

于 2012-09-13T05:13:02.057 回答