KVM/LibVirt/virt-manager: Guest ist langsam, sehr hohe IO-Wait Zeit

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
alex0801
Beiträge: 172
Registriert: 16.10.2005 19:46:48

KVM/LibVirt/virt-manager: Guest ist langsam, sehr hohe IO-Wait Zeit

Beitrag von alex0801 » 18.01.2021 09:13:29

Moin,

ich bin kürzlich von VirtualBox auf libvirt gewechselt. Dan virt-manager war das recht einfach. Hier und da war's ein wenig kompliziert oder buggy, aber am Ende lief es.

Nun stelle ich mehr und mehr fest, dass mein Guest (Debian) zwar läuft, aber disk-IO unheimlich langsam ist. So langsam, dass schon ein "apt get install iotop" zur Geduldsprobe wird. io wait lag bei diesem Befehl schnell bei 80% über 2-3 Minuten.

Als Disk Image habe ich qcow2 gewählt. Hab ich nachhinein gelesen dass raw wohl schneller wäre, aber der Unterschied soll bei korrekter Einstellung wohl nicht soo signifikant sein.

Nun, meine VM läuft wie folgt auf einem Debian Host System:

Code: Alles auswählen

/usr/bin/qemu-system-x86_64 -name guest=RootServer,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-1-RootServer/master-key.aes -machine pc-q35-5.1,accel=kvm,usb=off,vmport=off,dump-guest-core=off,memory-backend=pc.ram -cpu Skylake-Client-IBRS,ss=on,vmx=on,pdcm=on,hypervisor=on,tsc-adjust=on,clflushopt=on,umip=on,stibp=on,arch-capabilities=on,xsaves=on,pdpe1gb=on,ibpb=on,amd-stibp=on,skip-l1dfl-vmentry=on,pschange-mc-no=on,fma=off,avx=off,f16c=off,bmi1=off,hle=off,avx2=off,bmi2=off,rtm=off,adx=off -m 6144 -object memory-backend-ram,id=pc.ram,size=6442450944 -overcommit mem-lock=off -smp 2,sockets=2,cores=1,threads=1 -uuid a8434a69-8189-4c20-aa89-0681b1f3bc77 -no-user-config -nodefaults -chardev socket,id=charmonitor,fd=31,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global ICH9-LPC.disable_s3=1 -global ICH9-LPC.disable_s4=1 -boot strict=on -device pcie-root-port,port=0x10,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,addr=0x2 -device pcie-root-port,port=0x11,chassis=2,id=pci.2,bus=pcie.0,addr=0x2.0x1 -device pcie-root-port,port=0x12,chassis=3,id=pci.3,bus=pcie.0,addr=0x2.0x2 -device pcie-root-port,port=0x13,chassis=4,id=pci.4,bus=pcie.0,addr=0x2.0x3 -device pcie-root-port,port=0x14,chassis=5,id=pci.5,bus=pcie.0,addr=0x2.0x4 -device pcie-root-port,port=0x15,chassis=6,id=pci.6,bus=pcie.0,addr=0x2.0x5 -device pcie-root-port,port=0x16,chassis=7,id=pci.7,bus=pcie.0,addr=0x2.0x6 -device qemu-xhci,p2=15,p3=15,id=usb,bus=pci.2,addr=0x0 -device virtio-serial-pci,id=virtio-serial0,bus=pci.3,addr=0x0 -blockdev {"driver":"file","filename":"/mnt/mirror/VMs/RootServer.qcow2","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"} -blockdev {"node-name":"libvirt-1-format","read-only":false,"driver":"qcow2","file":"libvirt-1-storage","backing":null} -device virtio-blk-pci,bus=pci.4,addr=0x0,drive=libvirt-1-format,id=virtio-disk0,bootindex=1 -netdev tap,fd=34,id=hostnet0,vhost=on,vhostfd=35 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:d7:5a:0d,bus=pci.1,addr=0x0 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,fd=36,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -chardev spicevmc,id=charchannel1,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=2,chardev=charchannel1,id=channel1,name=com.redhat.spice.0 -device usb-tablet,id=input0,bus=usb.0,port=1 -vnc 127.0.0.1:0 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pcie.0,addr=0x1 -device ich9-intel-hda,id=sound0,bus=pcie.0,addr=0x1b -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0,bus=usb.0,port=2 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,port=3 -device virtio-balloon-pci,id=balloon0,bus=pci.5,addr=0x0 -object rng-random,id=objrng0,filename=/dev/urandom -device virtio-rng-pci,rng=objrng0,id=rng0,bus=pci.6,addr=0x0 -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny -msg timestamp=on
hier noch die XML dazu:

