我正在实现需要维护大量(100K 或更多)长期连接的自定义服务器。服务器只是在套接字之间传递消息,并且不进行任何认真的数据处理。消息很小,但每秒都会接收/发送许多消息。减少延迟是目标之一。我意识到使用多核不会提高性能,因此我决定通过调用在单线程中运行服务器run_one
or poll
的方法io_service
目的。无论如何,多线程服务器将更难实现。
可能的瓶颈是什么?系统调用、带宽、完成队列/事件多路分解?我怀疑分派处理程序可能需要锁定(这是由 asio 库内部完成的)。是否可以在 boost.asio 中禁用甚至队列锁定(或任何其他锁定)?
编辑:相关问题。多线程会提高系统调用性能吗?我的感觉是,因为系统调用是原子的/由内核同步的,所以添加更多线程不会提高速度。
您可能想阅读我的问题 https://stackoverflow.com/q/3025373/283302几年前,当我在为 Boost.Asio 开发系统软件时,第一次研究 Boost.Asio 的可扩展性时,我就问过这个问题。蓝色基因/Q超级计算机 https://stackoverflow.com/a/14447434/283302.
扩展到 100k 或更多连接应该不是问题,但您需要注意明显的资源限制,例如打开文件描述符的最大数量。如果你还没有读过开创性的文章C10K纸 http://en.wikipedia.org/wiki/C10k_problem,我建议阅读它。
使用单线程和单线程实现应用程序后io_service
,我建议调查调用线程池io_service::run()
,然后才调查固定io_service
到特定的线程和/或CPU。 Asio 文档中包含所有这三种设计的多个示例,并且几个问题 https://stackoverflow.com/a/6162575/283302关于 SO 并提供更多信息。请注意,当您引入多个线程调用时io_service::run()
你可能需要实施strand
确保处理程序对共享数据结构具有独占访问权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)