此文已由作者刘超授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验
五、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)
更多网易技术、产品、运营经验分享请点击。