Posts in category I/O系统
Linux内核文件Cache机制
在我们使用Linux时,使用free命令观察系统内存使用情况,如下面空间内存为66053100k。可能很多同事都遇到过一个问题,发现随着时间的推移,内存的free越来越小,而cached越来越大;于是就以为是不是自己的程序存在内存泄漏,或者是硬件、操作系统出了问题?显然,从这里看不出用户程序是否有内存泄漏,也不是内核有Bug或硬件有问题。原因是内核的文件Cache机制。实际上文件Cache的实现是页面Cache,本文后续都以页面Cache来描述。
READ MORE »Linux内核I/O调度层
I/O调度器的工作是管理块设备的请求队列。它决定队列中的请求排列顺序及在什么时候派发请求到块设备。这样做有利于减少磁盘寻址时间,从而提高全局吞吐量。注意“全局”的的含义,I/O调度器可能为了提高系统整体性能,而对某些请求不公。 I/O调度器通过两种方法减少磁盘寻址时间:合并(merging)与排序 (sorting)。合并指将两个或多个请求结合成一个新请求。考虑一下这种情况,文件系统提交请求到请求队列—从文件中读取一个数据区,如果这时队列中已经存在一个请求,它访问的磁盘扇区和当前请求访问的磁盘扇区相邻,那么这两个请求就可以合并为一个对单个或多个相邻磁盘扇区操作的新请求。通过合并请求,I/O调度器将多次请求的开销压缩为一次请求的开销。更重要的是,请求合并后只需要传递给磁盘一条寻址命令,就可以访问到请求合并前必须多次寻址才能访问完的磁盘区域了,因此合并请求显然能减少系统开销和磁盘寻址次数。 SSD是否经过I/O调度器?当块设备请求队列拥塞时,内核如何处理? 完整文档下载:Linux内核I/O调度层
READ MORE »FlashCache性能提升评估
使用FlashCache后,I/O性能提升评估可以用以下公式: f(ssd):SSD IOPS f(hdd): HDD IOPS α :Cache命中率 f(flashcache):FlashCache IOPS 说明: 1、Cache命中率α越大,FlashCache IOPS越大; 2、SSD IOPS性能f(ssd)越大,FlashCache IOPS越大; 3、相比SSD IOPS,Cache命中率α越对FlashCache性能影响最大。
READ MORE »Linux通用块设备层
在块设备上的操作,涉及内核中的多个组成部分,如图1所示。假设一个进程使用系统调用read()读取磁盘上的文件。下面步骤是内核响应进程读请求的步骤; (1)系统调用read()会触发相应的VFS(Virtual Filesystem Switch)函数,传递的参数有文件描述符和文件偏移量。 (2)VFS确定请求的数据是否已经在内存缓冲区中;若数据不在内存中,确定如何执行读操作。 (3)假设内核必须从块设备上读取数据,这样内核就必须确定数据在物理设备上的位置。这由映射层(Mapping Layer)来完成。 (4)此时内核通过通用块设备层(Generic Block Layer)在块设备上执行读操作,启动I/O操作,传输请求的数据。 (5)在通用块设备层之下是I/O调度层(I/O Scheduler Layer),根据内核的调度策略,对等待的I/O等待队列排序。 (6)最后,块设备驱动(Block Device Driver)通过向磁盘控制器发送相应的命令,执行真正的数据传输。 对于(1)、(2)两个步骤,在Linux虚拟文件系统中,我们讨论了VFS(Virtual Filesystem Switch)主要数据结构和操作,结合相关系统调用(如sys_read()、sys_write()等)的源码,我们不难理解VFS层相关的操作和实现。而对于第(3)步中的Mapping Layer需要结合具体的文件系统解释,我们暂时不考虑。 本文主要分析(4)步,就是通用块设备层。 完整文档下载:Linux通用块设备层
READ MORE »Linux内核读文件过程
我们对系统调用read()非常熟悉,也常听说“零拷贝”。在看Linux内核源码时,有很多人会有一些困惑:比如读文件的整个流程是怎样的?内核是如何Cache已经读取的文件数据?驱动从磁盘上读取的数据是否会直接写到用户的缓冲区中?内核是在哪个地方分配空间来存储将要读取的数据?是在哪个地方将当前进程阻塞,直至读取数据结束?“零拷贝”是如何实现的? 本文以Redhat Enterprise Linux 6 Update 3内核版本2.6.32-279.el6.x86_64为例,分析从用户进程通过read()读取文件,直至数据返回给用户的整个流程。 目 录Table of Contents 1 概述… 4 2 虚拟文件系统与ext4文件系统层… 6 2.1 sys_read()… 6 2.1.1 fget_light()和fput_light()… 7 2.2 vfs_read()… 8 2.3 do_sync_read()… 10 2.3.1 异步I/O.. 10 2.3.2 do_sync_read()… 12 2.4 generic_file_aio_read()… 14 2.5 do_generic_file_read()… 17 2.5.1 address_space->readpage()方法… 24 2.5.2 file_read_actor()… 25 2.6 […]
READ MORE »Linux内核写文件过程
用户进程通过系统调用write()往磁盘上写数据,但write()执行结束后,数据是否立即写到磁盘上?内核读文件数据时,使用到了“提前读”;写数据时,则使用了“延迟写”,即write()执行结束后,数据并没有立即立即将请求放入块设备驱动请求队列,然后写到硬盘上。 本文以Redhat Enterprise Linux 6 Update 3内核版本2.6.32-279.el6.x86_64为例,分析内核写文件过程。 目 录Table of Contents 1 概述… 4 2 虚拟文件系统与ext4文件系统层… 7 2.1 sys_write()… 7 2.2 vfs_write()… 8 2.3 do_sync_write()… 9 2.4 ext4_file_write()… 10 2.4.1 Ext4文件系统extent特性… 10 2.4.2 ext4_file_write()函数分析… 13 2.5 generic_file_aio_write()… 15 2.6 __generic_file_aio_write()… 16 2.7 generic_file_buffered_write()… 19 2.8 generic_perform_write()… 20 2.8.1 ext4文件系统address_space_operations. 20 2.8.2 […]
READ MORE »Linux内核延迟写机制
在分析sys_write()的源码过程中,generic_perform_write()函数执行完后,会逐 层返回,直至sys_write()返回,系统调用结束。但此时要写的数据,只是拷贝到内核缓 冲区中,并将相应的页标记为脏;但数据并未真正写到磁盘上。那么何时才会将数据写到磁 盘上,又由谁来负责将数据写到磁盘上呢?
READ MORE »Analysis of write amplification for synchronized write in Linux ext3/ext4 filesystems
Phenomenon: In ext3/ext4 file system, synchronized write performance of 4KB block size is about 50MB /s. However, Huawei ES3000 PCI-E SSD 4K synchronized write performance is almost 220MB /s . There is a performance gap between PCI-E SSD raw device and filesystems on it. Root Cause Analysis : 1. The 4K synchronized write performance […]
READ MORE »