- 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/
iphone设备UDID、iphone设备ID和iphone设备Token之间有什么区别? 通常,当我们使用苹果推送通知服务时,会使用 iPhone 设备 token 。 但我的目标只是识别唯一的 i
我们使用 firebase 从服务器向 Android 和 IOS 设备发送通知,并且我们使用旧版 FCM 发送通知。但是当我们的应用程序在后台时,通知由系统本身处理,因此我们无法通过应用程序处理它。
在 Google 上搜索后,我发现人们说只能通过“MFi 程序”将 iOS 设备与非 iOS 设备连接起来。这是真的吗? 我的项目主要集中于直接通过蓝牙与Arduino设备发送和接收信息。 iOS和非
所以我有一个通用应用程序,我正在设置 UIScrollView 的内容大小。显然,iPhone 和 iPad 上的内容大小会有所不同。如何为 iPad 设置某种尺寸,为 iPhone 和 iPod t
问题:如何在 pod 中使用连接到主机的原始设备作为 block 设备。 我尝试使用类型为“BlockDevice”的“hostPath” volumes: - my-data: hostPath
Implemented GCKDeviceScannerListener Singleton Class on ViewController, however its delegate methods
我有一个 (PhoneGap) 应用程序,它将成功获得 Passbook 通行证,并且还将成功接收与 Passbook 分开的推送通知(当伪造设备 ID 时)。 我遇到的问题是发送给注册设备的设备 I
我正在尝试找到一种方法,通过我目前正在使用的 iOS 应用程序访问我的信标的电池电量。我正在使用 Kontakt 的 iBeacon 设备。我浏览了 Estimote iOS SDK,他们提供了一种实
我正在努力让 CUDA 应用程序也能监控 GPU 的核心温度。可通过 NVAPI 访问该信息。 问题是我想确保在运行代码时监控的是同一个 GPU。 但是,似乎有信息表明我从 NvAPI_EnumPhy
从沙箱模式到生产模式,设备 token 有何不同? 我认为我已将一些设备 token 锁定为生产模式,并且无法将它们从开发中插入。 关于如何检查有什么想法吗? 最佳答案 当您使用开发证书构建应用程序时
目录 /run/user/1000/gvfs 和 ~/.gvfs 分别是空的和不存在的。我的图形文件管理器 (Thunar) 能够检测和访问设备的内部和外部存储器。 命令 gvfs-mount -l
我有一个 Android 平板电脑,它有一个迷你 USB 端口和一个 USB 端口,我想编写一个与 USB key 通信的应用程序。我写了一个demo来找出U盘,但是没有任何反应。 令我不安的是,如果
我们将 PHP 版本从 5.4.25 更改为 5.4.45,并在服务器上安装了 MS SQL 驱动程序。在更改服务器之前,一切正常,但在更改服务器之后,我遇到了 Web 服务问题。我们的身份验证 So
我想知道是否有人使用此 API 在 Android 设备上同时从 2 个后置摄像头捕获图像或视频:https://source.android.com/docs/core/camera/concurr
我正在为客户构建一个物联网解决方案,网络管理员坚持要求设备仅通过访客网络进行连接,该网络有一个强制门户,其中的服务条款必须通过按下 UI 按钮来接受,然后才能获得外部互联网访问。到目前为止,我见过的大
我无法弄清楚这里的格式规则..在我的示例中,代码行太多,无法为每行添加 4 个空格,因此这里是我需要帮助的代码的链接 http://nitemsg.blogspot.com/2011/01/heres
如果我在我的设备上接受推送通知,并且不保存设备 token ,那么我如何在自定义 View 中查看设备 token 或恢复警报 View ? 我删除了应用程序并重新安装,但看不到设备 token 警报
我试图找出在尝试并行比较和复制设备 block 与 pthreads 时我做错了什么。看起来我正在脱离同步并且比较阶段无法正常工作。任何帮助将不胜感激 #ifndef __dbg_h__ #defin
我刚刚写完所有这些内容,但这个红色的小栏告诉我我不能发布图片或两个以上的链接。因此,如果您可以引用 this Imgur album , 那简直太好了。谢谢。 我在这里相对较新,甚至对 android
我需要启用 mysql 常规日志并将其通过 nsf 移动到我系统中的另一个驱动器/设备! 所以,我在 my.cnf 中启用了它: general_log = 1 general_log_fi
我是一名优秀的程序员,十分优秀!