Linux如何处理并发磁盘IO?


12

当Linux服务器正在处理许多并发请求以读取许多不同的文件时,请执行以下操作:

  1. 搜索到File_1,读取整个文件,然后搜索File_2,读取整个文件,然后搜索File_3,依此类推

  2. 寻求File_1,读取它的一部分(最大为readahead值?),然后寻找File_2,读取它的一部分,然后回溯到File_1停止的地方,再读取它,然后寻找File_3,依此类推,等等

如果是第二种情况,则服务器执行的寻道操作比必要的要多得多,这将大大降低速度。在那种情况下,我可以做任何调整吗?

Answers:


14

在磁盘I / O中,有一个叫做电梯的东西。磁盘子系统试图避免在整个磁盘上颠簸磁盘头。它将对I / O请求进行重新排序(在没有例如屏障的情况下),以便磁头从磁盘内部移动到外部,然后返回,在执行过程中执行请求的I / O。

第二件事是I / O请求合并。如果在短时间内有很多请求访问文件的不同部分,则I / O子系统将尝试一次性获取所有数据,而不是发出多个分离的请求。

就调优而言。如果您是应用程序编写者,那么您可以做很多事情。只要有可能,就可以发出大型顺序I / O,并使用fsync()等。当您需要确保数据在盘子上时。

如果您是系统管理员,并且您绝对知道,这2个应用程序的数据请求量猛增,并且它们尝试按顺序读取文件(例如,您有2张DVD进行并行转码),那么可以,增加预读应该会有所帮助。否则,在进行任何调整之前,您需要查看I / O模式和大小,考虑RAID级别(如果有)和其他因素。在开始调整之前,请查看一下真正的瓶颈是什么,可能很难猜出是什么真正限制了系统。


5

在linux中,您可以定义自己的调度算法,您有不同的可能性,我必须在学校做一下,而Red Hat的这篇文章对我有很大帮助。尽管它专门用于Red Hat,但是您几乎可以在任何Linux发行版中找到这些调度程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.