Nginx 中的 worker_aio_requests 指令是什么?

Nginx 中的 worker_aio_requests 指令是什么?

假设我正在使用像 Ubuntu 14.04 这样的现代 Linux 发行版,并且假设我正在使用 epoll() 系统调用,那么 worker_aio_requests 会做什么?

文档说:

如果您将 aio 与 epoll 连接处理方法一起使用,则此指令设置单个工作进程的最大未完成异步 I/O 操作数。

当我第一次读到这个时,我认为这意味着对于给定的工作进程,当连接到达时,在连接的生命周期内,它会检查它是否已准备好读取或写入,如果没有,则将其放入事件队列中。工作进程继续接受连接。当该特定连接准备好读取或写入时,内核会通过系统调用通知,然后工作进程会处理数据。因此,该指令将引用事件队列中允许的未完成 I/O 操作的数量。

但我不认为这是它的作用,因为我认为这是worker_connections事件模块的指令的作用。所以我对什么worker_aio_requestsworker_connections做什么感到困惑?

答案1

想象一下通过持久的 http 连接在一个页面上发送数百张图像。一个客户端连接到工作器,但它执行许多 I/O。最好不要阻塞这些读取,这样工作器就不必等待。

IBM developerWorks 关于 AIO 的文章对异步与阻塞有一个很好的概述。

在这种情况下,nginx 使用至少两个 I/O 接口,epoll() 用于接受连接,AIO 用于提供文件等。监听许多文件描述符与将大量 I/O 排队到其他文件描述符之间存在实现差异。

读取 ngx_epoll_module.c,worker_aio_requests 被馈送到 io_setup() 系统调用。这会导致每个 worker 都设置了宣传的那么多异步操作。

通常,人们会使用 libaio 来实现这一点,尽管 nginx 似乎会绕过它并使用系统调用。接口的这种差异和其他一些怪癖导致暴露了多个配置指令,因此您可以调整工作连接和并发 I/O。

相关内容