云计算国产化之路 vnc登录 文件系统直通(virtio-9p) 扩展qemu接口 gpg WARNING 珍藏博客 虚拟内存情况dommemstat分析 免密码自动登录脚本 Linux网桥 测试网段IP占用情况 Linux 进程状态 systemc强制依赖 调试openstack ut uefi p2v 重做ubuntu内核 virsh创建虚拟机简介 virtio IO路径 虚拟化层升级后磁盘无法卸载卷 vmtouch使用 Taint flags 主机和虚拟机文件共享处理的几种方法 kvm分析工具 kvm中对磁盘的io cache 虚拟化不同导致的guestos中软件安装差异(未解决) 设备直通(PCI Assignment)到底是咋整的 virtio到底是咋整的 内核启动参数 虚拟化实时性提升(零)之配置步骤 中断虚拟化(pic)到底是咋整的 中断虚拟化(apic)到底是咋整的 Raid卡配置丢失导致服务器无法启动 tainted kernels cpu stuck for 23s问题分析 虚拟化实时性提升(一)之hostOS切换为强实时系统 内存虚拟化到底是咋整的 qemu-kvm中vcpu虚拟化到底是咋整的 风河虚拟化技术点分析 使用qga的好处 qemu迁移代码分析 虚拟机串口配置及其导出到主机pts和console.log System-based I/O vs. Raw I/O 虚拟机使用Hugepage(大页) 硬件辅助分页(hardware assisted paging) 修改centos7默认启动项目 virtio的工作流程——kernel中virtio-pci初始化(2) virtio的工作流程——qemu中virtio-backend初始化(1) qmp ceilometer取不到memory.usage指标 Virtio-Balloon超详细分析 slabtop输出 虚拟机磁盘cache导致的host os kernel崩溃 虚拟机cpu和memory性能优化测评 PCI配置空间(PCI Configuration Space) centos下网卡设备直通(VT-dpci passthrough)遇到的问题及其解决思路 libguestfs详解 yum卸载软件包及其依赖 通过原始Centos ISO来定制自己的ISO centos下网卡设备直通(VT-d,pci passthrough) (占位符)window虚拟机中拔盘如何通知到libvirt和qemu后端的 cirrus漏洞分析CVE-2017-2615 XSA-208 qcow2随笔 控制寄存器概览 ceilometer对接postgresql 解压initrd和vmlinuz qemu guest agent验证 QEMU升级指南(待续) ubuntu中kdump的配置 qemu(2.3)接口梳理 热迁移导致的FC存储场景下的multipath卷残留问题分析 virsh命令(4)secret,snapshot,pool,volume部分 virsh命令(3)之interface,filter,network virsh命令(2)monitor,host,nodedev部分 virsh命令(1)之domain部分 QEMU内存管理之FlatView模型(QEMU2.0.0) ovirt基于sanock的高可用(主机粒度HA) Sanlock防脑裂场景功能测试用例 gnocchi配置及与ceilometer对接指南 make patch for libvirt in centos centos使用sanlock指导 高可用nfs资料 ubuntu14中使用sanlock指导 LVM操作指南 sanlock相关功能验证流程汇总 make patch for libvirt in ubuntu libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7' not found gdb debug libvirt 基于ubuntu社区源码包编译libvirt compile libvirt(centos) No PCI buses available nfs lead to Linux halt nfs install and config anti-virus for cloud platform nova fetch image from glance(something about _base) token auth process ovs入门指南 virt software anti-virus something about ceilometer disk sample context interview questions openstack vm injection openstack Restful and RPC murano 概览 创建虚拟机流程(compute节点)之网络创建 创建虚拟机流程之compute_api之虚拟机实例填充之配额检测 创建虚拟机流程之compute_api之基本参数生成 创建虚拟机流程之compute_api 创建虚拟机流程(主) 创建虚拟机之image 创建虚拟机流程之准备网桥 创建虚拟机流程之virt 创建虚拟机流程之compute节点 CI/CD研发流程之工程创建 CI/CD研发流程之代码合入 CI/CD研发流程之UT(单元测试) 向openstack社区合入代码记 openstack/ceilometer/gnocchi杂谈 影子页表原理 mem_add(exec.c) qemu编译安装调试 openstack/ceilometer/gnocchi之Grafana简介 openstack wiki etcd openstack计量ceilometer openstack计费cloudKitty enventlet backdoor USB 安装VMWARE ESX pycharm设置指南 无法执行modprobe -a kvm-intel解决办法 QEMU配置项 网络不通小记 libvirt之XML(虚拟机定义文件) openstack-horizon 证书认证 ceilometer与ceph对接 openstack定时任务剖析(TODO) 服务器重启后mongodb进程无法启动 ubuntu14下新增openstack服务到service的导引 ERROR 1045(28000)-数据库连不上 Python两个内置函数—locals和globals unknown exit, hardware reason 31

创建虚拟机流程之compute_api之虚拟机实例填充之配额检测

2016年03月03日

有人瞎捣蛋,创建一个100cpu 200G的巨无霸虚拟机(姑且不论创建成功与否),作为神一样的系统管理员,别人有这种想法也不能忍。

怎么办?给他设定配额吧。 常见配额如下:

默认配额

系统->default下,创建一个project时默认援引这里的配额,如下图:

