翻译自:http://www.pixelbeat.org/docs/openstack_libvirt_images/

The main stages of a Virtual Machine disk image as it transfers through OpenStack to be booted under libvirt are:

Initially the image is downloaded from glance and cached in libvirt base. We'll consider the options for handling a qcow2 image stored in glance, as that format can be downloaded quite efficiently from glance as it supports compression, and image sparseness can be maintained. This article will focus on the flow and transformations in "libvirt base", which is used to cache, preprocess and optionally back, VM disk images.

Configuration

First we'll summarize the config variables involved, before presenting the operations associated with each config combination, in each OpenStack release. Note I'm describing upstream OpenStack here, and not my employer's Red Hat OpenStack which has back-ported enhancements between versions where appropriate.

Config Default Release Description
use_cow_images True Cactus Whether to use CoW images for "libvirt instance disks"
force_raw_images True Essex Allows disabling convert to raw in "libvirt base" for operational reasons
libvirt_images_type 'default' Folsom Deprecates use_cow_images and allows selecting LVM libvirt images
[libvirt]/images_type 'default' Icehouse Deprecates libvirt_images_type in the [DEFAULT] section
preallocate_images 'none' Grizzly Instance disks preallocation mode. 'space' => fallocate images
resize_fs_using_block_device False Havana Allows enabling of direct resize for qcow2 images

The main reason that raw images are written in "libvirt base" by default (since Diablo), is to remove possible compression from the qcow2 image received from glance. Note compression in qcow2 images is read only, and so this will impact reads from unwritten portions of the qcow2 image. Users may want to change this option, depending on CPU resources and I/O bandwidth available. For example, systems with slower I/O or less space available, may want to trade the higher CPU requirements of compression, to minimize input bandwidth. Note raw images are used unconditionally with libvirt_images_type=lvm.

Whether to use CoW images for the "libvirt instance disks" also depends on I/O characteristics of the user's system. Without CoW, more space will be used for common parts of the disk image, but on the flip side depending on the backing store and host caching, there may be better concurrency achieved by having each VM operate on its own copy.

Enabling preallocation of space for the "libvirt instance disks" can help with both space guarantees and I/O performance. Even when not using CoW instance disks, the copy each VM gets is sparse and so the VM may fail unexpectedly at run time with ENOSPC. By running fallocate(1) on the instance disk images, we immediately and efficiently allocate the space for them in the file system (if supported). Also run time performance should be improved as the file system doesn't have to dynamically allocate blocks at run time, reducing CPU overhead and more importantly file fragmentation.

Disk image operations

For each release and config combination, here are the created files and associated operations in getting a qcow2 image from glance through to being booted in a libvirt Virtual Machine.

Folsom, force_raw_images=True, use_cow_images=True

This results in each instance booting from a CoW image, backed by a resized raw image.

Nova command Source code Notes
wget http://glance/$image -O base_/$hex.part images.fetch  
qemu-img convert -O raw $hex.part $hex.converted images.fetch_to_raw Creates sparse file
mv $hex.converted $hex; rm $hex.part images.fetch_to_raw  
  imagebackend.create_image  
cp $hex $hex_$size   libvirt.utils.copy_image Creates sparse file
qemu-img resize $hex_$size $size   disk.extend  
resize2fs $hex_size   disk.extend Unpartitioned ext[234]
qemu-img create -f qcow2 -o backing_file=... $instance_dir/disk   libvirt.utils.create_image  

Folsom, force_raw_images=True, use_cow_images=False

This results in each instance booting from a copy of a resized raw image.

Nova command Source code Notes
wget http://glance/$image -O base_/$hex.part images.fetch  
qemu-img convert -O raw $hex.part $hex.converted images.fetch_to_raw Creates sparse file
mv $hex.converted $hex; rm $hex.part images.fetch_to_raw  
  imagebackend.create_image  
cp $hex $instance_dir/disk   libvirt.utils.copy_image  
qemu-img resize disk   disk.extend  
resize2fs disk   disk.extend Unpartitioned ext[234]

Folsom, force_raw_images=False, use_cow_images=False

