水平触发还是边缘触发更高性能?

我想弄清楚什么是更高性能,边缘触发或水平触发epoll

主要是考虑“高性能”

  1. 能够处理多个连接而不降级。

  2. 能够保持每个入站消息的最高速度。

其实我更关心#2,但是#1也很重要。

我一直在使用单线程用户(使用epoll_wait接受/读取多个套接字连接)和多个生产者运行testing。

到目前为止,我没有看到任何区别,甚至达到1000个文件描述符。

我一直在这个想法(妄想?)下工作,那边缘触发应该是更高性能的,因为会收到更less的interupts。 这是一个正确的假设吗?

我的testing可能会掩盖性能差异的一个问题是,一旦收到消息,我就不会将消息发送给线程,因此减less中断并不重要。 我一直不愿意做这个testing,因为我一直在使用__asm__ rdtsc来获取我的“时间戳”,所以我不想要调和我的原始时间戳来自哪个核心。

是什么让我更加怀疑的是,在我看到的一些基准testing中,epoll的performance更好。

哪个更好? 在什么情况下? 有没有区别? 任何见解,将不胜感激。

编辑:

我的套接字是非阻塞的。

我不希望看到边缘和水平触发巨大的性能差异。

对于边缘触发,你总是不得不排空输入缓冲区,所以你有一个没用(只是返回EWOULDBLOCK)recv系统调用。 但是对于级别触发,您可能会使用更多的epoll_wait系统调用。 正如手册中指出的那样,在层级触发模式下避免饥饿可能会稍微容易些。

真正的区别是,当你想使用多线程时,你将不得不使用边缘触发模式(尽管你仍然要小心获得同步)。

只有在使用长时间的会话时才会看到差异,而且由于缓冲区已满/空(通常使用代理服务器),您必须不断停止/启动。 当你这样做的时候,你经常需要一个事件缓存,当你的事件缓存处理事件时,你可以使用ET并避免所有的epoll_ctl(DEL)+ epoll_ctl(ADD)跳舞。 对于短期会话来说,节省不太明显,因为对于ET,至少需要一个epoll_ctl(ADD)调用来启用对FD的轮询,并且如果在会话生命期间没有期望更多的话(例如:大部分时间交易都比缓冲区小),那么你不应该指望有什么区别。 大部分的储蓄通常只来自使用事件缓存,因为通常可以执行很多操作(例如:写入)而不需要轮询,这要归功于内核缓冲区。