- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们正在开发一种 ssd 类型的存储硬件设备,它可以一次处理大于 4KB 的大块大小(即使是 MB 大小)的读/写请求。我的理解是 linux 及其文件系统会将文件“切碎”为 4KB 的 block 大小,这些 block 大小将被传递给 block 设备驱动程序,这将需要用来自设备的数据物理填充 block (例如,用于写入)
我也知道内核页面大小在这个限制中起作用,因为它被设置为 4KB。
对于实验,我想看看是否有办法真正增加这个 block 大小,这样我们就可以节省一些时间(我们可以用更大的 block 大小来完成,而不是多次写入 4KB)。
是否有任何 FS 或任何现有项目可供我查看?如果没有,做这个实验需要什么——linux 的哪些部分需要修改?试图找出困难程度和所需资源。或者,如果甚至不可能这样做和/或我们甚至不需要这样做的任何原因。任何意见表示赞赏。
谢谢。
最佳答案
4k 的限制是由于页面缓存。主要问题是如果你有一个 4k 页面大小,但是一个 32k block 大小,如果文件只有 2000 字节长会发生什么,所以你只分配一个 4k 页面来覆盖 block 的前 4k。现在有人试图偏移 20000,并写入一个字节。现在假设系统内存压力很大,前 2000 字节的 4k 页面是干净的,被推出内存。您如何跟踪 32k block 的哪些部分包含有效数据,以及当系统需要写出偏移量 20000 处的脏页时会发生什么?
此外,假设系统内存压力很大,我们需要写出最后一页;如果没有足够的可用内存来实例化 32k block 中的其他 28k,那么我们可以执行读取-修改-写入循环只是为了更新偏移量 20000 处的那个脏 4k 页面?
这些问题都可以解决,但是需要在VM层做大量的手术。 VM 层需要知道对于这个文件系统,页面需要一次以 8 个页面的 block 的形式实例化,如果存在推出特定页面的内存压力,则需要写出所有 8 个页面同时如果它是脏的,然后同时从页面缓存中删除所有 8 个页面。所有这些都意味着您想要跟踪页面使用情况和脏页,而不是在 4k 页面级别,而是在复合 32k 页面/“ block ”级别。它基本上将涉及对 VM 子系统的几乎每个部分的更改,从页面清理器到页面错误处理程序、页面扫描器、写回算法等等。
还要考虑,即使您确实聘请了 Linux VM 专家来完成这项工作(HDD 供应商会非常喜欢您,因为他们也希望能够部署具有 32k 或 64k 物理扇区大小的 HDD) ,这种经过修改的 VM 层将在 Red Hat Enterprise Linux 内核或 SuSE 或 Ubuntu 的等效企业或 LTS 内核中出现还需要 5-7 年的时间。因此,如果您在一家希望将您的 SSD 产品销售到企业市场的初创公司工作——您现在最好放弃这种方法。在您的钱用完之前,它是行不通的。
现在,如果您碰巧在一家制造自己硬件的大型云公司(如 Facebook、亚马逊、谷歌等)工作,也许您可以走这条路,因为他们不使用企业内核以缓慢的速度添加新功能——但出于这个原因,他们希望相对靠近上游内核以最大限度地降低维护成本。
如果您确实为这些大型云公司之一工作,我强烈建议您联系同一领域的其他公司,也许您可以与他们合作,看看是否可以一起进行这种开发一起工作,努力让这种改变上游。这真的,真的不是一个微不足道的变化,虽然 --- 特别是因为上游 linux 内核开发人员会要求这不会对常见情况下的性能产生负面影响,而这不会 在不久的将来随时涉及 > 4k block 设备。如果你在 Facebook、谷歌、亚马逊等公司工作,这不是你想要作为对内核的私有(private)更改来维护的那种更改,而是你希望获得上游的东西,因为其他明智的将是一个如此巨大的、侵入性的变化,以至于支持它作为一个树外补丁将是非常令人头疼的。
关于linux - 绕过 block 层/设备上的 4KB block 大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30585565/
这个问题在这里已经有了答案: C sizeof a passed array [duplicate] (7 个回答) 8年前关闭。 在一个函数中,我声明了一个数组: int char_count_ar
简而言之,文件系统如何与 block 设备通信? 最佳答案 我对 block 大小不太了解。我认为 ext4(Linux)的文件系统的 block 大小是 4KB,考虑到现代处理器的页面大小(4KB)
我知道 tinyint(1) 和 tinyint(2) 具有相同的存储空间范围。 唯一的区别是显示宽度不同。这是否意味着 tinyint(1) 将存储所有类型的整数但只正确显示 0 到 9 的范围?而
今晚我已经研究了以下代码几个小时,但我只是摸不着头脑。 当使用函数从标准输入填充数组时,我不断收到“大小 8 的无效写入”和“大小 8 的无效读取”。 如有任何帮助,我们将不胜感激...我知道 Sta
我有一个 valgrind 错误,我不知道如何摆脱它们: ==5685== Invalid read of size 8 ==5685== at 0x4008A1: main (in /home
我对 Hadoop 的概念有点困惑。 Hadoop block 大小、拆分大小和 block 大小 之间有什么区别? 提前致谢。 最佳答案 block 大小和 block 大小相同。 拆分大小 可能与
我想不出一个好的标题,所以希望可以。 我正在做的是创建一个离线 HTML5 webapp。 “出于某些原因”我不希望将某些文件放在缓存 list 中,而是希望将内容放在 localStorage 中。
无法将 xamarin apk 大小减少到 80 MB 以下,已执行以下操作: 启用混淆器 配置:发布 平台:事件(任何 CPU)。 启用 Multi-Dex:true 启用开发人员检测(调试和分析)
我正在开发一个程序,需要将大量 csv 文件(数千个)加载到数组中。 csv 文件的尺寸为 45x100,我想创建一个尺寸为 nx45x100 的 3-d 数组。目前,我使用 pd.read_csv(
Hello World 示例的 React Native APK 大小约为 20M (in recent versions),因为支持不同的硬件架构(ARMv7、ARMv8、X86 等),而同一应用程
我有一个包含 n 个十进制元素的列表,其中每个元素都是两个字节长。 可以说: x = [9000 , 5000 , 2000 , 400] 这个想法是将每个元素拆分为 MSB 和 LSB 并将其存储在
如何设置 GtKTextView 的大小?我想我不能使用 gtk_widget_set_usize。 最佳答案 您不能直接控制小部件的大小,而是由其容器完成。您可以使用 gtk_widget_set_
这个问题在这里已经有了答案: c++ sizeof() of a class with functions (7 个答案) 关闭 5 年前。 结果是 12。 foobar 函数存储在内存中的什么位置
当我在 ffmpeg(或任何其他程序)中使用这样的命令时: ffmpeg -i input.mp4 image%d.jpg 所有图像的组合文件大小总是比视频本身大。我尝试减少每秒帧数、降低压缩设置、模
我是 clojurescript 的新手。 高级编译后出现“77 KB”的javascript文件是否正常? 我有一个 clojurescript 文件: 我正在使用 leinigen: lein c
我想要一个 QPixmap尺寸为 50 x 50。 我试过 : QPixmap watermark(QSize(50,50)); watermark.load(":/icoMenu/preparati
我正在尝试从一篇研究论文中重新创建一个 cnn,但我对深度学习还是个新手。 我得到了一个大小为 32x32x7 的 3d 补丁。我首先想执行一个大小为 3x3 的卷积,具有 32 个特征和步幅为 2。
我一直在尝试调整 View Controller 内的 View 大小,但到目前为止没有运气。基本上,我的 View 最底部有一个按钮,当方向从纵向更改为横向时,该按钮不再可见,因为它现在太靠下了。
如何使用此功能检查图像的尺寸?我只是想在上传之前检查一下... $("#LINK_UPLOAD_PHOTO").submit(function () { var form = $(this);
我用 C++ 完成了这个,因为你可以通过引用传递参数。我无法弄清楚如何在 JavaScript 中执行此操作。我的代码需要更改什么?我的输出是1 this.sizeOfBst = function()
我是一名优秀的程序员,十分优秀!