KVM, virtio, Windows and the paravirtualized block device

Prosegue la serie di post dedicati all’hypervisor KVM, in questo post vedremo come installare i driver del disco paravirtualizzati su di un guest Windows based, nello specifico Windows 2003 Server.

Circa 15 mesi fa trattai l’installazione dei driver di rete paravirtualizzati, per chi si fosse perso il post l’url da cui leggerlo è la seguente: “KVM, virtio, Windows and the paravirtualized network device“, se invece siete interessati ad aggiungere i driver paravirtualizzati ad un guest linux potreste trovare interessante questo post: “KVM: Adding paravirtualized device on linux guest“.

Installazione

Se avete in vostro possesso una macchina virtuale già installata e configurata con l’interfaccia ide la prima cosa da da fare è creare un’immagine disco ex-novo e scaricare l’iso con i driver aggiornati dal link inserito in bibliografia…

paolomargara@merdbook:~$ wget http://www.linux-kvm.com/sites/default/files/viostor-2009-11-25.iso
paolomargara@merdbook:~$ qemu-img create /media/sda5/vm/img/volume2.img -f qcow 1G
Formatting '/media/sda5/vm/img/volume2.img', fmt=qcow, size=1048576 kB

…ed editare la configurazione del nostro guest windows based aggiungendo nella sezione devices l’immagine iso scaricata e l’immagine disco creata precedentemente, dopodiché avviate il vostro guest. Al solito si procede con virsh edit $nome_guest

<disk type='file' device='cdrom'>
 <source file='/media/sda5/vm/iso/viostor-2009-11-25.iso'/>
 <target dev='hdb' bus='ide'/>
 <readonly/>
 </disk>
 <disk type='file' device='disk'>
 <source file='/media/sda5/vm/img/hellgate.img'/>
 <target dev='hda' bus='ide'/>
 </disk>
 <disk type='file' device='disk'>
 <source file='/media/sda5/vm/img/volume2.img'/>
 <target dev='vda' bus='virtio'/>
 </disk>

All’avvio ci si trova con un nuovo device rilevato nel sistema e la solita gui d’installazione driver avviata, a questo punto non resta che installare il driver precedentemente scaricato ricordandosi di cliccare su “Continue Anyway” quando ci viene chiesto se continuare o meno con l’installazione del driver non firmato, dopodichè è fatta: la solita procedura avanti…avanti…avanti…ok a cui Microsoft ci ha abituato.


Al termine spegnete la macchina virtuale, rimuovete l’istanza disk riguardante l’immagine disco aggiunta e cancellate l’immagine (ammesso che non vi serva).

Ora editate l’attributo dev impostando il valore da hda in vda e l’attributo di bus dal valore ide a virtio in maniera simile a quanto segue:

 <disk type='file' device='disk'>
<source file='/media/sda5/vm/img/hellgate.img'/>
<target dev='vda' bus='virtio'/>
</disk>

Ora potete avviare la macchina virtuale con l’interfaccia disco para-virtualizzata!

Benchmark

Per testare l’effettiva utilità di questi driver ho effettuato un breve test, che non vuole essere esaustivo, sulle loro performance.

Per valutare le performance del disco dell’host ho effettuato delle prove in scrittura e lettura con dd, questo non costituisce un test esaustivo ma può essere un buon indice delle performance per letture e scritture sequenziali. Sul disco della macchina su cui ho effettuato i test (un MacBook con installata una Ubuntu 9.10) ho riscontrato nel test di lettura sequenziale circa 51MB/s e nel test di scrittura sequenziale circa 41MB/s.

paolomargara@merdbook:~$ dd if=/dev/zero of=./dump.raw bs=1K count=1M
1048576+0 record dentro
1048576+0 record fuori
1073741824 byte (1,1 GB) copiati, 24,6735 s, 43,5 MB/s
paolomargara@merdbook:~$ dd if=./dump.raw of=/dev/null bs=1K count=1M
1048576+0 record dentro
1048576+0 record fuori
1073741824 byte (1,1 GB) copiati, 20,7086 s, 51,8 MB/s

