3

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

我知道我可以使用的另一个选项是 poll,但与 select 相比,我不太确定它及其性能。

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

4

3 回答 3

5

poll()几乎可以用作 的替代品select(),并且允许您超过 1024 个文件描述符(您可以使数组传递到poll()您想要的任意大小)。

它将具有与 类似的性能特征select(),因为两者都需要内核和用户空间应用程序来扫描整个阵列 - 但如果select()对您来说工作正常,那么poll()也应该这样做。(实际上,性能略有提高poll()-.events为每个文件描述符指定您感兴趣的事件的字段不会被更改poll(),因此您不必像使用文件描述符那样在每次调用之前重建数组集传递给select())。

如果您稍后发现自己因扫描 poll 文件描述符数组而导致性能问题,您可以考虑切换到该epoll接口,该接口更复杂,但在文件描述符数量非常多的情况下也可以更好地扩展。

于 2012-06-15T05:52:37.000 回答
2

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

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

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

于 2012-06-15T05:46:46.777 回答
0

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

  1. select() 性能很差
  2. FreeBSD 可以 :)

您可以使用 poll()。但是当活动连接的数量增加时,它的性能会受到影响。

在 Linux 上使用 epoll() 更可取,但我建议使用libevent

libevent 是实现重负载服务器的快速、干净和可移植的方式,对于 linux,它在引擎盖下具有 epoll。

于 2012-06-15T05:52:18.867 回答