代码之家  ›  专栏  ›  技术社区  ›  waterlooalex

我有一个服务器在监听套接字,用多个线程处理CPU绑定的请求有什么好方法?

  •  2
  • waterlooalex  · 技术社区  · 16 年前

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

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

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

    当前服务器是单线程的:

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

    更新:

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Newton Falls    16 年前

    我看不到还有很多要考虑的问题。

    除了

    更新:

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

    除此之外,你还可以选择几个方向。考虑吻——在实际需要之前没有复杂性。从一些简单的事情开始,比如只需要一个线程来接受连接(达到一定的限制),然后将它们放到队列中。工作线程拾取、处理、写入结果并关闭套接字。

        2
  •  1
  •   anio    16 年前
        3
  •  1
  •   Modicom    16 年前

    如果您使用basic_socket_acceptor的重载构造函数绑定和侦听给定端点,它将使用SOMAXCONN作为listen()调用中挂起连接的积压。我认为(不是很确定)这在Windows中映射到250。因此,网络服务提供商将(静默地)接受达到此限制的客户端连接,并将它们排队等待您的应用程序处理。您的下一个接受呼叫将从此队列弹出一个连接。

    推荐文章