一直听到这样一种说法:“xxx App发的是随机i/o,xxx App发的是顺序i/o”。我想了想觉得很不make sense,App为什么要故意去发随机i/o呢?顺序对于HDD来说总是最好的。除非有人编程故意让App这么做,但我们讨论的通常都是普通应用,比如备份、文件服务、OLTP、OLAP、邮件系统、视频流等,这些程序会被故意编程让其执行随机或顺序I/O吗?故意让备份顺序读取那到是能理解,但为什么情况要随机呢?你又怎么知道App需要随机读取/写入哪块数据呢?
所以,问题的关键在于,需要的数据在哪。如果需要的数据是连续的,那么i/o就是连续的,否则就是随机的。因此“xxx App发的是随机/顺序i/o”这种说法容易引起歧义,app只是发I/O而已,它并没有指定随机或连续,而是I/O寻址后表明所请求的数据是在连续地址,还是非连续地址,从而呈现出了连续和随机的状态。
考虑一块空磁盘,就给一个App使用,该App始终都是new writes,而且没有overwrite,那么disk controller按序分配磁盘空间自然是最好的一种做法。此时就可以认为这种写就是顺序的,因为在磁盘看来就是顺序的。但这种顺序可能只是物理上的顺序,逻辑上未必。最简单的验证方式就是去读取这些数据,如果磁头需要强烈seek来获取数据,那么就说明数据在逻辑上的相关性很小,因此就呈现了随机读。同理,如果new write中存在rewrite,那么磁盘也需要seek,导致随机写。
综上,I/O是否顺序/随机,是看请求数据的位置,虽然我们已经大致对常用App的i/o profile有所了解,但仅仅从App来判断不够严谨。
参考链接:
EMC中文技术社区