我已经在Linux上使用C编写了一个聊天服务器。我已经测试过,并且在性能方面效果很好。滞后的唯一情况是我正在使用select系统调用来处理套接字描述符。由于选择有1024的限制,所以最大我的聊天服务器可以同时处理只有1024个用户。关于处理超过1024个套接字描述符
我知道我可以使用的其他选项是轮询,但与select相比,不太确定它的性能。
请给我建议我解决这种情况的最有效方法。
我已经在Linux上使用C编写了一个聊天服务器。我已经测试过,并且在性能方面效果很好。滞后的唯一情况是我正在使用select系统调用来处理套接字描述符。由于选择有1024的限制,所以最大我的聊天服务器可以同时处理只有1024个用户。关于处理超过1024个套接字描述符
我知道我可以使用的其他选项是轮询,但与select相比,不太确定它的性能。
请给我建议我解决这种情况的最有效方法。
您的问题被称为C10K problem(如何处理超过10万个同时连接)。您会在网络上找到大量资源,例如this one。
而你应该考虑select
作为一个过时的系统调用。即使只有几十个文件描述符,你至少应该喜欢poll
注意的Qt和GTK为您提供一个事件循环机制,往往采用poll
(和QtCore或油嘴可以使用外图形接口)。还有libev和libevent。我建议使用其中之一。
Linux对select()没有1024限制。但是:
你可以使用poll()。但是,当活动连接数量增加时,其性能会受损。
使用epoll的()是在Linux上最好不过,我会建议使用libevent
libevent的是落实重负荷的服务器快速,干净和可移植的方法和用于Linux它的引擎盖下有epoll的。
poll()
可以用作select()
几乎直接替代,并且可以让你超过1024个文件描述符(你可以让传递给poll()
只要你想大的阵列)。
这将有类似的性能特点select()
,因为两者都需要在内核和用户空间应用程序扫描整个数组 - 但如果select()
是为你工作好,然后poll()
也应该如此。 (实际上,poll()
- .events
字段中有轻微的性能改进,指定您对每个文件描述符感兴趣的事件,但不会因poll()
而更改,因此您不必在每次调用之前重新构建阵列文件描述符集合传递给select()
)。
如果您后来发现自己由于扫描轮询文件描述符数组而导致性能问题,可以考虑切换到epoll
接口,该接口更复杂,但也可以使用大量文件描述符进行扩展。
[处理超过1024个文件描述符的可能的重复,在Linux上的C](http:// stackoverflow。com/questions/848717 /处理多于1024-file-descriptors-in-c-on-linux) –
明确使用epoll而不是select – jxh
上面的链接由Christian.K提供,definetly为这个问题提供了一个解决方案。 – alk