This results in each instance booting from a copy of a resized qcow2 image.

Nova command Source code Notes
wget http://glance/$image -O base_/$hex.part images.fetch  
mv $hex.part $hex images.fetch_to_raw  
  imagebackend.create_image  
cp $hex $instance_dir/disk   libvirt.utils.copy_image  
qemu-img resize disk   disk.extend  
resize2fs disk   disk.extend Ignored for qcow2 ¹

Folsom, force_raw_images=False, use_cow_images=True

This results in each instance booting from a CoW image, backed by a resized qcow2 image.

Nova command Source code Notes
wget http://glance/$image -O base_/$hex.part images.fetch  
mv $hex.part $hex images.fetch_to_raw  
  imagebackend.create_image  
cp $hex $hex_$size   libvirt.utils.copy_image  
qemu-img resize $hex_$size $size   disk.extend  
resize2fs $hex_size   disk.extend Ignored for qcow2 ¹
qemu-img create -f qcow2 -o backing_file=... $instance_dir/disk   libvirt.utils.create_image  

Grizzly, force_raw_images=True, use_cow_images=True

Grizzly introduces a change for use_cow_images=True, where it will resize in the $instance_dir rather than in base_. So the resize will not be cached, but this is minimal CPU tradeoff per instance boot, for the extra space saved in base_. We'll just present the default config values here which illustrates the only significant change from Folsom.
This results in each instance booting from a resized CoW image, backed by a raw image.

Nova command Source code Notes
wget http://glance/$image -O base_/$hex.part images.fetch  
qemu-img convert -O raw $hex.part $hex.converted images.fetch_to_raw Creates sparse file
mv $hex.converted $hex; rm $hex.part images.fetch_to_raw  
  imagebackend.create_image  
qemu-img create -f qcow2 -o backing_file=... $instance_dir/disk   libvirt.utils.create_image  
qemu-img resize disk $size   disk.extend  
resize2fs disk   disk.extend Grizzly always ignores ²

[² Update Sep 2013: Stanislaw Pitucha also noticed that the above referenced Grizzly change introduced a regression where unpartitioned qcow2 images were no longer resized. See the Havana resize_fs_using_block_device option below for details.]

Grizzly, preallocate_images='space'

Grizzly also has new fallocate functionality in this area controlled by the preallocate_images config option. If that is set to 'space', then after the operations above, the $instance_dir/ images will be fallocated to immediately determine if enough space is available, and to possibly improve VM I/O performance due to ongoing allocation avoidance, and better locality of block allocations.

¹ Havana, resize_fs_using_block_device=False

As noted in the first Grizzly change above, Stanislaw Pitucha noticed that change introduced a regression where unpartitioned qcow2 images were no longer resized. He supplied a fix to resize qcow directly rather than relying on the raw image being available, which would also cater for the force_raw_images=False case that even pre Grizzly did not. This new option can be used to enable this support, but there are some large performance and possible security issues so it's not enabled by default. This support will be available in the upcoming Havana release.

General performance considerations

Performance has improved in this area through each OpenStack release, with some of the main topics to consider, for past and future changes being:

Minimize I/O

Note these were implemented in Essex:

  • Copy images, then resize, rather than vice versa
  • Directly generating images in the $instance_dir/
  • Intelligent reading of sparse input
  • Reproduction of sparse input on output
  • Use compression

Note this was implemented in Folsom:

  • Avoid file sytem overhead by setting libvirt_images_type=lvm. Note file system overhead varies depending on file system

Minimize storage

  • Use compression
  • Use sparse output/generation
  • Avoid resized copies when not needed
  • Use CoW if appropriate

Improve caching

  • Avoid thrashing the page cache with large intermediate images
  • Improve low level caching through better storage allocation

Preprocessing

  • Preprocessing may be possible on images like preallocation=metadata which trades off initial CPU cost for possibly much better run time I/O performance
  • Such cost would be some what alleviated by having asynchronous population of the base_ cache

