我在 Linux 上使用 C 编写了一个聊天服务器。我已经测试过同样的东西,它在性能方面工作得很好。唯一滞后的是我正在使用 select 系统调用来处理套接字描述符。由于 select 的限制为 1024,因此我的聊天服务器最多只能同时处理 1024 个用户。
我知道我可以使用的另一个选项是 poll,但与 select 相比,我不太确定它及其性能。
请建议我解决这种情况的最有效方法。
我在 Linux 上使用 C 编写了一个聊天服务器。我已经测试过同样的东西,它在性能方面工作得很好。唯一滞后的是我正在使用 select 系统调用来处理套接字描述符。由于 select 的限制为 1024,因此我的聊天服务器最多只能同时处理 1024 个用户。
我知道我可以使用的另一个选项是 poll,但与 select 相比,我不太确定它及其性能。
请建议我解决这种情况的最有效方法。
poll()
几乎可以用作 的替代品select()
,并且允许您超过 1024 个文件描述符(您可以使数组传递到poll()
您想要的任意大小)。
它将具有与 类似的性能特征select()
,因为两者都需要内核和用户空间应用程序来扫描整个阵列 - 但如果select()
对您来说工作正常,那么poll()
也应该这样做。(实际上,性能略有提高poll()
-.events
为每个文件描述符指定您感兴趣的事件的字段不会被更改poll()
,因此您不必像使用文件描述符那样在每次调用之前重建数组集传递给select()
)。
如果您稍后发现自己因扫描 poll 文件描述符数组而导致性能问题,您可以考虑切换到该epoll
接口,该接口更复杂,但在文件描述符数量非常多的情况下也可以更好地扩展。
Linux 对 select() 没有 1024 个限制。但:
您可以使用 poll()。但是当活动连接的数量增加时,它的性能会受到影响。
在 Linux 上使用 epoll() 更可取,但我建议使用libevent
libevent 是实现重负载服务器的快速、干净和可移植的方式,对于 linux,它在引擎盖下具有 epoll。