我在Linux上使用C编写了一个聊天服务器。我测试了相同的,它在性能方面工作得很好。唯一滞后的是我使用select系统调用来处理套接字描述符。由于select的限制为1024,所以最多我的聊天服务器只能同时处理1024个用户。
我知道我可以使用的另一个选项是民意调查,但与select相比,它的性能并不那么确定。
请建议我解决这种情况的最有效方法。
答案 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)。还有libev和libevent。我建议使用其中一个。
答案 2 :(得分:0)
Linux对select()没有1024限制。但是:
你可以使用poll()。但是当活动连接数量增加时,其性能会受到影响。
在Linux上使用epoll()是首选,但我建议使用libevent
libevent是快速,干净和便携的方式来实现重载服务器,而对于linux来说它有epoll。