[To be translated] Nova:libvirt image 的生命周期相关推荐

  1. libvirt domin的生命周期控制

    libvirt 可以控制域的整个生命周期,域可以在下面几种状态中进行转换: 1.undefined.这是基线状态,域没有被定义或创建 2.Defined.域被定义了但没有运行,该状态也可以描述为Sto ...

  2. devstackd 计算Nova的虚机生命周期场景查看

    一. shut off instance shut off 的流程为 1. 向nova-api 发送请求 2. nova-api 发送消息 3. nova-compute执行操作 第一步:向nova- ...

  3. KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]

    KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain] 学习 KVM 的系列文章: (1)介绍和安装 (2)CP ...

  4. [译] libvirt 虚机的生命周期 (Libvirt Virtual Machine Lifecycle)

    翻译自:http://wiki.libvirt.org/page/VM_lifecycle 这篇文章描述虚机生命周期的基本概念.其目的在于在一篇文章中提供完整的关于虚机创建.运行.停止.迁移和删除的基 ...

  5. portlet_Portlet生命周期

    portlet As we've seen previously, Portlet is conceptually very similar to Servlet as they can only o ...

  6. 红帽企业Linux生命周期

    红帽企业Linux生命周期 总览 细节 生产阶段 全面支持阶段 维护支持一期 维护支持阶段(RHEL 8)阶段/ 维护支持2阶段(RHEL 5.6.7) 延长使用寿命 红帽企业Linux更长的支持附加 ...

  7. LTV 即用户生命周期价值

    20220321 https://mp.weixin.qq.com/s/kPoojfRCbvCCV4zpnCimmQ 指标计算详细介绍 数据分析|如何做好用户生命周期价值分析 LTV https:// ...

  8. Harmony生命周期

    Harmony生命周期 系统管理或用户操作等行为,均会引起Page实例在其生命周期的不同状态之间进行转换.Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放 ...

  9. Activity在有Dialog时按Home键的生命周期

    当一个Activity弹出Dialog对话框时,程序的生命周期依然是onCreate() - onStart() - onResume(),在弹出Dialog的时候并没有onPause()和onSto ...

最新文章

  1. 2012需要一种智慧
  2. 去除链接虚线边框css
  3. thinkphp 内部函数 D()、F()、S()、C()、L()、A()、I()
  4. python 可视化 画直线_用Python画江苏省地图,实现各地级市数据可视化
  5. access insert语句怎么写_被缠上了,小王问我怎么在 Spring Boot 中使用 JDBC 连接 MySQL
  6. 中原工学院计算机组成原理试卷,中原工学院计算机组成原理试卷.doc
  7. geetest极验空间推理验证码破解与研究
  8. Access denied for user ''@'localhost' to database 'mysql‘’
  9. Javascript鼠标悬停显示子菜单的大型分类菜单
  10. 美术文献杂志美术文献杂志社美术文献编辑部2022年第7期目录
  11. Flutter上传多张图片
  12. matlab 图像处理 histogram shifting 基于直方图平移的信息隐藏
  13. 如何使用 Yahoo! Finance stock API 获取股票数据
  14. 关于在vscode引入python中Crypto包的问题
  15. 关于如何在空间中建立直角坐标系
  16. SQL WEEK()函数
  17. 逻辑斯蒂回归实现与参数分析
  18. WK2124 (SPI扩展4路UART端口传输)
  19. LilyPond教程(0)——目录和索引
  20. java计算机毕业设计-损失赔偿保险的客户情况登记及管理-源程序+mysql+系统+lw文档+远程调试

热门文章

  1. 评估报告有效期过期了怎么办_T4学生签证过期了,怎么申请Vignette Transfer?
  2. 四川计算机职业技术学院,四川职业技术学院
  3. 【 Vivado 】时钟组(Clock Groups)
  4. 进击webpack 4 (基础篇一)
  5. P5147 随机数生成器 [数列]
  6. Exchange/Office365 自动处理脚本:环境准备篇(一)
  7. Script:收集11g Oracle实例IO性能信息
  8. 当我们说数据挖掘的时候我们在说什么
  9. 给一个表单提交绑定一个点击事件
  10. 户外生活--西湖林至千军台