不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (3)

勿忘初心2018-11-08 14:27

此文已由作者刘超授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验


五、Libvirt可以通过hooks来设置cgroup


Libvirt提供hook功能,可以再下面的事件发生的时候,调用脚本做一些事情

  • 事件一:The libvirt daemon starts, stops, or reloads its configuration

  • 事件二:A QEMU guest is started or stopped

  • 事件三:A network is started or stopped or an interface is plugged/unplugged to/from the network


Hook在目录/etc/libvirt/hooks下:

  • /etc/libvirt/hooks/daemon在事件一发生的时候被调用

  • /etc/libvirt/hooks/qemu对应事件二

  • /etc/libvirt/hooks/network对应事件三


脚本可以是bash也可以是python

  • #!/bin/bash

  • #!/usr/bin/python


脚本参数

  • Object:例如guest的名称

  • Operation:例如start

  • sub-operation

  • extra argument

  • 另外domain的xml作为stdin


注意:不可以在hook脚本中调用virsh的api,容易引起死锁


简单的hook脚本,打印参数和stdin

  • /etc/libvirt/hooks/daemon

  • /etc/libvirt/hooks/qemu

  • /etc/libvirt/hooks/network



要加载hook脚本,必须stop然后start libvirt-bin

  • service libvirt-bin stop

  • service libvirt-bin start

  • 不可以restart



测试脚本


tail -f /tmp/hook.log



关闭这个实例



会看到新的日志



复杂的hook脚本

  • 禁止ICMP

  • 设置CPU Share

  • 设置网络带宽


修改/etc/libvirt/hooks/qemu

  • 处理started和stopped事件

  • 在started事件发生后,也即虚拟机创建后

    • 创建一个文件夹,将domain的xml放在文件夹里面

    • 然后调用python脚本

      • /etc/libvirt/hooks/qemu.d/disable_icmp.py

      • /etc/libvirt/hooks/qemu.d/update_cpu_share.py

      • /etc/libvirt/hooks/qemu.d/add_tc.py

  • 在stopped事件发生后,也即虚拟机关闭后

    • 调用脚本/etc/libvirt/hooks/qemu.d/enable_icmp.py

    • 删除domain文件夹



/etc/libvirt/hooks/qemu.d/disable_icmp.py

  • 解析domain的xml文件,得到domain的名称和网卡名称

  • 调用iptables命令



/etc/libvirt/hooks/qemu.d/enable_icmp.py

  • 解析domain的xml文件,得到domain的名称和网卡名称

  • 调用iptables命令



/etc/libvirt/hooks/qemu.d/update_cpu_share.py

  • 解析domain的xml文件,得到domain的名称和网卡名称

  • 将2048写入cpu.shares文件,默认为1024



/etc/libvirt/hooks/qemu.d/add_tc.py

  • 解析domain的xml文件,得到domain的名称和网卡名称

  • 调用tc添加qdisc到虚拟网卡



我们最后测试一下


启动虚拟机virsh start ubuntutest4


在tail -f /tmp/hook.log中



运行iptables –nvL



查看/sys/fs/cgroup/cpu/machine/ubuntutest4.libvirt-qemu/cpu.shares


查看tc qdisc show dev vnet0



文件夹也创建了



删除虚拟机virsh destroy ubuntutest4


在tail -f /tmp/hook.log中



运行iptables –nvL



文件夹也删除了



相关阅读:不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (1)

不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (2)

不仅Docker会使用Control Group,KVM也会使用Cgroup来控制资源分配 (3)


11.1—11.15云计算基础服务全场5折起

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击