Nginx I/O优化之异步IO

异步I/O


传统:在用户空间发起了read调用,用户空间这个进程就会被阻塞,阻塞之后就开始去读磁盘,将磁盘内容读到磁盘高速缓冲区,然后再读到用户缓冲区。整个这个流程结束再唤醒该用户进程,该用户进程再去做其他操作了。

异步I/O:在调取read的时候,用户进程可以处理其他任务,不会阻塞。

#在开启异步I/O的时候可以设定线程池
Syntax: aio on | off | threads[=pool];
Default: aio off;
Context: http, server, location

Syntax: aio_write on | off;
Default: aio_write off;
Context: http, server, location

线程池 


使用需要编译添加--with-threads,这样就可以采用多线程方式了。正常情况下任务是在worker进程里面执行的,但是对于某些任务的执行可能造成进程阻塞。为了避免这种情况派生出一堆线程去处理该任务。

Nginx官方的模块都是非阻塞的,为什么会出现阻塞?这是因为nginx用来做静态资源处理了太多的文件,这些文件特别多,阻塞了。

线程池的使用场景是用在做静态资源服务读取文件。

异步I/O允许进程进行不受阻塞或不需要等待I/O完成的I/O操作。aio命令可在NGINX配置的http,server和location区块下使用。 根据在指令所在区块,该指令将为匹配的请求执行异步I/O。 该参数适用于Linux内核2.6.22+和FreeBSD 4.3。 如下代码:

location /data {
     aio on;
}

默认情况下,该参数设置为off。 在Linux上,aio需要启用direction,而在FreeBSD上,sendfile需要禁用以使aio生效。
该指令具有特殊的线程值,可以为发送和读操作启用多线程。 多线程支持仅在Linux平台上可用,并且只能与处理请求的epoll,kqueue或eventport方法一起使用。
为了使用线程值,在编译Nginx时使用–with-threads选项配置多线程支持。 在NGINX全局上下文中使用thread_pool指令添加一个线程池。 在aio配置中使用该线程池:

thread_pool io_pool threads=16;
   http{
   ........
      location /data{
        sendfile    on;
        aio        threads=io_pool;
} }

总结


  1. 异步io,aio

    • 在发生io阻塞的时候,让其去处理其他任务,
    • aio on|off threads=[pool],server模块中配置
    • nginx的worker进程发生io阻塞以后,把阻塞io的任务放入到一个新的队列中,利用线程去处理这些阻塞io的任务,完成后返回给nginx
    • 定义线程池

      • thread_pool name threads=number [max_queue=number]; 在main中定义
      • 默认配置thread_pool default threads=32 max_queue=65535;
      • aio on threads=default; 使用线程
    • 需要nginx有threads和file-aio模块
    • aio和直接io,两个必须同时出现
    • sendfile和直接io是互斥的,两个不能同时存在,直接io不经过磁盘io,0拷贝时从磁盘io直接发送到socket,所以存在互斥性 


 

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/106895609
今日推荐