2014-09-04 57 views
2

我正在创建一个服务器,它将处理多个并发客户端连接(大约100个),其中客户端抽取大量数据和服务器包并将其发送到另一个远程位置。在单个事件循环中是否允许多个cURL多个句柄?

我想做的是将从每个客户端发送的数据“分组”到他们自己的数据结构中(比如说一些链表),并且同时处理这些列表。吞吐量很重要,所以我希望能够尽可能多地发送数据(可以说最多可同时处理10k个简单的句柄)。

我想到的方法是:

  1. 有一个大的线程池(比如100个线程),其中每个处理一个简单的句柄。
  2. 有一个单线程处理所有10k简单句柄的多句柄。
  3. 创建多个线程(如4)处理多个句柄,因此每个句柄处理2500个简单的句柄。
  4. 每个客户端都有一个多处理器,因此每个处理一个多处理器的线程可能有100个。

我想知道的是,我是否可以'组合'#2和#3,使得我有一个线程可以在单个事件循环中处理多个多个句柄。这样的事情是否允许,如果是的话,它会更有意义吗?如果可能的话,它将满足我对每个多句柄分组客户端的要求,并且还可以让我利用每个多句柄的持久连接。如果没有,我完全利用所有客户端的持续连接的唯一方法是选项#4。最好我想减少使用的线程数量,这是由于我们所遵循的编程模型存在某些限制。

回答

4

这是一个很复杂的问题,不可能简单回答。它也将取决于很多当地条件和您可能具有的其他要求,但未在此处指定。我建议你建立一些原型,并针对你的特定条件对它们进行测量。

:您可以使用多个多手柄在同一个线程,但它可能会变得有点古怪,我不认为你会看到任何好处,而不是只用一个,再添加全部轻松 - 处理那一个。

我个人的偏好是#3,但也许会比4更多的线程,因为如今您可以轻松拥有8个线程的CPU,并且很快就会有16个线程,而对于CPU占用的情况,最好尽可能地分散负载以实现最高性能(但不要太高以获得缓存和连接重用等)。另外,由于每个多重句柄然后处理N个简单句柄,因此总是存在一定风险,即您必须为特殊传输做些事情,这会使其他N-1传输暂停一点,然后它会更好如果你已经把总数分成了几个线程,那么它就不会阻止所有的传输。

最后,为了达到这个速度,您可能需要使用基于事件的curl_multi_socket_action API来获得最佳性能。

+0

非常感谢您的快速响应!如果使用选项#3,我打算让多个线程拥有一个内核,所以完全同意你的看法。我的计划也是使用'curl_multi_socket_action' API,所以看起来我在正确的轨道上(这是我第一次使用curl)。我们仍然很高兴知道它允许每个线程拥有多个多线程,但我想我会选择#3并且看看这是怎么回事。 – James 2014-09-08 17:53:57