c++ - 使用单个文件描述符,select,poll和epoll和...之间是否有任何性能差异?

标签 c++ sockets select epoll

标题确实说明了一切。

and ...的意思还包括pselect和ppoll..

我正在处理的服务器项目基本上是由多个线程构成的。每个 线程处理一个或多个 session 。所有线程都是相同的。协议(protocol) 负责托管 session 的线程。

我正在使用一个内部套接字类来包装东西。兴趣点是一个 checkread 调用,它调用 poll (linux) 或 select (windows)。

总而言之,每个线程当前在单个套接字上调用 poll。据我所知,只有当这个线程正在查看多个套接字时,使用 epoll 才会有好处,比如你会得到一个 HTTP 服务器。在我的情况下,这不是我正在做的事情。并且该类一次只处理一个套接字。

在 epoll 的手册页中有一些关于边缘和电平触发的简短讨论。我不太确定这意味着什么。在套接字类中,我在代码的 windows 部分看到了一个优化,它使用 ioctlsocket 和 FIONREAD 快捷方式选择调用,以检查是否有任何数据。想知道即使在调用时没有完整的 UDP 数据包到达,它是否会返回 > 0。这就是epoll中的边缘触发吗?

在一些基本测试中,我也发现使用 select 和 poll 之间没有明显区别。

我可以看到使用 ppoll 可能会有好处,尽管由于超时的精度更高。有什么想法吗?

是的,我正在尝试优化接收大量数据的 session 的吞吐量。服务器比 CPU 更受网络和磁盘的限制。

最佳答案

epoll 与 select 或 poll 的主要区别在于,epoll 在单线程中运行时可扩展性更好。我不知道这与使用 select 或 poll 使用多线程服务器相比如何。 看看这个http://monkey.org/~provos/libevent/libevent-benchmark2.jpg

这样做的原因(据我所知)是,当您使用 select 或 poll 时,您必须遍历所有连接的套接字以确定哪些套接字有要读取的数据。当您使用 epoll 时,它会保留一个单独的数组,其中仅包含对要读取数据的套接字的引用。这为您节省了大量的循环周期,并且连接的套接字越多,差异变得越来越明显。

如果性能成为主要问题,另一件需要研究的事情是 io 完成端口(仅限 Windows)和 kqueue(仅限 FreeBSD)。记住 epoll 仅适用于 linux 也很重要。在大多数情况下,选择或投票都可以正常工作。

在单个文件描述符的情况下,select 和 poll 比 epoll 更高效,因为要简单得多。 (epoll 有一些开销,仅在单个套接字上没有用处)

关于c++ - 使用单个文件描述符,select,poll和epoll和...之间是否有任何性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5647503/

相关文章:

c++ - 复制 PCL 点云,同时保留组织或 Ransac + 曲面法线计算

c++ - TerminateProcess() 不会关闭应用程序

Javascript:从列表中获取选定的选项并将其粘贴到标签标记上

node.js - 无法获取/socket.io/?EIO=3&transport=polling&t=LdmmKYz

使用 Jquery 从数据表中选择所有页面的所有内容

C:关于 Beej 的网络指南的问题......这里有一个假设吗?

c++ - 将 Eigen C++ 库与英特尔 MKL 结合使用

c++ - 模板中类型名称分配的目的是什么

c - select() 和 C 上带有动态缓冲区的非阻塞 recv

sockets - 无法在 Windows 8 Metro 风格应用程序中使用 IPAddress 或类似类型