提高磁盘 I/O 速度的途径
目录
参考资料:
文件系统的性能可表现在多个方面,其中至关重要的一个方面是对文件的访问速度为了提高对文件的访问速度,可从三方面着手:
- 改进文件的目录结构以及检索目录的方法来减少对目录的查找时间。
- 选取好的文件存储结构,以提高对文件的访问速度。
- 提高磁盘的 I/O 速度,能将文件中的数据快速地从磁盘传送到内存中。
目前,磁盘的 I/O 速度远低于对内存的访问速度,通常要低上 4 ~ 6 个数量级。因此磁盘的 I/O 已成为计算机系统的瓶颈。
1 磁盘高速缓存(Disk Cache)
磁盘高速缓存,是指在内存中为磁盘盘块设置的一个缓冲区,在缓冲区中保存了某些盘块的副本。
在设计磁盘高速缓存时需要考虑的问题有:
- 如何将磁盘高速缓存中的数据传送给请求进程。
- 采用什么样的置换策略。
- 已修的盘块数据在何时被写回磁盘。
1.1 数据交付(Data Delivery)方式
所谓的数据交付就是指将磁盘高速缓存中的数据传送给请求者进程。系统可以采取两种方式将数据交付给请求进程:
数据交付:这是直接将高速缓存中的数据传送到请求者进程的内存工作区中。
指针交付:只将指向高速缓存中某区域的指针交付给请求者进程。
指针交付方式由于所传送的数据量少,因而节省了数据从磁盘高速缓存存储空间到进程的内存工作区的时间。
1.2 置换算法
常用的置换算法有最近最久未使用算法 LRU、最近未使用算法 NRU 及最少使用算法 LFU 等。
系统在设计高速缓存的置换算法时,除了考虑到最近最久未使用这一原则外,还需要考虑以下几点:
- 访问频率
通常,联想存储器的访问频率基本上与指令执行的频率相当。而对磁盘高速缓存的访问频率,则与磁盘 I/O 的频率相当。所以,对联想存储器的访问频率远远高于对磁盘高速缓存的访问频率。
- 可预见性
哪些数据可能在较长时间内不会再被访问,有哪些数据可能很快就再被访问,会有相当一部分是可预知的。
- 数据的一致性
存放在缓存中的数据如果已被修改,但尚未拷回磁盘,当系统发生故障后,可能造成数据的不一致性。
1.3 周期性地写回磁盘
根据 LRU 算法,有些经常要被访问的盘块数据可能会一直保留在高速缓存中,长期不会被写回磁盘。因为链中任一元素在被访问之后,又会被挂到链尾而不被写回磁盘,只有一直未被访问的元素才有可能移到链首,而被写回磁盘。
为了解决这一问题,在 UNIX 系统中专门增设了一个修改(update)程序,使之在后台运行,该程序周期性地调用一个系统调用 SYNC。其主要功能是强制性地将所有在高速缓存中已修改的盘块数据写回磁盘。一般是把两次调用 SYNC 的时间间隔定为 30s。这样,因系统故障所造成的工作损失不会超过 30s 的工作量。
定期写回,但是不能确保数据不丢失
2 提高磁盘 I/O 速度的其它方法
2.1 提前读
如果是采用顺序访问方式对文件进行访问,便可以预知下一次要读的盘块。此时可采取预先读方式,即在读当前块的同时,还要求将下一个盘块(提前读的块)中的数据也读入缓冲区,从而大大减少了读数据的时间。
2.2 延迟写
延迟写是指把本应立即写回磁盘的缓冲区数据,改为将它挂在空闲缓冲区队列的末尾,直到把该缓冲区作为空闲缓冲区分配出去,才进行写回。
缓冲区数据驻留内存的好处是任何访问该数据的进程,都可直接读出其中的数据而不必访问磁盘。这样,又可进一步减少磁盘的 IO 时间。
2.3 优化物理块的分布
思想:将两个数据块安排在属于同一条磁道的两个盘块上,由于消除了磁头在磁道间的移动,而大大提高对这两个盘块的访问速度。
顺序写,减少磁头的平均移动距离。
2.4 虚拟盘
所谓虚拟盘就是利用内存空间去仿真磁盘,又称为 RAM 盘。
虚拟盘的主要问题是:它是易失性存储器,故一旦系统或电源发生故障,或系统再启动时,原来保存在虚拟盘中的数据将会丢失。因此,虚拟盘通常用于存放临时文件,如编译程序所产生的目标程序等。
虚拟盘与磁盘高速缓存的主要区别在于:虚拟盘中的内容完全由用户控制,而磁盘高速缓存中的内容则是由 OS 控制的。例如,RAM 盘在开始时是空的,仅当用户(程序)在 RAM 盘中创建了文件后,RAM 盘中才有内容。
3 廉价磁盘元余阵列(RAID)
思想:如果使用一个组件对性能的改进受到了很大的限制,那么可通过使用多个相同的组件来获得性能的大幅度提高。
如单处理机系统 -> 多处理机系统,分布式系统
廉价磁盘冗余阵列(RedundantArray of Inexpensive Disk,RAID),是由多个小磁盘组成的一个大容量的磁盘存储器。
RAID 不仅是大幅度地增加了磁盘的容量,而且也极大地提高了磁盘的 I/O 速度和整个磁盘系统的可靠性。
并行交叉存取:在一个系统中,有多台磁盘驱动器,系统将每一盘块中的数据分为若干个子盘块数据,再把每一个子盘块的数据分别存储到各个不同磁盘中的相同位置上。以后当要将一个盘块的数据传送到内存时,采取并行传输方式,将各个盘块中的子盘块数据同时向内存中传输,从而使传输时间大大减少。