3

我一直在使用 select 来处理连接,最近我们的套接字库发生了变化,select 被 Linux 平台的 epoll 取代。

我的应用程序架构是这样的,我只建立一个或最多 2 个套接字连接,并在单个线程中对它们进行 epoll/select。

现在随着最近切换到 epoll,我注意到应用程序的性能有所下降,我真的很惊讶,并期待性能上升或保持不变。我尝试查看其他各个部分,这是唯一改变的代码部分。

如果用于非常少量的套接字(如 1 或 2),epoll 在速度方面是否会降低性能。

还有一点需要注意的是,我在同一个盒子(8 个 cpu 核心)上运行了大约 125 个这样的进程。这可能是在同一台机器上执行 epoll_wait 的进程太多的情况,当我使用 select 时,这个设置是相似的。

我注意到在盒子上平均负载要高得多,但 cpu 使用率却完全相同,这让我认为更多的时间花在 I/O 上,并且可能来自与 epoll 相关的更改。

关于我应该多看什么来确定问题的任何想法/指针。

虽然增加的绝对延迟非常小,比如平均 1 毫秒,但这是一个实时系统,这种延迟通常是不可接受的。

谢谢

你好,

在最新的发现上更新这个问题,除了从 select 切换到 epoll 我发现另一个相关的变化,select 的早​​期超时是 10 毫秒,但使用 epoll 的方式超时比以前小得多(比如 1 micro..),可以设置太低select 或 epoll 超时导致性能下降?

谢谢

4

1 回答 1

3

从它的声音来看,吞吐量可能不受epoll()vs的影响select(),但您会发现个别请求中的额外延迟似乎与使用epoll().

我认为在只看一两个套接字的情况下,epoll()应该表现得差不多select()epoll()应该在您观看更多描述符时线性缩放,而select()缩放很差(甚至可能对 #/descriptors 有硬限制)。因此,这并没有epoll()对少量描述符造成惩罚,但select()在这种情况下它失去了性能优势。

您能否更改代码以便可以轻松地在两种事件通知机制之间来回切换?获取有关性能差异的更多数据。如果您最终发现select()在您的情况下具有更少的延迟和相同的吞吐量,那么我会毫不犹豫地切换回“旧且已弃用”的 API :) 对我来说,如果您测量与此特定代码更改的性能差异,这是相当决定性的. 也许之前对epoll()vs的测试select()集中在单个请求的吞吐量和延迟上?

于 2011-11-24T04:11:46.307 回答