In seguito i test effettuati sul guest prima dell’installazione del driver, nel mio caso stavo usando l’interfaccia IDE, e dopo con l’interfaccia con i driver para-virtualizzati.

Come si può notare i risultati ottenuti non sono incoraggianti: nello specifico non si è riscontrato alcun miglioramento nelle pura velocità d’IO anzi si è ottenuto un drastico peggioramento.
Ciò probabilmente porterà molti di voi a fare rollback e tornare ai driver IDE tuttavia c’è da dire che durante i test ho riscontrato un minor utilizzo della CPU nei test effettuati con i driver para-virtualizzati e, ma questa costituisce più una mia impressione che un dato oggettivo, una maggior velocità di risposta del sistema.
C’è da dire che l’immagine del disco era nel formato qcow, può darsi che passando da immagine presente all’interno di un file system (con tutto l’overhead che ne consegue) ad una configurazione che utilizza il formato raw e mantiene l’immagine all’interno di un volume LVM i dati riscontrati possono anche cambiare di molto.

Tempo fa lessi nella mailing-list di di KVM che cambiando l’IO scheduler del disco da quello impostato a deadline le prestazioni è possibili ottenere migliori prestazioni, purtroppo non ho avuto il tempo di effettuare test a riguardo, se l’argomento vi interessa ho inserito in bibliografia un link con la descrizione delle operazioni da svolgere.

Aggiornamento

L’aggiornamento lo si può fare con la solita procedura: basta andare in Control Panel, cliccare su System Properties, aprire il tab Hardware e dopodiché cliccare su Device Manager.

Fate click con tasto destro su Red Hat VitIO SCSI controller in SCSI and RAID controller e cliccate su Update Driver per avviare la solita procedura di aggiornamento driver.

Sull’host non sono richieste operazioni.

Procedura d'aggiornamento

Bibliografia

Related post:

6 Comments

  1. Andrea says:

    Grazie per i tuoi articoli.
    Ho appena iniziato la migrazione ai server virtualizzati.
    Utilizzo Ubuntu come host e ho installato un server SME (CentOs).
    Devo attivare un modem per fax su SME.
    Quando tento di virtualizzare la porta ttyS0, questa diventa, sul Guest, la console.
    Modifico gli xml sia con vi e poi faccio il define con virsh, sia direttamente da virsh.
    Capisco che la domanda non é attinente all’articolo, ma vedo che sei ferrato e non sono riuscito a trovare nessuna risposta in altri link. Ho veramente necessità di risolvere il problema.

    Grazie in anticipo per qualunque suggerimento.

    esempi:

    faccio il define e:

    ???????????????

  2. Andrea says:

    HHOPS
    Gli xml non sono apparsi, li rinvio

    #
    #
    #
    #
    #
    #

    dopo define diventa

    #
    #
    #
    #
    # ???????????
    #

  3. Andrea says:

    Gli xml non sono apparsi, li rinvio

    serial type=\\\’pty\\\’
    target port=\\\’0\\\’/
    /serial
    console type=\\\’ptyl\\\’
    target port=\\\’1\\\’/
    /console

    dopo define diventa

    serial type=\\\’pty\\\’
    target port=\\\’0\\\’/
    /serial
    console type=\\\’ptyl\\\’
    target port=\\\’0\\\’/ ???????????
    /console

  4. MRG says:

    Francamente sul pass through della porta seriale ho un’esperienza solo teorica, puoi dare un’occhiata al seguente link nella documentazione ufficiale: Consoles, serial, parallel & channel devices.

    Buona fortuna!

  5. Andrea says:

    Il link di libvirt lo avevo già spulciato ma senza riuscire a capire se devo utilizzare pty o dev .
    Devo dire che queste pagine sono scarne di informazioni.
    Comunque se posso vorrei porti un’altra questione.
    E’ importante, o perlomeno, si riscontrano differenze utilizzando immagini raw piuttosto che immagini qcow2 con KVM?

    Grazie

    • MRG says:

      Dipende in gran parte dalla versione di qemu che usi e da come hai impostato la cache del disco virtuale.
      Con le vecchie versioni di qemu a mio avviso è più veloce utilizzando raw, con le ultime il divario si è quasi azzerato ma raw continua ad essere più veloce.