Code: Alles auswählen

<domain type="kvm">
  <name>RootServer</name>
  <uuid>a8434a69-8189-4c20-aa89-0681b1f3bc77</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://debian.org/debian/10"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit="KiB">6291456</memory>
  <currentMemory unit="KiB">6291456</currentMemory>
  <vcpu placement="static">2</vcpu>
  <os>
    <type arch="x86_64" machine="pc-q35-5.1">hvm</type>
    <boot dev="hd"/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <vmport state="off"/>
  </features>
  <cpu mode="host-model" check="partial"/>
  <clock offset="utc">
    <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>destroy</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="file" device="disk">
      <driver name="qemu" type="qcow2"/>
      <source file="/mnt/mirror/VMs/RootServer.qcow2"/>
      <target dev="vda" bus="virtio"/>
      <address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
    </disk>
    <controller type="usb" index="0" model="qemu-xhci" ports="15">
      <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
    </controller>
    <controller type="sata" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
    </controller>
    <controller type="pci" index="0" model="pcie-root"/>
    <controller type="pci" index="1" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="1" port="0x10"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="2" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="2" port="0x11"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x1"/>
    </controller>
    <controller type="pci" index="3" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="3" port="0x12"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x2"/>
    </controller>
    <controller type="pci" index="4" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="4" port="0x13"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x3"/>
    </controller>
    <controller type="pci" index="5" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="5" port="0x14"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x4"/>
    </controller>
    <controller type="pci" index="6" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="6" port="0x15"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x5"/>
    </controller>
    <controller type="pci" index="7" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="7" port="0x16"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x6"/>
    </controller>
    <controller type="virtio-serial" index="0">
      <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
    </controller>
    <interface type="network">
      <mac address="52:54:00:d7:5a:0d"/>
      <source network="default"/>
      <model type="virtio"/>
      <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
    </interface>
    <serial type="pty">
      <target type="isa-serial" port="0">
        <model name="isa-serial"/>
      </target>
    </serial>
    <console type="pty">
      <target type="serial" port="0"/>
    </console>
    <channel type="unix">
      <target type="virtio" name="org.qemu.guest_agent.0"/>
      <address type="virtio-serial" controller="0" bus="0" port="1"/>
    </channel>
    <channel type="spicevmc">
      <target type="virtio" name="com.redhat.spice.0"/>
      <address type="virtio-serial" controller="0" bus="0" port="2"/>
    </channel>
    <input type="tablet" bus="usb">
      <address type="usb" bus="0" port="1"/>
    </input>
    <input type="mouse" bus="ps2"/>
    <input type="keyboard" bus="ps2"/>
    <graphics type="vnc" port="-1" autoport="yes">
      <listen type="address"/>
    </graphics>
    <sound model="ich9">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
    </sound>
    <video>
      <model type="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
    </video>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="2"/>
    </redirdev>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="3"/>
    </redirdev>
    <memballoon model="virtio">
      <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
    </memballoon>
    <rng model="virtio">
      <backend model="random">/dev/urandom</backend>
      <address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
    </rng>
  </devices>
</domain>
Das Disk-Image liegt auf einen Raid1 mit mdadm, welches selbst eigentlich sehr flott ist. Mit Virtualbox hatte ich das auch so, war sehr flott.

Ich fürchte, es fehlt mir an einer Einstellung für mein Disk-Image. Aber ich komm nicht dahinter was ich einstellen muss. Kann mir jemand unter die Arme greifen? Google war bisher hierzu nicht hilfeich.
Wäre auch toll wenn es zur Möglichen Hilfe einen Tipp gibt wie ich das mit virt-manager einstelle.

