水平触发或边缘触发更高效吗?

时间:2012-12-12 20:36:21

标签: c linux epoll

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

主要是我正在考虑“高性能”:

  1. 无需降级即可处理多个连接。

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

  3. 我实际上更关心#2,但#1也很重要。

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

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

    我一直在努力工作(妄想?)边缘触发应该更高效,因为将会收到更少的中断。这是正确的假设吗?

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

    让我更加怀疑的是,水平触发的epoll在我看到的一些基准测试中表现得更好。

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

    编辑:

    我的套接字是非阻塞的。

3 个答案:

答案 0 :(得分:8)

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

对于边缘触发,你总是要耗尽输入缓冲区,所以你有一个无用的(只返回EWOULDBLOCK)recv系统调用。但是对于级别触发,您可能会使用更多epoll_wait系统调用。正如man page指出的那样,在水平触发模式下避免饥饿可能会稍微容易一些。

真正的区别在于,当你想要使用多个线程时,你必须使用边缘触发模式(尽管你仍然需要小心正确的同步)。

答案 1 :(得分:3)

只有当您使用长期会话并且由于缓冲区已满/空(通常使用代理)而被迫不断停止/启动时,差异才会显示。当你这样做时,你经常需要一个事件缓存,当你的事件缓存处理事件时,你可以使用ET并避免所有epoll_ctl(DEL)+ epoll_ctl(ADD)舞蹈。对于短期会话,节省的费用不那么明显,因为对于ET,您至少需要一次epoll_ctl(ADD)调用才能在FD上进行轮询,如果您不期望在会话期间有更多的话(例如:大部分时间交换都小于缓冲区),那么你不应该期待任何差异。您的大部分节省通常来自使用事件缓存,因为您可以经常执行大量操作(例如:写入)而无需轮询内核缓冲区。

答案 2 :(得分:1)

当用作边缘触发接口时,出于性能原因,它 可以在 epoll 接口中添加文件描述符 (EPOLL_CTL_ADD) 通过指定 (EPOLLIN|EPOLLOUT) 一次。这让你 避免在 EPOLLIN 和 EPOLLOUT 调用之间不断切换 epoll_ctl(2) 和 EPOLL_CTL_MOD。

Q9 我是否需要连续读/写文件描述符直到 EAGAIN 使用 EPOLLET 标志时(边缘触发行为)?

pdfdocument.write(outputstream)