Koneksi database lambat dengan KVM
Di server saya, saya memiliki pengaturan dengan beberapa KVM yang dikelola dengan virsh di ubuntu. Sebuah vm untuk apache, sebuah vm untuk database, server email, dll. Semuanya bekerja dengan cukup baik, kecuali sistem CMS yang lebih besar berjalan dalam masalah kinerja. Saya mempersempitnya ke database. Tapi bukan kueri yang lambat itu sendiri. Jika saya menjalankannya langsung di server database, mereka secepat yang diharapkan. Tetapi tidak ketika saya menjalankannya dari VM apache. Jika saya menginstal aplikasi tersebut secara lokal tanpa VM, semuanya juga cepat.
Saya membangun alat kecil untuk menguji sedikit dan menemukan pola ini untuk 500 kueri SQL yang berbeda: statistik runtime kueri Jadi 34 dari 500 kueri lebih lambat dari yang lain. Tapi semua 34 sama lambatnya. Jika saya menjalankan skrip yang sama secara langsung di server database, semua 500 kueri berjalan cepat.
Setiap kali saya menjalankan skrip ini saya mendapatkan hasil yang serupa. 30 - 40 kueri secara signifikan lebih lambat daripada yang lain, tetapi 30 - 40 kueri tersebut kira-kira memiliki kecepatan yang sama.
Saya mengakses database dengan nama domain lokal. Jika saya memantau database selama runtime skrip, CPU dan juga beban memori kira-kira akan memperpanjang 10%.
Tebakan pertama saya adalah beberapa masalah dalam konfigurasi jaringan, tetapi saya tidak dapat menemukan masalah apa pun di sana. Ada yang tahu apa yang terjadi di sini? Atau mungkin petunjuk di mana saya bisa melihat juga?
config xml dari server database:
<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 dari server web:
<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>
Jawaban
VM Anda mengemulasi NIC rtl8139, perangkat 10/100 Mbps dari pertengahan 1990-an. Driver ini hanya ada sehingga KVM dapat mengizinkan sistem operasi kuno untuk terhubung ke jaringan.
Untuk sistem operasi modern, apapun yang masih umum digunakan sampai sekarang, paling baik gunakan virtio NIC. NIC paravirtualisasi ini memiliki driver bawaan di Linux, dan driver yang tersedia untuk Windows (XP / 2003 dan yang lebih baru), berbagai varian BSD, dan mungkin OS lain, dan biasanya merupakan opsi kinerja tertinggi, selain melewati NIC fisik (atau fungsi virtual) ke VM.
Untuk sistem operasi baru-baru ini (dari 20 tahun terakhir atau lebih) tanpa driver virtio, NIC virtual terbaik berikutnya untuk digunakan umumnya e1000, yang mengemulasi Intel gigabit NIC.