Linux内核的文件预读剖析[多图]
2009-11-13 9:39:07 出处:https://www.yqdown.com
Linux文件预读算法硬盘
I/O性能的发展远远滞后于CPU和内存,因而成为当代
计算机系统的一个主要瓶颈。预读可以有效的减少硬盘
的寻道次数和使用
程序的I/O等待时间,是改良
硬盘
读I/O性能的主要
优化手段之一。本文作者是中国科学技能
大学自动化系的博士生,他在1998年开始学习Linux,为了优化服务器的性能,他开始尝试改良
Linux kernel,并最终重写了内核的文件预读部分,这些改良
被收入
到Linux Kernel 2.6.23及其后续版本中。
从寄存器、L1/L2高速缓存、内存、闪存,到硬盘
/光盘/磁带/存储网络,计算机的各级存储器硬件组成了一个金字塔结构。越是底层存储容量越大。然而访问速度也越慢,具体表现为更小的带宽和更大的延迟。因而这很自然的便成为一个金字塔形的逐层缓存结构。由此产生了三类基本的缓存管理和优化疑问
:
◆预取(prefetching)算法,从慢速存储中加载数据到缓存;
◆替换(replacement)算法,从缓存中丢弃无用数据;
◆写回(writeback)算法,把脏数据从缓存中保存到慢速存储。
其中的预取算法,在硬盘
这一层次尤为主要
。硬盘
的机械臂+旋转盘片的数据定位与读取方式,决定了它最突出的性能特点:擅长顺序读写,不善于随机I/O,I/O延迟非常大。由此而产生了两个方面的预读需求。
来自硬盘
的需求
基本
的说,硬盘
的一个典型I/O操作由两个阶段组成:
1.数据定位
平均定位时间主要由两部分组成:平均寻道时间和平均转动延迟。寻道时间的典型值是4.6ms。转动延迟则取决于硬盘
的转速:普通7200RPM桌面硬盘的转动延迟是4.2ms,而高端10000RPM的是3ms。这些数字多年来一直徘徊不前,大概今后也不能
有大的改善了。在下文中,我们不妨运用
8ms作为典型定位时间。
2.数据传输
持续传输率主要取决于盘片的转速(线速度)和存储密度,最新的典型值为80MB/s。虽然硬盘
转速难以提高,但是存储密度却在逐年改善。巨磁阻、垂直磁记录等一系列新技能
的采用,不但大大提高了硬盘
容量,也同时带来了更高的持续传输率。
显然,I/O的粒度越大,传输时间在总时间中的比重就会越大,因而硬盘
运用
率和吞吐量就会越大。基本
的估算结果如表1所示。如果执行
大量4KB的随机I/O,那么硬盘
在99%以上的时间内都在忙着定位,单个硬盘
的吞吐量不到500KB/s。但是当I/O大小达到1MB的时候,吞吐量可接近50MB /s。由此可见,采用更大的I/O粒度,可以把硬盘
的运用
效率和吞吐量提高整整100倍。因而必须尽一切可能防止
小尺寸I/O,这正是预读算法所要做的。
分享到