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

 

什么是缓存 I/O (Buffered I/O)


缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间写的过程就是数据流反方向。缓存 I/O 有以下这些优点:

  1. 缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备。
  2. 缓存 I/O 可以减少读盘的次数,从而提高性能。

对于读操作:当应用程序要去读取某块数据的时候,如果这块数据已经在页缓存中,那就返回之。而不需要经过硬盘的读取操作了。如果这块数据不在页缓存中,就需要从硬盘中读取数据到页缓存。

对于写操作:应用程序会将数据先写到页缓存中,数据是否会被立即写到磁盘,这取决于所采用的写操作机制:

  • 同步机制:数据会立即被写到磁盘中,直到数据写完,写接口才返回;
  • 延迟机制:写接口立即返回,操作系统会定期地将页缓存中的数据刷到硬盘。所以这个机制会存在丢失数据的风险。想象下写接口返回的时候,页缓存的数据还没刷到硬盘,正好断电。对于应用程序来说,认为数据已经在硬盘中。

 

缓存 I/O 的缺点


在缓存I/O的机制中,以写操作为例,数据先从用户态拷贝到内核态中的页缓存中,然后又会从页缓存中写到磁盘中,这些拷贝操作带来的CPU以及内存的开销是非常大的。对于某些特殊的应用程序来说,能够绕开内核缓冲区能够获取更好的性能,这就是直接I/O出现的意义。

 

直接IO绕开磁盘高速缓存


凡是通过直接I/O方式进行数据传输,数据直接从用户态地址空间写入到磁盘中,直接跳过内核缓冲区。对于一些应用程序,例如:数据库。他们更倾向于自己的缓存机制,这样可以提供更好的缓冲机制提高数据库的读写性能。

顾名思义直接落盘

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

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

 

直接I/O 优点


最大的优点就是减少操作系统缓冲区和用户地址空间的拷贝次数。降低了CPU的开销,和内存带宽。对于某些应用程序来说简直是福音,将会大大提高性能。

 

直接I/O 缺点


直接IO并不总能让人如意。直接IO的开销也很大,应用程序没有控制好读写,将会导致磁盘读写的效率低下。磁盘的读写是通过磁头的切换到不同的磁道上读取和写入数据,如果需要写入数据在磁盘位置相隔比较远,就会导致寻道的时间大大增加,写入读取的效率大大降低。

 

具体应用场景


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

操作系统内核通常尝试优化和缓存任何读/写请求。 由于数据在内核中缓存,对同一位置的任何后续读取请求将更快,因为不需要再从磁盘读取信息。

直接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版本运行良好。在此文件系统下,大小应增加到4KB。 

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值