我正在尝试找到一种方法来加速 Debian 系统上 USB 记忆棒的 IO 传输速度,也许可以使用一些缓存。
背景:我编写了一个脚本debootstrap
,可以将 Debian 系统安装到某个磁盘上。我想主要将其用于 USB 记忆棒。但它非常慢(我不知道为什么,但这是一个不同的话题)。我找到了一种方法,可以使其速度提高一个数量级以上:在循环设备上执行该过程,并由硬盘驱动器上的一些临时图像文件支持。然后dd
将该图像复制到 U 盘上。
我的问题:如果硬盘上没有临时图像文件,我是否可以使其同样快(甚至更快?)?估计它有多大并不是一件容易的事。对我来说,感觉比应有的更复杂。而且比必须的要慢。有足够的 RAM 和很大的交换空间。当我直接在 USB 记忆棒上运行该过程时,我可以告诉内核更积极地缓存所有内容吗?它实际上可以在 RAM 中完成所有这些工作,并且只需在后台尽可能快地写入内存条,但不会阻塞我的程序。最后我会跑sync
,等待它,然后拔掉棒子。
理想情况下,它应该是非侵入性的。自定义内核不是一个选项,我不会以有问题的方式重新配置我的全局系统设置(这是我的主工作站,我不想让它变得不那么可靠)。
答案1
您的循环设备可能会丢弃 ATA 缓存刷新/sync
请求,这些是非常在普通 USB 记忆棒上速度很慢。您可以通过在 USB 磁盘级别禁用刷新(通过发出echo "write through" > /sys/block/$device/queue/write_cache
)和/或使用选项安装 USB 记忆棒nobarrier
(对于 ext3/4 文件系统)来获得类似的结果。
答案2
Debian 软件包管理工具经常调用fsync
1,这样如果系统在更新过程中崩溃,它最终会处于一致的状态。同步类型的调用需要等待设备完成写入,并保证如果此时系统崩溃,数据仍然存在。在 USB 驱动器上,速度非常慢(闪存型存储器读取速度快,但写入速度慢)。
安装eatmydata
并使用eatmydata
命令跑步debootstrap
。这使得fsync
调用不执行任何操作,因此写入速度会快得多。未运行的命令eatmydata
不受影响。如果系统在安装过程中崩溃,从 debootstrap 命令写入的内容可能无法使用,如果这是您的主系统,这很糟糕,但如果它是 USB 记忆棒,则不是问题,您可以从头开始重试。
请注意,eatmydata
在权限提升过程中不会持续存在,例如您需要运行sudo eatmydata debootstrap …
而不是eatmydata sudo debootstrap …
。
1 和/或fdatasync
等