项目配额

代码流程

_check_num_instances_quota

  • 根据创建虚拟机的数目和使用的flavor
    • 计算出所需vcpu的数目(max_count * instance_type[‘vcpus’])
    • 计算出所需内存的数量(max_count * (instance_type[‘memory_mb’] + vram_mb))
    • 代表视频设备所需内存,是flavor中hw_video:ram_max_mb字段指定的数目
  • 使用context初始化Quotas
  • 预占资源(quotas.reserve)
  • 异常处理

quotas.reserve

下图可见,这里透传调用的nova/nova/quota文件下的QUOTAS对象的reserve方法

QUOTAS

进入nova/nova/quota可见QUOTAS是一个QuotaEngine对象 实例完QuotaEngine,会声明一系列的资源,然后注册给QuotaEngine的_resources,资源有如下范围:

  • 可预占资源(ReservableResource):数据库中有真真儿的对象的资源
    • instances
    • cores
    • ram
    • security_groups
    • floating_ips
    • fixed_ips
    • server_groups
  • 可计数资源(CountableResource):数据库中有真真儿的对象的资源,但资源不严格隶属与某个project
    • security_group_rules
    • key_pairs
    • server_group_members
  • 独占资源(AbsoluteResource)
    • metadata_items
    • injected_files
    • injected_file_content_bytes
    • injected_file_path_bytes

查看QuotaEngine对象的reserve方法,发现又把方法传递给本类的_driver的reserve, 这里有两种driver:

  • DbQuotaDriver: 默认的配置的driver,使用本地数据库事物进行相应控制
  • NoopQuotaDriver:与上述driver相比,这个driver只对有必要的配额进行校验,可以实现分层控制

DbQuotaDriver.reserve

查询配额及预占资源,对可计数的资源(指的是那些使用方法带同步锁的资源),这个方法校验当前已使用量和预占量

资源不在下述资源表中或者对应资源没有同步方法抛出QuotaResourceUnknown 任何一个资源超出限制,抛出OverQuota

  • 校验下当前要校验配额的资源们是否可以预占(_valid_method_call_check_resources)
  • 获得整个project的未删除的配额(project_quotas = db.quota_get_all_by_project(context, project_id))
  • 获得project针对每个资源的配额限制(_get_quotas)
  • 获得用户的针对每个资源的配额限制(_get_quotas附加了用户id)
  • 资源预占(db.quota_reserve)«—点这里,真正实验预占是在这里,其他的都是梳理出准确的配额值

_get_quotas

  • 过滤出请求配额校验的资源
  • 请求配额校验的资源必须都满足要求,否则抛出QuotaResourceUnknown
    • 附加了用户id走这里根据资源信息获取用户及其项目配额(get_user_quotas)
    • 否则根据资源信息获取其项目配额(get_project_quotas)

get_user_quotas

  • 获得用户在project的配额(quota_get_all_by_project_and_user)
    • 返回hard_limit的值
  • 使用quotas表中内容补齐project_user_quotas不存在的项目
  • 配额处理(_process_quotas)

get_project_quotas

_process_quotas

  • 获得对应模板的配额(quota_class_get_all_by_name)
  • 获得default模板的配额(get_defaults)
  • 按照资源遍历,获取入参quotas中配额,没有则获取模板配额,再没有则获取default模板类的配额
    • user情况下入参为project_user_quotas读取的数据
    • project情况下为quotas表读取的数据
    • 注:猜测模板配额(class)是为了后续做扩展,资源创建时候主动带配额过来

DB预占

资源配额控制默认情况下是使用如下几个表进行控制的: quotas:hard_limit记录各个project对应的各种资源的配额,更新某个的配额,对应的hard_limit值会刷新

quota_classes:配额模板,会有一组class_name为default的配额,默认情况下,创建工程会从这里援引配额值 当然,你也可以创建一组新的模板,然后用你自己创建的模板创建工程等。这里只是提供了一中扩展性, 使用场景不多。

project_user_quotas:后端支持用户级别在project上的配额限制(猜测)

理由如下,创建配额的时候如果带了user_id则配额有可能会创建之上表,负责创建至quotas表

quota_usages:录了每个工程当前使用的各种资源的数量,in_use值就是保存正在使用的资源数量的,程序中就是通过更新这个in_use值来实现配额管理。

reservations:记录的是每次分配的各种资源的变化值,即delta保存的值,它和quota_usages通过usage_id外键关联。这个表中的记录是不更新的,每次分配都会相应的增加记录

申请资源的时候使用quota_reserve检查下配额,记录到usage.reserved字段预占下 没有超额则使用reservation_commit提交确认,减掉reserved,记录到in_use 超额则调用reservation_rollback回滚掉usage.reserved字段

quota_reserve

  • quota_usages表获取当前资源使用情况,返回项目使用情况(project_usages)及其用户使用情况(user_usages)
  • 遍历要预占的资源
    • 判断是否需要创建记录
    • 判断是否需要更新记录
    • 缓存中更新使用信息
  • 判断资源是否超限
    • 么有超,创建分配记录至reservations,更新quota_usages表记录
    • 超了,整理信息抛出OverQuota异常

reservation_commit

usage.reserved -= reservation.delta
usage.in_use += reservation.delta

reservation_rollback

usage.reserved -= reservation.delta