gpt4 book ai didi

c++ - 我有一台监听套接字的服务器,用多线程为 CPU 绑定(bind)请求提供服务的好方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:34 25 4
gpt4 key购买 nike

我有一个用 C++ 编写的应用程序,它使用 boost::asio。它监听套接字上的请求,并为每个请求做一些 CPU 绑定(bind)的工作(例如,没有磁盘或网络 i/o),然后响应一个响应。

此应用程序将在多核系统上运行,因此我计划每个内核(至少)有 1 个线程,以并行处理请求。

最好的方法是什么?需要考虑的事情:

  • 我需要一个固定大小的线程池(例如每个 CPU 1 个线程)
  • 如果到达的请求多于我拥有的线程,那么它们将需要排队(也许在 o/s 套接字层?)

目前服务器是单线程的:

  • 它等待客户请求
  • 一旦收到请求,它就会执行工作,并写回响应,然后开始等待下一个请求

更新:

更具体地说:我应该使用什么机制来确保在服务器繁忙时传入请求排队?我应该使用什么机制在 N 个线程(每个内核 1 个)之间分配传入请求?

最佳答案

我看不出还有很多您尚未涵盖的内容。

如果它确实受 CPU 限制,那么添加超出内核数量的线程对您没有多大帮助,除非您将有很多请求。在那种情况下,监听队列可能会或可能不会满足您的需求,最好让一些线程接受连接并自己将它们排队。检查系统的监听积压值,并对线程数进行一些试验。

更新:

listen() 有第二个参数,它是您请求的 OS/TCP 队列深度。您可以将其设置为操作系统限制。除此之外,您还需要使用系统旋钮。在我当前的系统上它是 128,所以它不是很大但也不是微不足道的。检查您的系统并考虑您是否真的需要比默认更大的东西。

除此之外,您还可以前往多个方向。考虑 KISS - 在实际需要之前没有复杂性。从一些简单的事情开始,比如让一个线程接受连接(达到某个限制)并将它们放入队列中。工作线程拾取它们、处理、写入结果并关闭套接字。

按照我发行版的 Boost 更新的当前速度(以及我缺乏自己编译它的意愿),我将在 2012 年开始使用 ASIO - 所以我对此无能为力。

关于c++ - 我有一台监听套接字的服务器,用多线程为 CPU 绑定(bind)请求提供服务的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1167933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com