2012-06-15 35 views
3

我已经在Linux上使用C编写了一个聊天服务器。我已经测试过,并且在性能方面效果很好。滞后的唯一情况是我正在使用select系统调用来处理套接字描述符。由于选择有1024的限制,所以最大我的聊天服务器可以同时处理只有1024个用户。关于处理超过1024个套接字描述符

我知道我可以使用的其他选项是轮询,但与select相比,不太确定它的性能。

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

+2

[处理超过1024个文件描述符的可能的重复,在Linux上的C](http:// stackoverflow。com/questions/848717 /处理多于1024-file-descriptors-in-c-on-linux) –

+2

明确使用epoll而不是select – jxh

+0

上面的链接由Christian.K提供,definetly为这个问题提供了一个解决方案。 – alk

回答

2

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

而你应该考虑select作为一个过时的系统调用。即使只有几十个文件描述符,你至少应该喜欢poll

注意的Qt和GTK为您提供一个事件循环机制,往往采用poll(和QtCore或油嘴可以使用外图形接口)。还有libevlibevent。我建议使用其中之一。

1

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

  1. select()的表现非常差
  2. FreeBSD的呢:)

你可以使用poll()。但是,当活动连接数量增加时,其性能会受损。

使用epoll的()是在Linux上最好不过,我会建议使用libevent

libevent的是落实重负荷的服务器快速,干净和可移植的方法和用于Linux它的引擎盖下有epoll的。

5

poll()可以用作select()几乎直接替代,并且可以让你超过1024个文件描述符(你可以让传递给poll()只要你想大的阵列)。

这将有类似的性能特点select(),因为两者都需要在内核和用户空间应用程序扫描整个数组 - 但如果select()是为你工作好,然后poll()也应该如此。 (实际上,poll() - .events字段中有轻微的性能改进,指定您对每个文件描述符感兴趣的事件,但不会因poll()而更改,因此您不必在每次调用之前重新构建阵列文件描述符集合传递给select())。

如果您后来发现自己由于扫描轮询文件描述符数组而导致性能问题,可以考虑切换到epoll接口,该接口更复杂,但也可以使用大量文件描述符进行扩展。

相关问题