前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[qemu][storage]qemu-img covnert的速度提高以及sparse file

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

作者头像
皮振伟
发布2018-04-09 10:56:18
3.8K0
发布2018-04-09 10:56:18
举报
文章被收录于专栏:皮振伟的专栏皮振伟的专栏

前言: 虚拟化场景下,测试的时候,经常为了省事,经常想跳过安装操作系统。因为作者使用的是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!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AlwaysGeek 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档