Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets n个文件描述符之后最好切换到epoll over poll?_Sockets_Network Programming_Polling_Epoll - Fatal编程技术网

Sockets n个文件描述符之后最好切换到epoll over poll?

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

对于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. 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,我是否可以压缩一点性能。