如何使OS日程安排磁盘最佳访问?

假设一个进程需要在很多(1000+)个地方访问文件系统,顺序对于程序逻辑来说并不重要。 但是,如果文件系统存储在(旋转)硬盘上,则顺序显然对于性能很重要。

应用程序员如何与操作系统进行通信,以便最佳地调度访问? 启动1000多个线程似乎不实际。 数据库pipe理软件是否做到这一点,如果是的话,那么如何?

额外的细节 :我有一个大的(1TB +) mmapped文件,我需要读取大约1KB的1000个块,每次在新的,不可预知的地方。

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

你可能会考虑使用posix_fadvise(2) &也许(在一个单独的线程) readahead(2) 。 如果不使用read(2) -ing-使用mmap(2)将某个文件部分投影到虚拟内存,也可以使用madvise(2)

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

我不会推荐拥有数千个线程(最多只有几十个)。

最后,可能值得购买一些SSD或更多的RAM(用于文件缓存)。 请参阅http://linuxatemyram.com/

实际性能将取决于特定的系统和硬件。

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

顺便说一下,你是mmap -ing,并阅读1K的小块(小于4K的页面大小)。 你可以使用madvise (如果可能的话),但你应该尝试阅读更大的块,因为每个文件访问将带来至少一整页。

你真的应该基准!

在像维基百科这样的参数初期:硬盘驱动器性能特征→寻道时间非常昂贵,因此非常重要,数据库供应商关注磁盘上的数据表示和布局,例如在Oracle8i:Designing and Tuning for性能→调整I / O。

重要的优化参数随着固态驱动器(SSD)的出现而改变,其中寻道时间为0(或至少恒定),因为没有任何旋转。 一些新的参数由维基百科解决:固态驱动器(SSD)→优化的文件系统 。

但是,即使这些优化参数使用维基百科:内存数据库 。 供应商的名单是相当长的,所有的大玩家。

所以如何最优地安排你的访问取决于用例(1000个并发命中是不够的问题描述),购买一些RAM是选项之一,“ 程序员如何与操作系统通信 ”将是最后一个(不是第一个)问题

文件及其交易缓存在计算机中的各种设备中; 内存和高清缓存是最常见的地方。 文件系统驱动程序也可能实现IO事务队列,碎片整理和纠错逻辑,这使得想要控制文件访问的每个方面的开发人员变得复杂。 这种复杂性的最终目的是为了在系统的所有进程中提供文件访问的完整性,安全性,性能和协调性。

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

很可能您的IO操作和数据将保留在缓存中,稍后在您的操作系统认为合适的时候将被提交到您的存储设备。

也就是说,总是有数据库套件,mmap,readahead机制和直接IO到你的驱动器的选项。 你将需要投入时间对你的任何努力进行基准测试。 我建议针对多个IO线程,因为缓存争用将使事情比一个线程更慢。