Nginx I/O优化之直接I/O directio

 

直接IO绕开磁盘高速缓存


顾名思义直接落盘

  1. 直接io,绕开磁盘高速缓存

    • 正常情况下没有开启直接I/O,用户进程调用read方法,先从磁盘读取出到内核的缓冲区即磁盘高速缓存,然后读到用户存储空间缓冲区,这里其实是读了2次哦(先到磁盘高速缓存再到用户缓冲区),写和读一样也是两次。直接I/O让我们绕开了内核缓冲区,即磁盘高速缓存,当我们读的时候直接从磁盘读进来,写的时候从用户缓冲区直接写入磁盘。总结:我们可以让读写操作绕过内核缓冲区,直接读写用户缓冲去,提高速度,避免磁盘缓存页的拷贝
    • 传统走缓冲区未开启直接I/O方式好处是每次读取到缓冲区了,下次再读的话,命中到同一个缓冲区的内容就不需要读磁盘了,好处也是挺明显的,缺点是有两次拷贝
    • 高速缓冲区作用,某些文件存入高速缓冲区,可以复用,大文件直接读取,小文件缓存

 

具体应用场景


当我们的磁盘上有大量的大文件的时候,对于大文件很难拷贝到内存当中,即磁盘缓冲是无效的,如果每次拷贝一次没意义!比如每个文件都有几个G大小,压根不太可能在内存当中缓存住的,那么你每次读都是一个浪费,所以大文件都是直接启用直接I/O,这样就避免了两次拷贝。

操作系统内核通常尝试优化和缓存任何读/写请求。 由于数据在内核中缓存,对同一位置的任何后续读取请求将更快,因为不需要再从磁盘读取信息。
直接I/O是文件系统的一个功能,其从应用程序到磁盘直接读取和写入,从而绕过所有操作系统缓存。 这使得更好地利用CPU周期和提高缓存效率。
该方法用于数据具有较差命中率的地方。 这样的数据不需要在任何高速缓存中,并且可以在需要时加载。 它可以用于提供大文件。 directio指令启用该功能。 该指令可用于http,server和location区块:

location /video/ {
     directio 4m;
}

任何大于指令中指定的文件将由直接I/O加载。 其它情况下禁用此参数。
直接I/O取决于执行数据传输时的块大小。 nginx有directio_alignment指令来设置块大小。 该指令可用于http,server和location区块:

location /video/ {
     directio 4m;
     directio_alignment 512;
}

除了XFS文件系统,默认值512字节在所有Linux版本运行良好。在此文件系统下,大小应增加到4 KB。 

默认直接I/O功能是关闭的,如果要使用需要配置size,比如size 200M,超过200M的内容才启用

Syntax: directio size | off;
Default: directio off;
Context: http, server, location


Syntax: directio_alignment size;
Default: directio_alignment 512;
Context: http, server, location

directio size|off,定义多大的文件直接io,如 directio 10m;
directioaligiunent 文件偏移量,默认的即可

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/106804472
I/O