先前看操作系统书籍,看到IO的时候,自己写了两个小实验。正是这两个小实验,让我非常困惑。
这两个实验都是多线程的,一个随机写一个顺序写,都用C/C++实现,并且只调用write,不显式调用flush,都写入单个CMR机械硬盘(希捷企业银河盘)。
顺序写:a(10)个线程,每个线程写b(100)个文件(线程独享),所以一共a*b个文件。每个线程写c轮,每轮每个文件写d(可以是个位数)字节。
随机写:a(512)个线程,每个现成写一个文件。每个现成写c轮,每轮写d次,每次先seek到文件中的一个随机位置然后写入e(1~4096)字节。
测试结果-顺序写:虽然同时写入的文件很多,每个文件每次写入的量很小,但最终的吞吐量接近磁盘的顺序写入性能极限。
测试结果-随机写:适度增加写入并发度(512),每次写入量来回调整测试,发现总吞吐量总是小于3MB/s,且e越高,吞吐量反而越低(下降坡度并不是很大)。
从原理上讲,按照磁盘的按块写入特性,以及磁盘的电梯调度算法(或衍生体),不论是顺序写还是随机写,只要是大量文件的写入,都是由调度器来进行块的写入,只不过随机写的每次写入量可能会极大影响实际的写入性能(e占块大小的有效比)。所以,对于e比较大的随机写入,整体吞吐量应当不会比顺序写入差很多才对。但实验结果表明,这个模型有问题。
研究这个问题的时候,单纯解释“大量的seek导致写入速度下降”是没有意义的,它只能解释单文件单线程写入时的场景。
有没有哪位对磁盘/操作系统比较熟的专家解惑下?
show出你的代码。