需要一个高效的数据容器。 尽可能快地从存储移动到内存

问题 :我需要尽快将大块数据从远程位置复制到系统内存中。

场景 :我有一个数据处理系统。 该系统是通过使用多个从远程位置拉入的组件实时通过shell脚本构build的。

其中一个组件是以文件组forms存储的大块数据。

我的要求是从远程位置检索大块数据,并尽快将其安装到系统内存中。 这是一个要求,使得依赖于这个数据的系统尽可能在启动时间后立即开始使用它进行处理。


问题“我的数据最有效的容器是什么?


解决scheme已经尝试/考虑

  • ISO文件:需要创build和读取的工具,通常不是原生的
  • TAR文件:提取可能需要很多时间
  • 远程文件系统安装为本地:慢,因为内容需要复制到内存中
  • LVM快照:更多地用于备份,而不是为恢复速度而构build的

备注

  • 数据丢失不是主要关心的问题。
  • 远程文件传输过程不是主要问题,因为我已经有了一个适当的工具。
  • 该系统目前正在使用Ubuntu Linux。

“远程文件传输程序不是主要关心的问题,因为我已经有了一个足够的工具。”

如果您已经传输了文件,我build议使用mmap(2)。

您应该考虑一个包含您的数据的文件系统的图像文件(通过losetup在文件上放置一个循环设备并挂载循环设备)。 最快的方式可能是像squashfs这样的只读文件系统。

这甚至会允许一些技巧,如果不是所有的数据都需要同时。 您可以将DM设备安装在其上,而不是安装循环设备,而是使用映像文件安装networking文件系统(或networking块设备),将第二个循环设备放在networking版本的文件之上,带有DM设备的环路设备。

假设您必须复制500MB的数据。 你开始复制它。 只要第一个100 MiB被传输,您就创build了回路设备和DM设备。 DM设备指向第一个100 MiB的本地文件的循环设备,剩下的则指向另一个。 在例如每传输10Mb块之后,你暂停DM设备,并重新加载,移动另外10MB的边界。

风险是:如果访问转到networking版本,那么这个数据传输两次。 因此,如果这种情况经常发生,那么数据传输将花费更长的时间(整个过程可能会尽早完成,具体取决于其访问特性)。

编辑1:

看到这个答案我的另一个问题 ,解释如何使用DM设备这种方式(没有挂起/重新加载/恢复虽然)。

我最初对ISO容器的研究显然是不完整的。 ISO容器似乎是最有效率的,以便能够快速获取内容。 这是基于我的研究已经能够发现,当然可以改变。

打包在一个ISO我能够:

  • 远程存储数据
  • 通过多部分传输非常快速地检索它
  • 将其存储在本地,直接存入内存
  • 快速安装

使用这个容器,我已经能够把整个过程降到1分钟以下,对于这个项目来说这是一个可以接受的公差水平。

在Ubuntu中使用类似如下的命令轻松创build这个容器:

 mkisofs -o /tmp/data.iso /opt/data/ 

**请注意,这需要通过apt-get轻松安装的genisoimage

要将文件直接存储到内存中,我在/tmp文件系统中创build了一个ramdisk:

 mount -t tmpfs -o size=3G tmpfs /tmp/data 

使用多部分转移实用程序可以相对较快地完成取回容器。 我以这种方式使用了一个叫axel

 axel -a -n 128 -o /tmp/data/data.iso https://s3.amazonaws.com/bucket/data.iso 

最后,我们将文件挂载到本地文件系统:

 mount -o loop -r /tmp/data/data.iso /opt/data/ 

安装过程几乎是瞬间完成,这使系统可以快速开始使用数据进行处理。