Ubuntu

與 KVM 的數據庫連接緩慢

  • September 28, 2020

在我的伺服器上,我有一個設置,在 ubuntu 上使用 virsh 管理多個 KVM。一個用於 apache 的 vm,一個用於數據庫、郵件伺服器等的 vm。一切都執行良好,除了更大的 CMS 系統在性能問題上執行。我把它縮小到數據庫。但並不是查詢本身很慢。如果我直接在數據庫伺服器上執行它們,它們的速度和預期的一樣快。但不是當我從 apache VM 執行它們時。如果我在沒有虛擬機的情況下在本地安裝這些應用程序,那麼一切都很快。

我建構了一個小工具來進行一些測試,並為 500 個不同的 SQL 查詢找到了這種模式: 查詢執行時的統計數據 因此 500 個查詢中的 34 個比其他查詢慢。但是所有 34 個都差不多慢。如果我直接在數據庫伺服器上執行相同的腳本,所有 500 個查詢都執行得很快。

每次我執行這個腳本時,我都會得到類似的結果。30 - 40 次查詢明顯慢於其他查詢,但 30 - 40 次查詢的速度大致相同。

我使用本地域名訪問數據庫。如果我在腳本執行期間監控數據庫,CPU 和記憶體負載將大致擴展 10%。

我的第一個猜測是網路配置中的一些問題,但我在那裡找不到任何問題。有人知道這裡發生了什麼嗎?或者也許是我可以查看的提示?

配置數據庫伺服器的xml:

<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>

Web伺服器的配置xml:

<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>

您的 VM 正在模擬 rtl8139 NIC,這是 1990 年代中期的 10/100 Mbps 設備。此驅動程序僅存在以便 KVM 可以允許古老的作業系統連接到網路。

對於現代作業系統,今天仍然常用的任何東西,最好使用 virtio 網卡。這種半虛擬化 NIC 在 Linux 中具有內置驅動程序,以及適用於 Windows(XP/2003 及更高版本)、各種 BSD 風格以及可能的其他作業系統的驅動程序,通常是性能最高的選項,沒有通過物理 NIC(或虛擬功能)到虛擬機。

對於最近沒有 virtio 驅動程序的作業系統(過去 20 年左右),下一個最好使用的虛擬 NIC 通常是 e1000,它模擬 Intel 千兆位 NIC。

引用自:https://serverfault.com/questions/1035518