[qemu][storage]qemu-img covnert的速度提高以及sparse file

前言: 虚拟化场景下,测试的时候,经常为了省事,经常想跳过安装操作系统。因为作者使用的是iscsi的分布式存储方案,所以可以用iscsiadm把iscsi挂载到host上,虚拟化出来/dev/sdx设备。 qemu-img convert -f qcow2 -O raw CentOS-7-x86_64-GenericCloud.qcow2 /dev/sdx 实际效果还不错,省去了安装操作系统的复杂过程。转换完成后,从/dev/sdx直接启动,guest os就带着操作系统了。 但是,还会看到转化速度比较慢的问题。 分析: 1,write zero问题 qcow2类型的文件,典型的用户态自定义的sparse file类型。例如执行命令: qemu-img create -f qcow2 ubuntu.qcow2 100G 就会创建一个100G的稀疏文件,在没有写入数据的情况下,占用的磁盘空间比较小。

此时,大量没有写入的数据的hole,用qemu读出来是0。 换句话说,如果有办法加速转化的时候写入0的速度,就可以加快qemu-img convert的速度。 上文的CentOS-7-x86_64-GenericCloud.qcow2 (下载地址http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2),virtual size: 8.0G (8589934592 bytes),disk size: 832M,真正需要写入的大约1G。 我们知道,xfs和ext4这种文件系统,都是支持sparse file的,比如说truncate –size 100G ubuntu.img,甚至不需要1s就创建出来了一个100G的文件。所以,用qemu-img转化到ext4文件系统上试试看: qemu-img convert -f qcow2 -O raw CentOS-7-x86_64-GenericCloud.qcow2 /mnt/raw.img 实际发现速度很快,查看/mnt/raw.img的实际大小,也只有不到1G。 那么,差别就在于写入块设备的时候,qemu-img没有对写入0的地方进行加快。 2,qemu的write zero实现 在qemu2.8/block/raw-posix.c中,对file和blk的实现。

基本上有几种实现:

a,对于block类型,则使用handle_aiocb_write_zeroes_block函数:

可见,就是调用ioctl(fd, BLKZEROOUT, ...)实现的。 b,对于xfs文件系统上的文件,则使用xfs提供的特性操作。 c,对于其他,则使用fallocate实现。 3,BLKZEROOUT的限制 回到前文的问题,qemu-img convert -f qcow2 -O raw CentOS-7-x86_64-GenericCloud.qcow2 /dev/sdx执行速度慢。我们分析qemu的代码就会发现,默认打开/dev/sdx的参数下,打开/dev/sdx设备的cache是“unsafe”模式的。意味着,/dev/sdx设备的访问中,使用了page cache。如前文《[linux][storage]Linux存储栈》,在page cache中有dirty page的情况下,绕开vfs的情况下使用ioctl执行BLKZEROOUT,是不安全的,在page cache的dirty page回写的时候,可能会覆盖掉BLKZEROOUT的部分。为了安全起见,qemu对于使用page cahce的blk设备,不执行ioctl(fd, BLKZEROOUT, ...)。 所以,对于块设备执行的qemu-img convert可以使用关闭cache的模式执行: qemu-img convert -f qcow2 -O raw CentOS-7-x86_64-GenericCloud.qcow2 /dev/sdx -t none 实际测试来看,速度确实加快了很多。 4,BLKZEROOUT的实现 zeroout的实现,在linux-4.14/block/ioctl.c中。实现上来看,就是通过scsi命令UNMAP(0x42)向后端请求。 如果是iscsi,需要iscsi的T端实现这条cmd。 5,fallocate fallocate(fd, FALLOC_FL_ZERO_RANGE, ...)是一种更好的方式。先对文件进行了支持,从linux4.9开始,对于块设备的支持。目前qemu的upstream还没有支持。 fallocate(fd, FALLOC_FL_ZERO_RANGE, ...)相对比于ioctl(fd, BLKZEROOUT, ...),除了调用scsi UNMAP命令之外,还会主动清理掉page cache,更加安全。 作者实现了一版(http://lists.gnu.org/archive/html/qemu-devel/2018-03/msg07039.html),先尝试使用fallocate,如果返回ENOTSUP,说明kernel不支持,fallback到现在的逻辑中。 不过maintainer首先觉得这个不是bug,更像是2.13的新feature,另外,他希望在compiling time来检查是否支持,而不是运行时检查出来,他也不认可fallback的方式。 期待一下2.13!

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2018-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WeTest质量开放平台团队的专栏

Android外部存储

外部存储作为开发中经常接触的一个重要系统组成,在Android历代版本中,有过许许多多重要的变更。我也曾疑惑过,为什么一个简简单单外部存储,会存在存在这么多奇奇...

1343
来自专栏Spark学习技巧

HBase最佳实践-读性能优化策略

就职于网易杭州研究院后台技术中心数据库技术组,从事HBase开发、运维,对HBase相关技术有浓厚的兴趣。

4495
来自专栏网络

负载均衡原理的解析

作者:源子姗 my.oschina.net/u/3341316/blog/877206 开头先理解一下所谓的“均衡” 不能狭义地理解为分配给所有实际服务器一样多...

3158
来自专栏北京马哥教育

corosync+pacemaker高可用集群

简介 高可用集群,是指以减少服务中断(如因服务器宕机等引起的服务中断)时间为目的的服务器集群技术。简单的说,集群就是一组计算机,它们作为一个整体向用户提供一组网...

32412
来自专栏北京马哥教育

Linux 运维工程师必备的80个监控工具(第30-80个)

这是《Linux 运维工程师必备的80个监控工具》的下篇,上篇请点击:Linux运维工程师必备的80个监控工具全集(上) 与系统有关的监控 30 nmom[2...

6287
来自专栏北京马哥教育

etcd:从应用场景到实现原理的全方位解读

马哥linux运维 | 最专业的linux培训机构 ---- 随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作...

55012
来自专栏一名叫大蕉的程序员

合格的配置中心应有的素养No.76

最近在看配置中心的一些设计,好像基本都是五花八门,主要看的是还是携程的 Apollo 这个开源的配置中心项目。一直以来都觉得配置中心很重要,因为这对于灰度发布,...

1858
来自专栏歪先生_自留地

百度MQTT_调试

2522
来自专栏快乐八哥

普通文件和数据库存储的对比

在大多数企业开发或Web开发中,都会涉及数据的存储和检索。存储数据有两种基本的方法:保存到普通文件中(File System),或者保存到数据库(Databas...

2159
来自专栏肖洒的博客

爬虫入门(一):轻量级爬虫

其中,内存适合个人,缓存数据库适合大型公司。 ### 4.网页下载器(urllib2)[核心组件]() - 网页下载器:将互联网上URL对应的网页下载到...

591

扫码关注云+社区

领取腾讯云代金券