IO基础
这一篇主要整理存储和文件系统的知识。
我工作的前两年,写的程序从来不和数据库打交道,都是直接和文件打交道,而且用的都是c的API,所以到现在对write和read的熟悉程度还是要远大于fstream。由于业务的原因,程序写的数据量不大,主要是更新比较密集。在程序迁移到aix系统上以后,曾经碰到过io过慢的问题,当时的做法是把部分的数据做到了内存中(share memory)。
下面几个图比较清楚的说明了常见的文件系统和存储。

目前的通用服务器,不管是否存储核心数据,scsi和raid1,都是标配了。上周很悲剧性地发生一台机器硬盘故障,发现这台老机器只做了raid0,导致数据全部丢失,所幸不是关键数据。
linux系统默认的文件系统是exe3,reiserfs我没用过,很多技术文章提到reiserfs在大批量小文件系统中的性能有大幅提高。这个特性对互联网公司有非常大的吸引力。打算最近一个月内做一个测试。

从图上可以看出,NAS的将来的结局和oracle应该非常接近,在互联网公司中逐渐被抛弃。
目前可以看到的趋势是:大规模廉价的通用硬盘替换昂贵的专用设备。在介绍硬盘物理io中的文章,我觉得这篇文章是比较好的。
对于一个10000转到硬盘,几个比较有趣的数据:
1, 10000 RPM / 60 seconds (10000/60 = 166 RPS)
2, 转换为 166分之1 的值(1/166 = 0.006 seconds/Rotation)
3, 单位转换为毫秒(6 MS/Rotation)
4, 旋转半圆的时间(6/2 = 3MS) 也就是 RD
5, 加上平均3 MS 的寻道时间 (3MS + 3MS = 6MS)
6, 加上2MS 的延迟(6MS + 2MS = 8MS)
7, 1000 MS / 8 MS (1000/8 = 125 IOPS)
每次应用程序产生一个I/O,在10K RPM磁盘上都要花费平均 8MS.在这个固定时间里,磁盘将尽可能且有效率在进行读写磁盘.IOPS 可以计算出大致的I/O 请求数,10K RPM 磁盘有能力提供120-150 次IOPS.评估IOPS 的效能,可用每秒读写I/O 字节数除以每秒读写IOPS 数得出.
7.2 Random vs Sequential I/O(译注:随机/顺序 I/O)
一个经验性的数据是,普通scsi的10000转速的硬盘的吞吐量大概是20MB/s.(单线程写2Gb数据,用了12秒).
对于很多小文件系统的应用来说,物理上将更多的小文件打包成一个大文件存储,类似于网络通讯中的多次一写,减少碎片是一个思路。






