Linux 如何使操作系统以最佳方式安排磁盘访问?

Linux 如何使操作系统以最佳方式安排磁盘访问?,linux,performance,operating-system,Linux,Performance,Operating System,假设一个进程需要在多个(1000多个)位置访问文件系统,并且顺序对程序逻辑并不重要。但是,如果文件系统存储在(旋转的)硬盘上,那么顺序显然会影响性能 应用程序程序员如何与操作系统通信,使其能够以最佳方式安排访问?启动1000多个线程似乎不切实际。数据库管理软件是否实现了这一点,如果是,那么如何实现 其他详细信息:我有一个大的(1TB+)mmapped文件,每次在新的、不可预测的地方,我都需要读取1000多个1KB左右的数据块。如果读/写请求来自不同的进程或线程,内核已经对它们进行了重新排序(例如

假设一个进程需要在多个(1000多个)位置访问文件系统,并且顺序对程序逻辑并不重要。但是,如果文件系统存储在(旋转的)硬盘上,那么顺序显然会影响性能

应用程序程序员如何与操作系统通信,使其能够以最佳方式安排访问?启动1000多个线程似乎不切实际。数据库管理软件是否实现了这一点,如果是,那么如何实现


其他详细信息:我有一个大的(1TB+)
mmapped
文件,每次在新的、不可预测的地方,我都需要读取1000多个1KB左右的数据块。

如果读/写请求来自不同的进程或线程,内核已经对它们进行了重新排序(例如,为了适应机械磁盘的旋转)。顺便说一句,大多数读写操作将进入内核文件系统缓存,而不是磁盘

你可以考虑使用(也许在一个单独的线程中)。如果使用-ing而不是-ing-将某些文件部分投影到虚拟内存,则还可以使用


当然,文件系统通常不保证文件的顺序部分在物理上顺序地位于磁盘上(甚至磁盘固件也可能重新排列扇区)。请参阅wikipage中的图片,也与此相关。某些文件系统在这方面可能更好,您可以调整它们的块大小(在
mkfs
时间)

我不建议有数千个线程(最多几十个)

最后,可能值得购买一些或更多的RAM(用于文件缓存)。看

实际性能在很大程度上取决于特定的系统和硬件

也许使用像PostGreSQL这样的索引文件库或数据库库(或真正的数据库)是值得的!也许有更少的文件,但更大的文件可能会有所帮助

顺便说一句,您正在
mmap
-ing中读取1K的小数据块(小于4K的页面大小)。您可以使用
madvise
(如果可能的话,可以提前),但是您应该尝试读取更大的块,因为每次文件访问都会带来至少一整页


你真的应该做基准测试

文件及其事务缓存在计算机的各种设备中;RAM和HD缓存是最常见的位置。文件系统驱动程序还可以实现IO事务队列、碎片整理和纠错逻辑,这使得想要控制文件访问各个方面的开发人员的工作变得复杂。这一级别的复杂性最终旨在提供完整性、安全性、性能和跨系统所有进程的文件访问协调

优化工作不应干扰系统自身的缓存和预测算法,不仅针对IO,而且针对所有缓存。试图猜测你的系统是在浪费你的时间和处理器的时间

最有可能的是,IO操作和数据将保留在缓存中,并在操作系统认为合适时提交到存储设备


也就是说,总有一些选项,如数据库套件、mmap、预读机制和将IO定向到驱动器。您需要投入时间对您的任何工作进行基准测试。我建议不要使用多个IO线程,因为缓存争用会使事情比一个线程更慢。

在早期,参数(如)非常昂贵,因此非常重要,数据库供应商注意磁盘上的数据表示和布局,如中所示

重要的优化参数随着固态驱动器(SSD)的出现而改变,其中寻道时间为0(或至少恒定),因为没有旋转。其中一些新参数由以下内容解决

但是,即使是那些优化参数也会随着时间的推移而消失。这条路相当长,所有的大玩家都在这条路上


因此,如何以最佳方式安排访问在很大程度上取决于用例(1000次并发点击并不足以描述问题),购买一些RAM是选项之一,“程序员如何与操作系统通信”将是最后(而不是第一个)问题之一

@xmojmr这不是家庭作业什么样的应用程序需要这样做?你是在随机访问非常小的文件数据块吗?@BasileStarynkevitch我添加了一些细节,显示可能是类似的一组“不可预测的地方”将在接下来的几分钟内被命中,将以前的结果缓存在内存中是有意义的,而不需要缓存,并且总是进行直接脏读。您能否提供应用程序开发人员如何访问这些事务队列的详细信息?我的问题是:“程序员如何与操作系统沟通,让操作系统以最佳方式安排访问?”我在回答之前阅读了你的问题,没有必要对此无礼。对于EXT4和btrfs文件系统,您可以在这里访问内核中的队列:我不是故意粗鲁的。按照我的理解,您的回答解释了操作系统具有计划好I/O所需的功能(我知道),但没有解释应用程序开发人员如何访问它(这是我的问题)。无论如何,谢谢你的帮助。你是对的,我补充了一些细节。将所有内容移动到RAM中是不可能的,1000多个线程也不现实。(法比奥还指出,线程只会减慢速度)“当然,文件系统通常不能保证文件的顺序部分在物理上按顺序位于磁盘上”你到底是什么意思?块内的扇区在磁盘上通常不是相邻的吗?