virt-manager
コマンドラインを介してlibvirtとKVMを使用して大容量ページサポートを含むVMを設定しようとしていますが、virsh
ドメインXMLでオプションを有効にするとエラーが発生します。問題がどこにあるのかわかりません。
次のパッケージバージョンで14.10にアップグレードされたUbuntu 14.04を使用しています。
- libvirt-bin 1.2.8-0ubuntu11
- qemu-kvm 2.1+dfsg-4ubuntu6
仕様
次のように巨大なページを整理しました。ガイド。現在の構成に関するいくつかの情報は次のとおりです。
$ hugeadm --explain
Total System Memory: 15808 MB
Mount Point Options
/dev/hugepages rw,relatime,mode=1770,gid=126
Huge page pools:
Size Minimum Current Maximum Default
2097152 2176 2176 2176 *
Huge page sizes with configured pools:
2097152
$ getent group kvm
kvm:x:126:chaicko
$ cat /proc/meminfo | grep Huge
AnonHugePages: 591872 kB
HugePages_Total: 2176
HugePages_Free: 2176
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
以下はドメインXMLです。
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>win8</name>
<uuid>b85bbb9a-745f-4293-a990-1e1726240ef0</uuid>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<memoryBacking>
<hugepages/>
</memoryBacking>
<vcpu placement='static'>4</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-utopic'>hvm</type>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<cpu mode='custom' match='exact'>
<model fallback='allow'>Haswell</model>
</cpu>
<clock offset='localtime'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source dev='/dev/vmvg/win8'/>
<target dev='vda' bus='virtio'/>
<boot order='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/home/chaicko/Downloads/virtio-win-0.1-81.iso'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/home/chaicko/Downloads/WINDOWS_8.1_Pro_X64/Windows_8.1_Pro_X64.iso'/>
<target dev='hdb' bus='ide'/>
<readonly/>
<boot order='1'/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</controller>
<controller type='scsi' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</controller>
<interface type='network'>
<mac address='52:54:00:48:ca:09'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='tablet' bus='usb'/>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='spice' autoport='yes'/>
<sound model='ich6'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/>
</hostdev>
<redirdev bus='usb' type='spicevmc'>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
</redirdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</memballoon>
</devices>
<qemu:commandline>
<qemu:arg value='-drive'/>
<qemu:arg value='if=pflash,readonly,format=raw,file=/usr/share/qemu/OVMF.fd'/>
</qemu:commandline>
</domain>
質問
そのオプションを削除すると<memoryBacking>
機能しますが、そうでない場合は次のエラーで失敗します。
error: internal error: process exited while connecting to monitor:
また、次の行のコメントを削除しました/etc/libvirt/qemu.conf
。
hugetlbfs_mount = "/dev/hugepages"
シェルを介してqemuを実行すると、巨大なページの使用が機能することを示します(-mem-path /dev/hugepages
)。
私は何が間違っていましたか?助けてくれてありがとう。
答え1
libvirtドキュメントによると、このセクションのタイトルは次のとおりです。メモリサポート。
オプションのmemoryBacking要素には、ホストページが仮想メモリページをバックアップする方法に影響を与えるいくつかの要素を含めることができます。
大きなページこれは、通常のデフォルトページサイズの代わりに大容量ページを使用してゲストメモリを割り当てる必要があることをハイパーバイザーに通知します。 1.2.5以降、hugepagesは各Numaノードに対してより具体的に設定できます。ページ要素を紹介します。これには、どのhugepageを使用するかを指定する必須属性サイズがあります(特にさまざまなサイズのhugepageをサポートするシステムに役立ちます)。サイズ属性の基本単位はキロバイト(1024の倍数)です。別のユニットを使用するには、オプションのユニットプロパティを使用してください。 NUMAを持つシステムの場合、オプションのノードセット属性は、指定されたゲストのNUMAノードを特定の大きなページサイズに関連付けるので便利です。サンプルコードフラグメントでは、ノード4を除く各NUMAノードは1 GBのhugepageを使用します。正しい構文については、次を参照してください。これ。
共有ページなしこのドメインの共有ページ(メモリーマージ、KSM)を無効にするようにハイパーバイザーに指示します。 1.0.6から
ロックハイパーバイザーが設定されサポートされている場合、このドメインに属するメモリページはホストメモリにロックされ、ホストはページの置き換えを許可しません。 QEMU / KVMの場合はhard_limitが必要です。メモリ調整ドメイン用に構成された最大メモリーとQEMUプロセス自体が消費するメモリーを使用および設定する要素。 1.0.6から
はい
<domain>
...
<memoryBacking>
<hugepages>
<page size="1" unit="G" nodeset="0-3,5"/>
<page size="2" unit="M" nodeset="4"/>
</hugepages>
<nosharepages/>
<locked/>
</memoryBacking>
...
</domain>
あなたはそう言わなかったので、私はあなたがこの特定のゲストにすべてのメモリを割り当てたいとします。その場合は、このセクションを完全に省略してみてください。
代替方向
この記事では、次のタイトルのRHEL 5と6のステップを見つけました。HugePagesを使用するようにKVMゲストをどのように設定しますか?次のように設定する方法を示します。
抜粋ホストへのHugeTLBファイルシステムのマウント
必要なマウントポイントを使用できます。ここでは/ hugepagesを作成しました。
mkdir -p /hugepages mount -t hugetlbfs hugetlbfs /hugepages
これはの項目を通して達成することができます
/etc/fstab
。hugetlbfs /hugepages hugetlbfs defaults 0 0
ホストのメモリロック制限を増やす
/etc/security/limits.conf
必要なメモリ使用量に応じて、次の値を変更します。# Lock max 8Gb soft memlock 8388608 hard memlock 8388608
HugePages を保存し、KVM グループにそのアクセス権を付与します。
/etc/sysctl.conf
必要なメモリ使用量に応じて、次の行を変更します。vm.nr_hugepages = 4096 vm.hugetlb_shm_group = 36
KVMゲスト定義へのHugePageサポートの追加
既存のKVMゲストのゲスト設定に次のものを追加します。これは
virsh edit <guestname>
またはで行うことができます。virsh define <guest.xml>
<memoryBacking> <hugepages/> </memoryBacking>
ホストの再起動
これは、連続メモリをHugePagesに再割り当てするために必要です。
ゲストになり始める
ゲストがHugePageをサポートしていることを確認してください。実行コマンドで、
qemu-kvm
ゲストに関連付けられたプロセスが存在することを確認してください。mem-path
ps -ef | grep qemu root 4182 1 1 17:35 ? 00:00:42 /usr/libexec/qemu-kvm -S -M rhel5.4.0 -m 1024 -mem-prealloc -mem-path /hugepages/libvirt/qemu -smp 1 -name vm1 -uuid 3f1f3a98-89f8-19ac-b5b5-bf496e2ed9be -no-kvm-pit-reinjection -monitor pty -pidfile /var/run/libvirt/qemu//vm1.pid -boot c -drive file=/vmimages/vm1,if=ide,index=0,boot=on,cache=none -drive file=,if=ide,media=cdrom,index=2 -net nic,macaddr=54:52:00:00:00:01,vlan=0 -net tap,fd=15,script=,vlan=0,ifname=vnet0 -serial pty -parallel none -usb -vnc 127.0.0.1:0 -k en-us
システムでHugePageの使用量を確認してください。
ここでは、起動時にHugePagesが割り当てられ、ゲストに使用/予約されていることがわかります。
cat /proc/meminfo | grep Huge HugePages_Total: 4096 HugePages_Free: 873 HugePages_Rsvd: 761 Hugepagesize: 2048 kB
根本原因
KVMゲストにメモリを割り当てる基本的な方法は、通常の4kページを使用することです。これにより、以下が発生する可能性があります。
- ラージページテーブルは不要で非効率なメモリ量を占めています。
- メモリ断片化の増加により、連続メモリを必要とするいくつかのカーネルベースの操作(ディスク書き込み、ネットワークアクセスなど)が遅くなる可能性があります。
- ページ障害の増加により、すべてのアプリケーションが遅くなることがある
- 仮想ゲストコンポーネントをディスクに交換する危険性があり、これにより大幅なパフォーマンス低下が発生する
HugePagesを使用すると、ページテーブルのサイズが大幅に縮小され、連続メモリ領域がマッピングされ、HugePagesは設計上スワップできません。
メモ:これらの手順は、透明なHugePagesを使用して連続2Mbメモリ領域を動的にマッピングするだけでなく、システムにメモリ不足がある場合にKSMとマージまたはスワップするためにメモリを4Kページに分割できるRHEL6のKVMには必要ありません。
透明なHugePagesの代わりにHugePagesが必要な場合は、上記の手順をRHEL6に適用できます。
答え2
libvirt
大容量ページの使用に関する私の質問に答えるUbuntuKVM_HUGEPAGES=1
、ファイルに設定/etc/default/qemu-kvm
して再起動します。
これと関係がありますバグ修正。
答え3
qemu-system-x86_64: ゲスト RAM のバックアップ ストアをマップできません。メモリを割り当てることができません。
ゲストメモリが大容量ページに割り当てられている量を超えていないことを確認してください。