c - 使用 Linux AIO 写入 eventfd

标签 c linux performance linux-kernel aio

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

不为 eventfd 实现 AIO 是否有任何明显的障碍,或者只是暂时没有人需要它?

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

最佳答案

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

上下文切换的成本很高,远远超过单次 64 位写入。

我们有哪些选择?

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

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

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

我相信您更了解您的应用程序,因此您会想出更多的优化...如果没有 - 只需在 StackOverflow 上询问即可;)

关于c - 使用 Linux AIO 写入 eventfd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922859/

相关文章:

c++ - 从基本的 c/cpp Linux 应用程序中公开状态信息

c - 重温 C 中的解析输入

linux - 是否可以在 Linux 中设置 2 JAVA_HOME?

c++ - 获取运行特定进程的处理器数量

django - 如何消除循环中django查询的低效率?

c - 奇怪的十六进制到十进制的转换

c - 将 makefile 输出获取到上面的目录

java - 如何删除旧版本的Java并安装新版本

c - 我们什么时候需要在信号处理程序中再次建立信号功能?

performance - Cassandra 读/写带宽