预热EBS卷Pre-Warming Amazon EBS Volumes

来源:互联网 发布:java中nio流详解 编辑:程序博客网 时间:2024/04/29 09:44

为什么EBS卷使用前需要预热(Pre-Warm)?
当你创建一块EBS磁盘卷的时候,无论你是创建一块全新的空磁盘还是基于某个snapshot恢复创建的一块包含数据的磁盘,存储块是立即分配的,而当你第一次读写某个块(block)的时候,他要么擦除之后再写入数据(对于新EBS卷)要么从snapshot(存储在S3中的)中恢复数据到块再供你读(对于基于快照恢复的EBS卷),这些预备操作会导致在首次读写时造成5%~50%的IOPS损失。对于大多数应用,首次的这点损失可以接受,毕竟很快整个EBS卷就会恢复IOPS性能。但如果想避免这种首次读写块时的IOPS性能损失,我们可以预热磁盘,是空磁盘,首次使用前就预先将其全部快擦除(wiped clean),如果是基于快照恢复的EBS卷,就预先全部读取一遍,使数据全部从快照中恢复到EBS卷中的块,或者将这种卷的所有块内容全部读取,并原地写入,这样基于快照恢复的卷中未被利用的部分也被预热了,但是一旦这样操作后,下次在快照这个卷的时候,就得创建完全快照(full snapshot),官网文档中的这句话的言外之意就是说: 如果没有预热的卷做快照,实际上只有被写入数据的部分被复制到S3中(快照是存在S3中)。另外,为什么基于快照创建的卷数据并没有一次性全部恢复到卷,官网文档解释说这样做可以加快快照恢复时间(restore time),然后数据根据读写频繁大小做为先后顺序逐步恢复到存储块。

下面介绍预热的方法:
Linux系统下,使用dd命令预热。
预热前,首先得确保被预热的EBS卷没有被mount。
(1)对于新的空EBS卷,我们采用dd写入数据,直到写满:
$ dd if=/dev/zero of=/dev/xvdf bs=1MB  直到出现磁盘写满的提示:
dd: writing `/dev/xvdf': No space left on device
6441+0 records in
6440+0 records out
6440878080 bytes (6.4 GB) copied, 26.3707 s, 244 MB/s

(2)对于基于快照恢复的EBS卷,采用dd读的方式
$ dd if=/dev/xvdf of=/dev/null bs=1MB但是这样做快照之前没被利用的部分用这种方式是没法预热的,不过还有下面一种方法
(3)完全预热基于快照创建的EBS卷:将数据块原地读取并写入原地
$ dd if=/dev/xvdf of=/dev/xvdf conv=notrunc bs=1MB
这种方式的弊端是,下次做快照,需要复制的数据就是整个卷的大小,无论是否被利用,因为已经被dd写入过无效数据了,这种快照叫完全快照(full snapshot)

对于Windows实例,预热也可采用dd命令,不过语法略有不同
windows版dd下载网址http://www.chrysocome.net/dd
C:\> dd if=/dev/zero of=\.\drive-letter: bs=1M --progress 写入预热
C:\> dd if=\.\drive-letter: of=/dev/null bs=1M --progress  预读预热

0 0