如何提高 Boost ASIO、UDP 客户端应用程序的吞吐量
How to increase throughput of Boost ASIO, UDP client application
我正在使用 Boost ASIO 库来实现 Windows UDP 客户端,它需要具有高吞吐量。
我想使用异步接收调用,以便最终实现接收超时,即。一段时间后,如果没有收到数据报,我的应用程序将退出。
我的问题是我发现使用同步接收时数据吞吐量提高了 30%
与异步接收。我在 运行 时观察到这个问题
多台 Dell R630、R710 Windows 2008 服务器上的应用程序,甚至是我的
联想 ThinkPad 笔记本电脑。
下面两个代码段的主要性能差异是什么?
每次异步接收后调用 ioService.run_one()
是否有更多开销?
我是 Boost 库的新用户,非常感谢任何帮助!
同步接收:
socket_->receive_from(boost::asio::buffer(&vector_[0], datagramSize),
endPoint_);
对比
异步接收(带阻塞):
err = boost::asio::error::would_block;
socket_->async_receive_from(
boost::asio::mutable_buffers_1(&vector_[0], datagramSize),
endPoint_,
boost::bind(&HandleRead, _1, _2, &err, &bytesReceived));
do
{
ioService_.run_one()
}
while(err == boost::asio::error::would_block)
异步接收处理函数:
static void HandleRead
(
const boost::system::error_code& error,
std::size_t bytesRead,
boost::system::error_code* outError,
std::size_t* outBytesRead
)
{
*outError = error;
*outBytesRead = bytesRead;
}
async_
系列 API 函数具有最重要的 属性,它们 运行 异步.
运行 任何 异步 本身并不会使其更快。事实上,由于安排人工制品,它可能会更慢。
问题是异步可以让你在少量线程(例如主线程)上做更多的事情。
听起来好像您的应用程序不需要那种多路复用操作。如果您的应用程序确实以线性方式尽可能快地消耗单个数据包源,那么
确实没有意义
- 插入一个(线程安全的)任务队列
- 请求
io_service
在可用服务线程中安排任务¹(您只有一个)
- 以回调的形式协调返回结果;回调经常导致对象生命周期被攻击,这反过来又经常导致
shared_ptr<>
s。如果是这样,这些都是更多延迟的来源(由于引用的位置减少,更多的动态分配等)。
如果不需要,请不要使用异步模式。
即使您的本质上是单线程的、顺序的 运行ning 任务数量有限,您也可以通过为每个任务一个线程,每个线程一个 io_service
来实现最大的效果,并避免协调。
¹ threads 运行ning io_service::run
或类似
我正在使用 Boost ASIO 库来实现 Windows UDP 客户端,它需要具有高吞吐量。
我想使用异步接收调用,以便最终实现接收超时,即。一段时间后,如果没有收到数据报,我的应用程序将退出。
我的问题是我发现使用同步接收时数据吞吐量提高了 30% 与异步接收。我在 运行 时观察到这个问题 多台 Dell R630、R710 Windows 2008 服务器上的应用程序,甚至是我的 联想 ThinkPad 笔记本电脑。
下面两个代码段的主要性能差异是什么?
每次异步接收后调用 ioService.run_one()
是否有更多开销?
我是 Boost 库的新用户,非常感谢任何帮助!
同步接收:
socket_->receive_from(boost::asio::buffer(&vector_[0], datagramSize),
endPoint_);
对比
异步接收(带阻塞):
err = boost::asio::error::would_block;
socket_->async_receive_from(
boost::asio::mutable_buffers_1(&vector_[0], datagramSize),
endPoint_,
boost::bind(&HandleRead, _1, _2, &err, &bytesReceived));
do
{
ioService_.run_one()
}
while(err == boost::asio::error::would_block)
异步接收处理函数:
static void HandleRead
(
const boost::system::error_code& error,
std::size_t bytesRead,
boost::system::error_code* outError,
std::size_t* outBytesRead
)
{
*outError = error;
*outBytesRead = bytesRead;
}
async_
系列 API 函数具有最重要的 属性,它们 运行 异步.
运行 任何 异步 本身并不会使其更快。事实上,由于安排人工制品,它可能会更慢。
问题是异步可以让你在少量线程(例如主线程)上做更多的事情。
听起来好像您的应用程序不需要那种多路复用操作。如果您的应用程序确实以线性方式尽可能快地消耗单个数据包源,那么
确实没有意义- 插入一个(线程安全的)任务队列
- 请求
io_service
在可用服务线程中安排任务¹(您只有一个) - 以回调的形式协调返回结果;回调经常导致对象生命周期被攻击,这反过来又经常导致
shared_ptr<>
s。如果是这样,这些都是更多延迟的来源(由于引用的位置减少,更多的动态分配等)。
如果不需要,请不要使用异步模式。
即使您的本质上是单线程的、顺序的 运行ning 任务数量有限,您也可以通过为每个任务一个线程,每个线程一个 io_service
来实现最大的效果,并避免协调。
¹ threads 运行ning io_service::run
或类似