[英]I have a server listening on sockets, whats a good approach to service CPU-bound requests with multiple threads?
我有一个用C ++编写的应用程序,它使用boost :: asio。 它侦听套接字上的请求,并且为每个请求执行一些CPU绑定的工作(例如,没有磁盘或网络I / O),然后以响应进行响应。
该应用程序将在多核系统上运行,因此我计划每个核(至少)具有1个线程,以并行处理请求。
最好的方法是什么? 要考虑的事情:
当前服务器是单线程的:
更新:
更具体地说:我应该使用什么机制来确保服务器繁忙时传入的请求排队? 我应该使用哪种机制在N个线程(每个内核1个)之间分配传入请求?
我认为您还没有涵盖很多内容。
如果确实是CPU限制的话,那么增加内核数量之外的线程并不能帮到您, 除非您有很多请求。 在这种情况下,侦听队列可能会满足您的需求,也可能无法满足您的需求,因此最好让一些线程接受连接并自己排队。 检出系统的侦听积压值,并尝试一些线程数。
更新:
listen()有第二个参数,它是您请求的OS / TCP队列深度。 您可以将其设置为操作系统限制。 除此之外,您还需要使用系统旋钮。 在我当前的系统上,它是128,因此它并不庞大,但也不小。 检查系统,并考虑您是否实际需要比默认值大的东西。
除此之外,您还可以选择几个方向。 考虑一下KISS-在实际需要之前没有复杂性。 从简单的事情开始,例如只有一个线程接受连接(达到一定限制),然后将它们放入队列中。 辅助线程将其拾取,处理,写入结果并关闭套接字。
以我的发行版Boost更新的当前速度(以及我自己缺乏编译意愿),在我与ASIO一起玩之前是2012年-所以我对此无能为力。
ACE http://www.cs.wustl.edu/~schmidt/ACE/book1/
它具有您需要的一切。 线程管理和队列以及作为一种额外好处的是编写套接字服务器的便携式方法。
如果您使用basic_socket_acceptor的重载构造函数绑定并侦听给定的端点,则它将SOMAXCONN用作对listen()的调用中待处理连接的积压。 我认为(不太确定)这在Windows中映射为250。 因此,网络服务提供商将(静默地)接受不超过此限制的客户端连接,并将它们排队等待您的应用程序处理。 您的下一个接受呼叫将从该队列中弹出连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.