2014-10-17 52 views
2

假设一个进程需要在很多(1000+)个地方访问文件系统,并且顺序对于程序逻辑并不重要。但是,如果文件系统存储在(旋转)硬盘上,则顺序对性能而言显然很重要。如何使OS日程安排磁盘最佳访问?

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

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

+0

[.3。要求作业帮助的问题必须包括迄今为止解决问题所做的工作摘要,以及对解决此问题的困难的描述。](http://stackoverflow.com/help/on-主题) – xmojmr 2014-10-17 14:46:20

+0

@xmojmr这不是作业 – MaxB 2014-10-17 14:52:45

+1

什么样的应用程序需要这个?你是否随机访问非常小的文件数据块? – 2014-10-17 15:09:27

回答

1

如果核心来自各种进程或线程,内核将已经对读/写请求重新排序(例如适合机械盘的旋转)。顺便说一下,大部分读取&写入内核文件系统缓存,而不是磁盘。

您可能会考虑使用posix_fadvise(2) &也许(在单独的线程中)readahead(2)。如果read(2) -ing-您使用mmap(2)项目一些文件部分虚拟内存-instead,您还可以使用madvise(2)

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

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

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

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

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

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

你真的应该基准!

+0

“当然,文件系统通常不能保证文件的顺序部分在物理上顺序位于磁盘上”你究竟是什么意思?块内的扇区通常不会在磁盘上相邻? – RaFD 2014-10-18 09:28:48

2

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

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

大多数情况下,您的IO操作和数据将保留在缓存中,并且稍后在您的操作系统认为合适时将其提交到您的存储设备。

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

+0

您可以提供有关应用程序开发人员如何访问这些事务队列的任何详细信息吗?我的问题是:“程序员如何与操作系统沟通,以便最佳地调度访问?” – MaxB 2014-10-17 22:34:30

+1

我在回答之前看过你的问题,不需要粗鲁。对于EXT4和btrfs文件系统,您可以在这里访问队列,在内核中:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/fs – 2014-10-17 23:12:05

+2

我没有'意思是粗鲁。我的阅读方式,你的答案解释说,操作系统具有安排I/O所需的功能(我知道),但没有解释应用程序开发人员如何访问它(这是我的问题)。无论如何,谢谢你的帮助。 – MaxB 2014-10-18 00:08:45

2

在像Wikipedia: Hard disk drive performance characteristics → Seek time这样的参数非常昂贵且因此非常重要的早期,数据库供应商关注磁盘上的数据表示和布局,如可以看到的,例如,在Oracle8i: Designing and Tuning for Performance → Tuning I/O

重要的优化参数随着固态驱动器(SSD)的出现而改变,其中寻道时间为0(或至少恒定),因为没有任何东西要旋转。一些新参数由Wikipedia: Solid-state drive (SSD) → optimized file systems解决。

但即使这些优化参数使用Wikipedia: In-memory databases消失。 list of vendors是相当长的,所有的大玩家。

因此,如何安排你进入最佳取决于所使用的情况下,大量的(1000次并发命中是不够的问题描述),并购买一些RAM是选项之一,“如何编程与OS沟通”将是最后一个(而不是第一个)问题

+1

你说得对,我添加了一些细节。将所有内容移入RAM是不可能的,并且1000多个线程不切实际。 (法比奥也指出线程只会减慢速度) – MaxB 2014-10-17 22:37:08