Nutanix CE の AHV にて、CVM とユーザー VM(UVM)のリソース割り当ての工夫を見てみます。
CVM むけのリソース優先設定は、ESXi 版の Nutanix ほどわかりやすくありませんが、AHV でも設定されているようです。
今回は、CVM の CPU リソース割り当ての様子を見てみます。
Nutanix CE 環境
Nutanix CE ce-2020.09.16 の 1ノードクラスタです。
CVM と、2つの UVM(vm01、vm02)が起動してあります。
AHV / CVM の virsh list で、合計 3つの VM が起動していることがわかります。
[root@NTNX-d1d72885-A ~]# virsh list Id Name State ---------------------------------------------------- 1 NTNX-d1d72885-A-CVM running 2 defcaca8-d6be-4d02-afc0-b4888902f645 running 3 d9ae9c9e-4c2a-4402-ae87-36b67012313b running
UUID で表示されているのは UVM です。
[root@NTNX-d1d72885-A ~]# virsh dumpxml 2 | grep -E '<title>|<uuid>' <uuid>defcaca8-d6be-4d02-afc0-b4888902f645</uuid> <title>vm01</title> [root@NTNX-d1d72885-A ~]# virsh dumpxml 3 | grep -E '<title>|<uuid>' <uuid>d9ae9c9e-4c2a-4402-ae87-36b67012313b</uuid> <title>vm02</title>
CVM と UVM の cgroups の違い
CVM はストレージ コントローラなどの重要な役割をもつ VM なので、Linux の cgroups を利用して、UVM より CPU リソースの割り当て(cpu.shares)が大きく設定されています。この設定で、CPU リソース競合が発生した際に CVM への CPU 割り当てが優先されるはず(私は実際に動作確認まではしていません)です。
cgroups では、仮想ファイルシステムを利用して制御されます。
まず CPU の cgroup ツリー最上位となる、/sys/fs/cgroup/cpu の cpu.shares は 1024 になっています。これは CentOS 7 でのデフォルト値のままです。
[root@NTNX-d1d72885-A ~]# cat /sys/fs/cgroup/cpu/cpu.shares 1024
そして、CVM のみが配置される /sys/fs/cgroup/cpu/machine が作成されており、2倍の 2048 が設定されています。
[root@NTNX-d1d72885-A ~]# cat /sys/fs/cgroup/cpu/machine/cpu.shares 2048
machine 配下には、CVM のみが配置されています。
[root@NTNX-d1d72885-A ~]# ls -l /sys/fs/cgroup/cpu/machine/ | grep ^d drwxr-xr-x. 5 root root 0 Feb 28 2021 qemu-1-NTNX-d1d72885-A-CVM.libvirt-qemu
一方、UVM が配置される /sys/fs/cgroup/cpu/uvms.acropolis の cpu.shares は、1024 です。そしてこのツリー配下には複数の UVM が配置されます。
[root@NTNX-d1d72885-A ~]# cat /sys/fs/cgroup/cpu/uvms.acropolis/cpu.shares 1024
uvms.acropolis 配下には、この環境では 2つの UVM(vm01、vm02)が配置されています。
[root@NTNX-d1d72885-A ~]# ls -l /sys/fs/cgroup/cpu/uvms.acropolis/ | grep ^d drwxr-xr-x. 3 root root 0 Feb 28 12:42 d9ae9c9e-4c2a-4402-ae87-36b67012313b.acropolis drwxr-xr-x. 3 root root 0 Feb 28 12:20 defcaca8-d6be-4d02-afc0-b4888902f645.acropolis
そして、VM ごとの cpu.shares は 1024 になっており、CPU リソース制御は machine と uvms.acropolis の階層だけのようです。
[root@NTNX-d1d72885-A ~]# cat /sys/fs/cgroup/cpu/machine/qemu-1-NTNX-d1d72885-A-CVM.libvirt-qemu/cpu.shares 1024 [root@NTNX-d1d72885-A ~]# cat /sys/fs/cgroup/cpu/uvms.acropolis/defcaca8-d6be-4d02-afc0-b4888902f645.acropolis/cpu.shares 1024 [root@NTNX-d1d72885-A ~]# cat /sys/fs/cgroup/cpu/uvms.acropolis/d9ae9c9e-4c2a-4402-ae87-36b67012313b.acropolis/cpu.shares 1024
ちなみに、この設定は、libvirt の hooks スクリプトで VM 起動時に設定されているようです。このスクリプトには、CPU リソース以外の設定も含まれています。
[root@NTNX-d1d72885-A ~]# ls /etc/libvirt/hooks/ daemon qemu [root@NTNX-d1d72885-A ~]# grep -n "cpu_shares_.*=" /etc/libvirt/hooks/qemu 31:cpu_shares_cvm = 2048 32:cpu_shares_uvms = 1024
Linux の機能を活用して、うまいぐあいに CVM のリソース割り当てを優先しているようです。
以上。