关于处理超过1024个套接字描述符

时间:2012-06-15 05:07:49

标签: c++ c linux linux-kernel socketserver

我在Linux上使用C编写了一个聊天服务器。我测试了相同的,它在性能方面工作得很好。唯一滞后的是我使用select系统调用来处理套接字描述符。由于select的限制为1024,所以最多我的聊天服务器只能同时处理1024个用户。

我知道我可以使用的另一个选项是民意调查,但与select相比,它的性能并不那么确定。

请建议我解决这种情况的最有效方法。

3 个答案:

答案 0 :(得分:5)

poll()可以用作select()的近似替代品,并且允许您超过1024个文件描述符(您可以使数组传递给poll()一样大如你所愿)。

它具有与select()类似的性能特征,因为它们都需要内核和用户空间应用程序来扫描整个数组 - 但如果select()对您有效,那么poll()应该太。 (poll()实际上有轻微的性能提升 - .events字段,指定您对每个文件描述符感兴趣的事件,不会被poll()更改,因此您不会必须在每次调用之前重建数组,就像传递给select()的文件描述符集一样。

如果您后来发现自己因扫描轮询文件描述符数组而导致性能问题,可以考虑切换到epoll接口,这种接口更复杂,但对于大量文件描述符也可以更好地扩展。 / p>

答案 1 :(得分:2)

您的问题被称为C10K problem(如何处理超过10,000个同时连接)。你会在网上找到很多资源,例如this one

您应该将select视为过时的系统调用。即使只有几十个文件描述符,您至少应该更喜欢poll

请注意,Qt和Gtk为您提供了一个事件循环机制,通常使用poll(并且可以在图形接口之外使用QtCore或Glib)。还有libevlibevent。我建议使用其中一个。

答案 2 :(得分:0)

Linux对select()没有1024限制。但是:

  1. select()表现很差
  2. FreeBSD::)
  3. 你可以使用poll()。但是当活动连接数量增加时,其性能会受到影响。

    在Linux上使用epoll()是首选,但我建议使用libevent

    libevent是快速,干净和便携的方式来实现重载服务器,而对于linux来说它有epoll。

相关问题