转载:如何提升磁盘IO性能

如题所述

第1个回答  2022-06-01
目前,磁盘是机械操作的,主要是在读取和写入磁盘之前查找磁道的过程中。磁盘附带的读写缓存大小对磁盘读写速度至关重要。具有快速读写的磁盘通常具有较大的读写缓存。磁盘的查找过程是机械的,它确定其随机读写速度将明显低于顺序读写。当我们进行系统设计和实现时,我们需要考虑磁盘的这个特性。

FastDFS是一个开源且高效的分布式文件系统。它的初始实现,文件以散列模式随机分布到多个目录,后来又添加了顺序存储实践。通过比较测试,发现文件按目录顺序存储,写文件的效率明显高于目录随机存储的效率。

目前,磁盘顺序读取的速度还不错。例如,普通硬盘的IO可以达到每秒40~60MB,更好的硬盘可以达到每秒100MB左右。在多进程或多线程并发读取磁盘的情况下,随着并发数量的增加,磁盘IO效率将大大降低。主要是因为每次读取和写入,轨道可能具有大的偏移,并且轨道寻址时间增加,导致磁盘IO的性能急剧下降。对于此方案,优化方案是最小化并发读取和写入的进程或线程的数量。您可以使用锁定机制或专用磁盘IO线程来读取和写入磁盘。在FastDFS 2.x版本中,磁盘读取和写入是使用专用线程完成的。

为了充分利用多个磁盘的效率,建议不要使用传统的RAID方法。一个好的做法是分别安装每个磁盘,并通过程序控制多个磁盘的并发读写。使用单个磁盘安装,可以使用多台计算机实现文件备份和冗余。

在大量文件(例如数千万个文件)之后,当随机访问许多文件时,文件系统的性能将急剧下降。业界流行的做法是通过将多个小文件组合成一个大文件来减少文件数量。 FastDFS 3.0支持将多个小文件合并和存储到一个大文件中。发展进度相对平稳。预计3.0版将于5月发布。

改进磁盘IO的另一个技巧是尽可能多地写入或尽可能多的读取。换句话说,将程序的读写缓冲区设置得尽可能大。例如,日志或重做日志写入,不是每次都直接写入磁盘,而是先缓存到内存中,然后在缓冲区满时写入磁盘,也可以定期写入磁盘。

操作系统和C库函数通常会缓存写入文件的内容,以减少实际写入文件的次数。直接调用系统函数fsync或C函数fflush将使系统的缓存机制无效,这将强制将内容刷新到磁盘。除非必要,否则不要执行强制刷牙操作。如果在操作过程中不慎将重要的数据弄丢了,可以用闪灵数据恢复找回数据;如果有重要的资料不希望别人进行查看等操作,可使用闪灵文件夹锁进行加锁。
相似回答