我们正在开发一种ssdtypes的存储硬件设备,可以一次读取大于4KB的大块大小(甚至MB大小)的读/写请求。 我的理解是,Linux及其文件系统将把文件“砍倒”成4KB的块大小,将被传递给块设备驱动程序,这将需要用设备中的数据物理填充块(例如,用于写入)
我也知道内核页面大小在这个限制中有一个作用,因为它被设置为4KB。
对于实验,我想知道是否有办法实际增加这个块的大小,这样我们会节省一些时间(而不是做多个4KB的写入,我们可以用更大的块大小来做)。
是否有任何FS或任何现有的项目,我可以看看这个? 如果不是的话,那么做这个实验需要什么 – linux的哪些部分需要修改? 试图找出所需的困难和资源水平。 或者,如果甚至不可能这样做和/或什么原因我们甚至不需要这样做。 任何意见表示赞赏。
谢谢。
4k的限制是由于页面缓存。 主要的问题是,如果你的页面大小为4k,但是大小为32k,那么如果文件长度只有2000字节会发生什么情况,所以你只分配4k页面来覆盖块的前4k。 现在有人试图抵消20000,并写一个字节。 现在假设系统处于很大的内存压力下,第一个2000字节的4k页面是干净的,会被内存压出。 如何跟踪32k块的哪些部分包含有效数据,以及当系统需要写出偏移20000的脏页面时会发生什么?
另外,假设系统处于巨大的内存压力下,我们需要写出最后一页; 如果没有足够的内存来存储32k数据块的其他28k,那么我们可以进行读 – 修改 – 写入循环来更新那个在偏移量为20000的脏页面。
这些问题都可以解决,但是在VM层需要大量的手术。 VM层需要知道,对于这个文件系统,页面需要一次以8个页面为单位实例化,如果存在内存压力推出特定页面,则需要将所有8页同时如果它是脏的,然后同时从页面缓存中删除所有的8个页面。 所有这一切意味着你想跟踪页面使用率和页面不是在4k页面级别,而是在复合32k页面/“块”级别。 它基本上将涉及虚拟机子系统的几乎每一个部分,从页面清理器到页面错误处理器,页面扫描器,回写算法等等的改变。
另外要考虑的是,即使你雇用了一个Linux VM专家来完成这项工作(硬盘厂商将会深深地爱你,因为他们也希望能够部署32K或64K物理扇区的硬盘)在这样一个修改后的虚拟机层出现在红帽企业Linux内核或等效的SuSE或Ubuntu的企业或LTS内核之前5-7年。 所以,如果你正在一家希望将SSD产品推向企业市场的初创公司工作,那么你现在就可以放弃这种方法。 在你没有钱之前,这是不行的。
现在,如果您碰巧正在为一家大型云计算公司(ala Facebook,Amazon,Google等)开发工作,也许您可以走这条路,因为他们不使用增加新的企业内核特点在冰河时代—但是由于这个原因,他们想要保持与上游核心相对接近的地步,以尽量减少维护成本。
如果您为其中一家大型云公司工作,我强烈建议您联系同一空间的其他公司,也许可以与他们合作,看看是否可以一起开展这类开发工作,并一起试图在上游获得这种变化。 但确实不是一个微不足道的变化,尤其是因为上游的Linux内核开发者会要求在普通情况下这不会对性能产生负面影响,在不久的将来这将不会涉及> 4k块设备。 而如果你在Facebook,Google,Amazon等等工作,这不是你想要作为私有的内核改变而保持的那种改变,而是你希望得到的东西,因为其他的智慧将是如此巨大的,侵入性的变化,支持它作为一个树下补丁将是非常头痛的。
虽然我从来没有写过用于Linux的设备驱动程序,但我觉得这不太可能是驱动程序接口的真正限制。 我想可能你想把I / O分解成分散收集列表,其中列表中的每个条目都是一页长的(为了改善内存分配性能和减少内存碎片),但是大多数设备类型可以直接处理现在的那些,我不认为驱动程序接口中的任何东西实际上都需要它。 实际上,发出请求以阻止设备的最简单的方式(在第13页中描述 – 标记为第476页)看起来像是接收到:
我怀疑,如果你看到的只是4K访问,那么可能是由于调用者一次请求不超过4K的结果 – 如果你在设备上运行的文件系统只发出4K读取,或者正在使用文件系统一次只能访问一个块,你的设备驱动程序没有任何东西可以自己改变它!
对于随机访问模式(如数据库读取工作负载),一次只能使用一个块,但在传统(而不是写入时)文件系统上进行数据库日志或FS日志写入或大型串行文件读取时,会发出更大的I / O你在期待。 如果您想尝试直接对您的设备发出大量读取,以查看是否可以通过您现在拥有的任何驱动程序进行操作,则可以使用dd if=/dev/rdiskN of=/dev/null bs=N
来查看是否增加bs
参数从4K到1M显示出显着的吞吐量增加。