提升磁盘IO性能的几个技巧
目前磁盘都是机械方式运作的,主要体现在磁盘读写前寻找磁道的过程。磁盘自带的读写缓存大小,对于磁盘读写速度至关重要。读写速度快的磁盘,通常都带有较
大的读写缓存。磁盘的寻道过程是机械方式,决定了其随机读写速度将明显低于顺序读写。在我们做系统设计和实现时,需要考虑到磁盘的这一特性。
FastDFS最初的实现,文件是按hash方式随机分布到多个目录中的,后来增加了顺序存放的做法。通过对比测试,发现文件按目录顺序存储,写文件IO
效率明显高于按目录随机存储。
目前磁盘顺序读取的速度并不差,比如普通硬盘的IO可以达到每秒40~60MB,好一些的硬盘可以达到每秒100MB。在多进程或多线程并发读取磁盘的情
况下,随着并发数的增加,磁盘IO效率将大大下降。主要是因为每次读写,磁道可能存在较大的偏移,磁道寻址时间加大,导致磁盘IO性能急剧下降。对于这种
场景,优化方案是尽可能减少并发读写的进程数或线程数。可以用锁的机制,也可以采用专门的磁盘IO线程来对磁盘进行读写。FastDFS
2.x版本,磁盘读写就采用了专门的线程来完成。
为了充分发挥多块磁盘的效率,不建议使用传统的RAID方式。比较好的做法是每块磁盘单独mount,通过程序来控制对多块磁盘进行并发读写。采用单盘mount,文件的备份和冗余可以通过多台机器实现。
文件数多了之后,比如达到上千万个文件,当随机访问众多文件时,文件系统的性能会急剧下降。业界流行的做法是将多个小文件合并存储到一个大文件中的方式来
降低文件数。FastDFS 3.0支持将多个小文件合并存储到一个较大文件中,目前开发进展比较顺利,预计5月份可以发布。
提升磁盘IO的另外一个技巧,一次尽可能多写入或多读取。也就是说,将程序的读写buffer设置得尽可能大一些。例如日志或者redo log的写入,不是每次调用都直接写磁盘,而是先缓存到内存中,等buffer满了再写入磁盘,也可以定时写入磁盘。
操作系统和C库函数通常会对写入的文件内容做缓存,以减少实际写文件的次数。直接调用系统函数fsync或C函数fflush将使系统的缓存机制失效,此时将强制把内容刷到磁盘上。除非必需,否则不要执行强制刷盘操作。
注:如果没有特别说明,文中说的磁盘指的是硬盘。
阅读(6273) | 评论(0) | 转发(1) |