Langsame Datenbankverbindung mit KVM

Sep 28 2020

Auf meinem Server habe ich ein Setup mit mehreren KVMs, die mit virsh auf Ubuntu verwaltet werden. Eine VM für den Apache, eine VM für die Datenbank, den Mailserver usw. Alles funktioniert recht gut, außer dass größere CMS-Systeme Leistungsprobleme aufweisen. Ich habe es auf die Datenbank eingegrenzt. Aber nicht die Abfragen sind per se langsam. Wenn ich sie direkt auf dem Datenbankserver ausführe, sind sie so schnell wie erwartet. Aber nicht, wenn ich sie von der Apache-VM aus starte. Wenn ich diese Anwendung lokal ohne VMs installiere, ist auch alles schnell.

Ich habe ein kleines Tool zum Testen erstellt und dieses Muster für 500 verschiedene SQL-Abfragen gefunden: Statistik der Abfragelaufzeit 34 von 500 Abfragen sind also langsamer als die anderen. Aber alle 34 sind ungefähr ähnlich langsam. Wenn ich dasselbe Skript direkt auf dem Datenbankserver ausführe, werden alle 500 Abfragen schnell ausgeführt.

Jedes Mal, wenn ich dieses Skript ausführe, erhalte ich ein ähnliches Ergebnis. 30 - 40 Abfragen sind erheblich langsamer als die anderen, aber diese 30 - 40 sind ungefähr gleich schnell.

Ich greife mit dem lokalen Domainnamen auf die Datenbank zu. Wenn ich die Datenbank zur Laufzeit des Skripts überwache, werden die CPU und auch die Speicherlast ungefähr 10% betragen.

Meine erste Vermutung waren einige Probleme in der Netzwerkkonfiguration, aber ich kann dort keine Probleme finden. Hat jemand eine Idee, was hier passiert? Oder vielleicht ein Hinweis, wo ich auch suchen kann?

Konfigurations-XML des Datenbankservers:

<domain type='kvm' id='4'>
  <name>sql1</name>
  <uuid>beb47f80-10a4-4687-891e-6195933d636d</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='forbid'>SandyBridge</model>
  </cpu>
  <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>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/vm/sql1.img'/>
      <backingStore/>
      <target dev='hda' bus='ide'/>
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='writeback'/>
      <source file='/vm/sql1_data.img'/>
      <backingStore/>
      <target dev='hdb' bus='ide'/>
      <alias name='ide0-0-1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x7'/                                                                                                                                                                                                >
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <alias name='usb'/>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'                                                                                                                                                                                                 multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <alias name='usb'/>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/                                                                                                                                                                                                >
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <alias name='usb'/>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/                                                                                                                                                                                                >
    </controller>
    <controller type='pci' index='0' model='pci-root'>
      <alias name='pci.0'/>
    </controller>
    <controller type='ide' index='0'>
      <alias name='ide'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/                                                                                                                                                                                                >
    </controller>
    <controller type='scsi' index='0'>
      <alias name='scsi0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/                                                                                                                                                                                                >
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:37:7d:67'/>
      <source bridge='intbr0'/>
      <target dev='vnet3'/>
      <model type='rtl8139'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/                                                                                                                                                                                                >
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/3'/>
      <target port='0'/>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/3'>
      <source path='/dev/pts/3'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='mouse' bus='ps2'>
      <alias name='input0'/>
    </input>
    <input type='keyboard' bus='ps2'>
      <alias name='input1'/>
    </input>
    <graphics type='vnc' port='5903' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/                                                                                                                                                                                                >
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/                                                                                                                                                                                                >
    </memballoon>
  </devices>
  <seclabel type='none' model='none'/>
  <seclabel type='dynamic' model='dac' relabel='yes'>
    <label>+109:+117</label>
    <imagelabel>+109:+117</imagelabel>
  </seclabel>
</domain>

config xml des Webservers:

<domain type='kvm' id='2'>
  <name>web1</name>
  <uuid>7ac19f58-438f-4c54-b232-7acd58bb4497</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='forbid'>SandyBridge</model>
  </cpu>
  <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>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='writeback'/>
      <source file='/vm/web1.img'/>
      <backingStore/>
      <target dev='hda' bus='ide'/>
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/vm/web1_data.img'/>
      <backingStore/>
      <target dev='hdb' bus='ide'/>
      <alias name='ide0-0-1'/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <alias name='usb'/>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <alias name='usb'/>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <alias name='usb'/>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'>
      <alias name='pci.0'/>
    </controller>
    <controller type='ide' index='0'>
      <alias name='ide'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:99:65:78'/>
      <source bridge='intbr0'/>
      <target dev='vnet1'/>
      <model type='rtl8139'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/1'/>
      <target port='0'/>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='mouse' bus='ps2'>
      <alias name='input0'/>
    </input>
    <input type='keyboard' bus='ps2'>
      <alias name='input1'/>
    </input>
    <graphics type='vnc' port='5901' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='none' model='none'/>
  <seclabel type='dynamic' model='dac' relabel='yes'>
    <label>+109:+117</label>
    <imagelabel>+109:+117</imagelabel>
  </seclabel>
</domain>

Antworten

1 MichaelHampton Sep 29 2020 at 02:11

Ihre VM emluiert eine rtl8139-Netzwerkkarte, ein 10/100-Mbit / s-Gerät aus der Mitte der neunziger Jahre. Dieser Treiber ist nur vorhanden, damit KVM alten Betriebssystemen die Verbindung zum Netzwerk ermöglichen kann.

Für moderne Betriebssysteme, die heute noch häufig verwendet werden, ist es am besten, die virtio-Netzwerkkarte zu verwenden. Diese paravirtualisierte Netzwerkkarte verfügt über integrierte Linux-Treiber und verfügbare Treiber für Windows (XP / 2003 und höher), verschiedene BSD-Varianten und möglicherweise andere Betriebssysteme. Sie ist normalerweise die Option mit der höchsten Leistung, ohne eine physische Netzwerkkarte (oder) zu durchlaufen virtuelle Funktion) an die VM.

Für neuere Betriebssysteme (aus den letzten 20 Jahren oder so) ohne Virtio-Treiber ist die nächstbeste zu verwendende virtuelle Netzwerkkarte im Allgemeinen e1000, die eine Intel-Gigabit-Netzwerkkarte emuliert.