![旧 LTO-2 磁带的读取性能](https://linux22.com/image/647790/%E6%97%A7%20LTO-2%20%E7%A3%81%E5%B8%A6%E7%9A%84%E8%AF%BB%E5%8F%96%E6%80%A7%E8%83%BD.png)
我有一堆旧的 LTO-2 磁带,我的任务是将内容保存为磁盘上的大型二进制文件,以便最终在较新的介质上进行合并。 (内容采用特定于此站点的自定义格式,与此问题无关。我不需要保留阻止。)
我想获得一些关于如何尽可能快地读取内容的建议。当前使用的性能dd
约为 2MB/s,我认为这是由于磁带上文件的块大小较低且可变。LTO-2 规格表明我应该能够获得 40MB/s 的原生速度。
使用 Solaris,我可以通过tcopy
实用程序看到文件是以可变块大小存储的:
# tcopy /dev/rmt/1cbn
file 1: record 1: size 40
file 1: record 2: size 1024
file 1: record 3: size 10240
file 1: record 4: size 7168
file 1: record 5: size 1024
file 1: records 6 to 7: size 10240
[...]
测试从磁带读取/dev/null
:
# dd if=/dev/rmt/1cbn of=/dev/null bs=128k
(请注意,此处指定的 128k 块大小是最大块大小。如果磁带上块的实际大小小于此大小,则每次 IO 将返回较少的数据量。)
iostat -Mzcnx 1
显示:
r/s w/s Mr/s Mw/s wait actv wsvc_t asvc_t %w %b device
304.2 0.0 1.9 0.0 0.0 1.0 0.0 3.2 0 97 rmt/1
这告诉我它的读取速度为 1.9MB/s,平均 IO 大小约为 6500 字节,并且平均每次都有 1 个未完成的 IO。
因此:鉴于我无法回到过去并改变写入磁带的块大小,请告诉我是否有某种方法可以更快地读取现有数据。
答案1
查看缓冲区命令,基本上它的速度允许同时进行读/写活动,而不是正常的读取,然后写入,然后读取等......
它基本上通过生成两个子进程来实现这一点。进程使用共享内存缓冲区进行通信。命令行参数与 dd 类似,但增加了用于调整共享内存缓冲区大小的参数。
有时该命令已经存在于某些 Linux 发行版中,但是如果没有,请使用 yum 或 apt-get(或任何包检索机制)来获取缓冲包。
我在编写许多磁带备份/恢复包时亲自使用过此命令,它将吞吐量提高了约 10-20%。