提升 Asio 单线程性能
·
问题:提升 Asio 单线程性能
我正在实现需要维护大量(100K 或更多)长期连接的自定义服务器。服务器只是在套接字之间传递消息,它不做任何严肃的数据处理。消息很小,但其中许多消息每秒都会接收/发送。减少延迟是目标之一。我意识到使用多个核心不会提高性能,因此我决定通过调用io_service对象的run_one或poll方法在单线程中运行服务器。无论如何,多线程服务器将更难实现。
可能的瓶颈是什么?系统调用、带宽、完成队列/事件多路分解?我怀疑调度处理程序可能需要锁定(由 asio 库在内部完成)。是否可以在 boost.asio 中禁用队列锁定(或任何其他锁定)?
编辑:相关问题。多线程时系统调用性能会提高吗?我的感觉是,因为系统调用是由内核原子/同步的,所以添加更多线程不会提高速度。
解答
您可能想阅读几年前的我的问题,我在为Blue Gene/Q 超级计算机开发系统软件时第一次研究 Boost.Asio 的可扩展性时问过它。
扩展到 100k 或更多连接应该不是问题,但您需要注意明显的资源限制,例如打开文件描述符的最大数量。如果您还没有阅读开创性的C10K 论文,我建议您阅读它。
在使用单个线程和单个io_service实现应用程序后,我建议调查调用io_service::run()的线程池,然后才调查将io_service固定到特定线程和/或 cpu。 Asio 文档中包含所有这三种设计的多个示例,几个问题关于 SO 的更多信息。请注意,当您引入调用io_service::run()的多个线程时,您可能需要实现strands 以确保处理程序具有对共享数据结构的独占访问权限。
更多推荐

所有评论(0)