当 Linux 服务器处理许多并发请求以读取许多不同的文件时,它会:
寻找 File_1,读取整个文件,然后寻找 File_2,读取整个文件,然后寻找 File_3,等等
定位到 File_1,读取其中的一部分(最多达到预读值?),然后定位到 File_2,读取其中的一部分,然后返回到 File_1 的中断处,读取更多内容,然后定位到 File_3,等等,等等
如果是第二种情况,那么服务器执行的搜索次数就比必要的次数多得多,这会大大降低速度。在这种情况下,我可以进行任何调整吗?
答案1
在磁盘 I/O 中,有一种称为升降机的东西。磁盘子系统会尝试避免磁头在整个盘片上颠簸。它会重新排序 I/O 请求(当没有被屏障等禁止时),以便磁头从磁盘内部移动到外部,然后再返回,并在途中执行请求的 I/O。
第二件事是 I/O 请求合并。如果在短时间内有很多请求访问文件的不同部分,I/O 子系统将尝试一次性获取所有数据,而不是发出多个不连贯的请求。
至于调优。如果您是应用程序编写者,您可以做很多事情。您可以随时发出大型、连续的 I/O,并在需要确保数据在盘片上时使用 fsync() 等。
如果您是系统管理员,并且您完全知道,两个应用程序的数据请求是跳跃式的,并且它们会尝试按顺序读取文件(例如,您有 2 张 DVD 正在并行转码),那么增加预读应该会有所帮助。否则,在进行任何调整之前,您需要查看 I/O 模式和大小,考虑 RAID 级别(如果有)和其他因素。在开始调整之前,先看看您的真正瓶颈是什么,可能很难猜测真正限制您系统的是什么。
答案2
在 Linux 中,你可以定义自己的调度算法,有不同的可能性,我在学校时就做过这方面的工作,这Red Hat 的文章对我帮助很大。虽然它是专门针对 Red Hat 的,但几乎可以在任何 Linux 发行版中找到这些调度程序。