Sockets n个文件描述符之后最好切换到epoll over poll?
对于1到50个左右的描述符,我们有什么基准吗?我看到的大多数基准都是针对大量描述符100s..1000s 我目前正在使用16个描述符的poll,并考虑使用epoll来提高应用程序的速度Sockets n个文件描述符之后最好切换到epoll over poll?,sockets,network-programming,polling,epoll,Sockets,Network Programming,Polling,Epoll,对于1到50个左右的描述符,我们有什么基准吗?我看到的大多数基准都是针对大量描述符100s..1000s 我目前正在使用16个描述符的poll,并考虑使用epoll来提高应用程序的速度 Please advise in 3 scenarios with 16 socket descriptors in the set for poll/epoll: 1. most of the sockets are active...>both should be same performance? 2
Please advise in 3 scenarios with 16 socket descriptors in the set for poll/epoll:
1. most of the sockets are active...>both should be same performance?
2. half active half idle....what is better here?
3. mostly idle...> clearly epoll is better ?
我非常怀疑从
poll()
切换到epoll()
不会对应用程序的性能产生任何影响。epoll()
的主要优点是,当您有许多文件描述符(数百或数千个)时,标准的poll()
需要在每次调用时多做一些工作,而epoll()
则提前进行设置-只要您不更改正在监视的文件描述符集,每次通话都会稍微快一点。但一般来说,这种差异只对许多文件描述符明显
请记住,如果您正在查看的文件描述符集经常更改,epoll()
的主要优势将丢失,因为您仍然需要将新的文件描述符传递到内核中。因此,如果你正在处理大量的短期连接,那么切换到它就更没有吸引力了
另一个区别是epoll()
可以是边缘触发的,其中调用仅在描述符上发生新活动时返回;或者级别触发的,其中调用在描述符读/写就绪时返回。标准的poll()
调用始终是级别触发的。然而,对于大多数人来说,级别触发是他们想要的-边缘触发接口偶尔有用,但在大多数情况下,它们会导致争用条件,即数据在读取后但在进入epoll()
调用之前到达套接字。我的建议是远离边缘触发代码,除非你真的,真的知道自己在做什么
您为epoll()
付出的代价是缺乏可移植性,poll()
和select()
都是标准的POSIX接口,因此使用它们您的代码将更具可移植性。另一方面,epoll()
调用仅在Linux上可用。其他一些Unix变体也有自己的等效机制,例如FreeBSD上的kqueue,但在这种情况下,您必须为每个平台编写不同的代码
我的建议是,在您使用许多文件描述符之前,甚至不要担心epoll()
——说真的,几乎可以肯定的是,在您的代码中还有许多其他地方可以进行更大的性能改进,而且对于您的用例来说,epoll()
可能不会更快
如果你到达了一个你处理很多连接的阶段,而你的代码的其余部分已经非常理想,那么你首先应该考虑的是一个跨平台的接口,它在每个特定的平台上使用最好的性能调用。这比直接使用
epoll()
要简单得多,即使您只想支持Linux
到目前为止,我没有提到您提到的三种场景,因为我认为对于数量较少的文件描述符(如16),它们中的任何一种都不会有任何不同。对于大量文件描述符,epoll()
的性能应优于poll()
,尤其是在大多数文件描述符空闲的情况下。如果所有文件描述符始终处于活动状态,则两个调用都需要遍历每个连接来处理它。但是,随着空闲连接比例的增加,epoll()
提供了更好的性能,因为它只返回活动的连接-使用poll()
您仍然需要遍历所有连接,其中大多数连接都将被跳过,但epoll()
只返回您需要处理的连接(不超过您可以指定的最大限制)
要明确地说明这一点(正如我上面提到的,这仅与大量连接相关):
epoll()
epoll()
会更好一些epoll()
在这里肯定会更好您可能希望看到哪个是libevent作者提供的,并显示了随着文件描述符数量的变化处理事件的相对开销。请注意所有行是如何围绕原点汇合的,这表明所有机制都可以在少量描述符的情况下实现可比性能。我只使用了16个描述符如果有任何差异,你会感到惊讶。你需要成百上千个。你有任何证据表明
poll()
是你目前的瓶颈吗?@EJP我没有遇到任何瓶颈。我只是在想,如果我切换到epoll,我是否可以压缩一点性能。