Einen blinder wechsel zu raw würde ich vermeiden wollen. Zum einen finde ich es wichtig Snapshots machen zu können (da hab ich aktuell zwei Stück von), und zum anderen kann ich nicht glauben dass qcow2 so unheimlich schlecht ist. Ich brauch keine Über-Performance, aber eine "ganz okay"-Performance sollte doch machbar sein. Aktuell ist es eher eine "unterirdische Performance".

Gruß
Alex

alex0801
Beiträge: 172
Registriert: 16.10.2005 19:46:48

Re: KVM/LibVirt/virt-manager: Guest ist langsam, sehr hohe IO-Wait Zeit

Beitrag von alex0801 » 18.01.2021 10:05:14

Hab den Cache nun auf "writethrough" in virt-manager eingestellt (https://www.admin-magazin.de/Das-Heft/2 ... (offset)/8) und neu gebootet. Im ersten Schritt bilde ich mir ein dass es nun schneller ist. Aber das "apt dist-upgrade" das grade läuft ist noch immer nicht wirklich zügig und wait ist wieder bei 50..100% :-(

alex0801
Beiträge: 172
Registriert: 16.10.2005 19:46:48

Re: KVM/LibVirt/virt-manager: Guest ist langsam, sehr hohe IO-Wait Zeit

Beitrag von alex0801 » 18.01.2021 10:38:59

30min später läuft das dist-upgrade immer noch.

CPU liegt bei 0%, während wait bei teils 100% sitzt.

Das Host-System langweilt sich derweil. Kaum CPU (qemu frisst nur zw. 3 und 20%), nur 0,2-2,2% wait.

Ich komm nicht weiter. Warum kann Virtualbox das so "out of the box" effizient, und libvirt wirkt wie eine lahme Krücke?! Was mache ich falsch?

alex0801
Beiträge: 172
Registriert: 16.10.2005 19:46:48

Re: KVM/LibVirt/virt-manager: Guest ist langsam, sehr hohe IO-Wait Zeit

Beitrag von alex0801 » 08.02.2021 10:13:20

Bin immer noch kein Stück weiter :-(

Der Plattenzugriff ist unerträglich. Ein wunder dass der Server sonst recht gut läuft.

Falls noch jemand eine Ahnung hat: Her damit.

Nächster Versuch bei mir wird sein: qcow2 ein wenig schrumpfen und die VM auf eine noch "übrige" 256GB NVMe SSD packen.

alex0801
Beiträge: 172
Registriert: 16.10.2005 19:46:48

Re: KVM/LibVirt/virt-manager: Guest ist langsam, sehr hohe IO-Wait Zeit

Beitrag von alex0801 » 08.02.2021 11:12:36

Hmm, eben entdeckt, dass mein ~256GB großes QCOW2 Image auf der Platte 331GB ein nimmt. Okay, da steckt ein "Snapshot" mit drin, wirkt aber dennoch "sehr groß". Vor allem wenn man bedenkt, dass das darin befindliche Linux tatsächlich nur ~33GB belegt.

Ich werde als nächstes mal eine Kopie anlegen damit ich damit experimentieren kann.

Schritt 1: Mit gparted die Partition auf 128GB schrumpfen (https://gparted.org/display-doc.php%3Fn ... partitions)
Schritt 2: qcow2 Image schrumpfen (https://maunium.net/blog/resizing-qcow2-images/)
Schritt 3: Das Ergebnis auf die angesprochenen 256GB NVMe SSD packen

Ich werde berichten.

alex0801
Beiträge: 172
Registriert: 16.10.2005 19:46:48

Re: KVM/LibVirt/virt-manager: Guest ist langsam, sehr hohe IO-Wait Zeit

Beitrag von alex0801 » 08.02.2021 15:28:11

Sodele, nach einem zeitraubenden Test und umbau der VM (verkleinern etc) kann ich berichten:

Mit dem qcow2 auf der SSD flutscht die VM gerade zu.

Mein MDADM Mirror-Raid hatte bisher mit VirtualBox gut harmoniert. Irgendwas muss an qcow2 anders sein, so dass dies nun Performance ohne Ende kostet.

Mein aktuelles Fazit: Eine qcow2 basierte VM auf einem mdadm Raid 1 mit richtigen Festplatten ist keine gute Idee. Zumindest nicht wenn das Disk-Image so groß wie meins ist.

Antworten