IO有Buffered IO 和 Direct IO:
- buffered IO:在读写的时候回经过一个page Cache
- Direct IO:是绕过page Cache,直接对磁盘操作,所以性能会差些。
查了一下,发现其实就是Buffered IO和Direct IO。 这两者有何区别呢?
打个比方:正常情况下磁盘上有个文件,如何操作它呢?
- 读取:硬盘->内核缓冲区->用户缓冲区
- 写回:用户缓冲区->内核缓冲区->硬盘
这里的内核缓冲区指的是page cache,说白了,也就是是DRAM。主要作用是它用于缓存文件内容,从而加快对磁盘上映像和数据的访问。
正常的系统调用read/write的流程是怎样的呢?
- 读取:硬盘->内核缓冲区->用户缓冲区;
- 写回:数据会从用户地址空间拷贝到操作系统内核地址空间的页缓存中去,这是write就会直接返回,操作系统会在恰当的时机写入磁盘,这就是传说中的Buffered IO。
然而对于[自缓存应用程序] [2]来说,缓存 I/O 明显不是一个好的选择。因此出现了DIRECT IO。然而想象一下,不经内核缓冲区,直接写磁盘,必然会引起阻塞。所以通常DIRECT IO与AIO会一起出现。
>Linux 异步 I/O 是 Linux 2.6 中的一个标准特性,其本质思想就是进程发出数据传输请求之后,进程不会被阻塞,也不用等待任何操作完成,进程可以在数据传输的时候继续执行其他的操作。相对于同步访问文件的方式来说,异步访问文件的方式可以提高应用程序的效率,并且提高系统资源利用率。直接 I/O 经常会和异步访问文件的方式结合在一起使用。
对于nginx来说,是否开启AIO要看具体使用场景:
- 正常写入文件往往是写入内存就直接返回,因此目前nginx仅支持在读取文件时使用异步IO。
- 由于linux AIO仅支持DIRECT IO,AIO一定回去从磁盘上读取文件。所以从阻塞wo

BufferedIO通过pageCache进行读写,而DirectIO绕过pageCache直接操作磁盘,可能造成性能下降。Linux的异步I/O(AIO)允许非阻塞操作,常与DirectIO结合使用,以提高效率。nginx中的AIO主要用于读取文件。mmap则将文件直接映射到内存,减少复制操作。使用异步I/O需考虑场景,避免不必要的复杂性。
最低0.47元/天 解锁文章
3819

被折叠的 条评论
为什么被折叠?



