2017-05-11 30 views
0

我的应用程序可作为系统上运行的其他应用程序的高性能服务器。在开发过程中,我测量了大约30%的核心仅用于调用eventfd_write(),因此试图使用libaio使用单个系统调用编写多个evenfd。然后我发现AIO不支持eventfd。使用Linux AIO写入eventfd

有没有明显的障碍没有实现AIO的eventfd或只是没有人需要这个呢?

您是否知道尝试为eventfd实现AIO的任何现有工作?

+2

读/写从/向eventfd只处理读取或写入RAM中的8字节整数。我想通过AIO做同样的事情会增加不成比例的开销。因此,使用AIO没有任何好处。 – user803422

+0

是的,我知道,但是当每秒发出1M eventfd_writes到大约30或更多不同的eventfd时,它会在每个系统调用都会启动metter,这就是为什么要通过一次性发出几个写入来减少系统调用次数的原因。 – BeginEnd

+1

“1M eventfd_writes per second”←有你的问题。你真的有1M个不同的活动吗?还是他们经常阅读? –

回答

0

尽管写入eventfd只是写入内存,写入本身却是一个系统调用。因此,您必须切换上下文,跳转到内核,快速写入,然后切换回用户空间应用程序。

上下文切换花费很多,更多的只是一个64位写入。

我们有什么选择?

  1. 不要使用eventfd,在共享存储器中使用的原子标记。您将消除系统调用,并且您的性能将显着提高。

  2. 不要写入eventfd每个事件:

    • 考虑,以便将事件批次,每批次只有一次写。
    • 考虑在有一个非空的事件队列后切换到轮询模式,然后在队列再次为空时切换回来。
  3. 将eventfd写入单独的线程(如果它在上下文中有意义)。

我相信你知道你的应用程序更好,这样你会拿出一些更优化...如果没有 - 只是要求在StackOverflow上;)