linuxio协议栈裸设备读写数据库公认最快的IO方式就是读写裸设备。Oracle数据库通常将所有日志和数据存储在原始设备上。什么是裸设备在Unix/Linux中,文件分为两类:字符设备文件和块设备文件。裸设备是一种特殊的块设备文件,没有经过格式化,无法被Unix通过文件系统读取,也叫原始分区(originalPartition),通过字符设备驱动读写裸设备裸设备Raw的优点设备不受Unix/Linux文件系统管理,节省了文件管理的开销;文件系统是对物理磁盘的抽象,并为这个抽象维护一套逻辑,需要一定的开销;裸设备的操作不经过系统缓冲区,数据直接在ORACLE数据缓冲区(BUFFERCACHE)和磁盘之间传输,可以在一定程度上提高I/O性能,适用于大型IO数量的缺点容量管理在某些场景下使用不方便。容量管理需要提前规划。原始设备的创建和扩展等操作需要root权限。写日志是数据库常用的保证可靠性的重要方法之一。原因是文件系统本身不可靠。因此,事务需要使用日志来保证一致性。可以参考崩溃一致性。很多情况下,可以认为文件写入已经完成。异常发生恢复后,会发现写入不成功。日志记录和非日志记录文件系统日志文件系统将跟踪和记录文件更改。理论上,同样大小的文件,日志文件系统占用的空间会稍微大一些,但是文件日志提供了快速恢复等功能。对于非日志文件系统,当执行写入时,操作系统首先修改文件系统的元数据,然后写入实际数据。如果元数据被修改,系统崩溃或机器掉电,文件系统可能被损坏。与非日志文件系统相比,日志文件系统会多出一个日志区用于写日志,可以根据需要选择先写。先记录或写入数据。大多数日志文件系统都支持三种日志方式,即回写式、顺序式和全日志式。默认是顺序模式,即先写数据再写日志。Linuxext2/ext3/ext4都是日志型WindowsNTFS也是日志型文件系统。日志算法WAL:Write-AheadLogging,预写日志系统,HBase和MySQL都使用WAL,具体过程是先写日志再修改记录;事务提交过程在这个过程中,需要保证先把日志放到磁盘上,这样事务提交才算完成。通过WAL方式,可以在保证事务特性的同时提高数据库的性能。BufferedIO/non-bufferedIO/directIObuffered/non-bufferedIOLinux对IO文件的操作分为uncachedIO操作(文件IO)和bufferedIO(标准IO)。StandardIO符合ANSIC标准,不依赖系统内核,可移植性强,可以减少读写的系统调用次数,读写文件时在用户层创建缓冲区。不带缓存的IO不直接对磁盘进行操作,但是用户层不缓存,内核还是有缓存的(系统调用)。操作系统会将IO数据缓存在文件系统的页面缓存(pagecache)中。两者的区别是没有cache的IO每次写入都会写入,而标准IO是有buffer的,当buffer满了或者程序flush/close时才会写入磁盘;最终会调用无缓冲的C标准I/O库函数,包括open、read、write和close标准IO等系统函数调用malloc来分配缓存,共有三种类型:fullcache:当标准I/O缓存被填满,I/O操作被执行。磁盘上的文件通常是全缓存行缓存:当输入输出遇到换行符或缓冲区满时,实际的I/O由标准I/O库执行。常见的Stdin/Stdout通常是行缓冲和非缓冲的:相当于读/写调用。stderr通常是无缓冲的,因为它必须尽快输出Stdin/Stdout默认情况下是完全缓冲的,但在终端中行缓冲。linux中linebuffer的大小是1k,fullbuffer的大小是4k。由于linux的惰性机制,只有在执行实际输入/输出时才分配缓冲区。缓存I/O在一定程度上隔离了内核空间和用户空间,保护了系统的安全;它可以减少磁盘读取次数,从而提高性能。但另一方面,DMA是从磁盘读取数据到pagecache或者直接将pagecache中的数据写回磁盘,而不是直接在应用程序地址空间和磁盘之间进行数据传输,会有很大的多个副本的cpu和内存开销。数据流向:无缓存IO:数据->内核缓冲区->磁盘标准IO:数据->流缓存区->内核缓存区->磁盘CIO/DIOCIO/DIO技术一般用在数据库中,如读写原始设备的写入。DIO是直接IO。DIO直接与硬盘交互,直接读取磁盘数据到用户空间的缓冲区或者用户空间的内存直接写入磁盘,使用用户自己的缓存,而不是内核缓存。CIO即并发IO。当一个文件被多个进程同时访问时,就会出现inode竞争的问题。读操作使用共享锁,可以并发执行多个读操作,而写操作使用排它锁。当锁被写入进程占用时,其他所有操作都被阻塞,整个应用程序的性能会大大降低。当文件系统支持CIO并启用CIO时,CIO会默认启用文件系统的DIO,存储数据时不会经过数据缓冲区,串行执行。因此,无需考虑文件系统层面的数据一致性。CIO的实现依赖底层驱动未完待续参考UseconcurrentI/OtoimproveDB2databaseperformancelinuxio协议栈图
