Membandingkan device emulated e1000 rtl8139 vs paravirtual virtio-blk virtio-net virtio-gpu dan virtiofs, memahami vhost_net untuk kernel datapath, serta mengapa virtio adalah kunci performa VM di produksi

Di episode 6-8 kita memakai if=virtio tanpa banyak menjelaskan. Episode 12 menjawab pertanyaan itu: apa itu virtio, dan mengapa ia mengubah performa VM secara drastis? Jawaban singkatnya: virtio adalah protokol paravirtualisasi — guest dan host bekerja sama secara eksplisit, menggantikan emulasi hardware yang lambat.
Ini salah satu episode paling penting di series: keputusan device model menentukan selisih performa yang bisa mencapai orde puluhan persen untuk I/O. Data center dan cloud provider serius menggunakan virtio — bukan emulasi.
Emulasi (misal e1000, rtl8139, ide) meniru hardware fisik sepenuhnya di QEMU. Setiap I/O guest harus: (1) lewat device model yang mensimulasikan register hardware, (2) ditangani bit demi bit, (3) di-exit ke user-space — lambat dan mahal.
Paravirtualisasi (virtio) tidak meniru apa pun: guest sadar bahwa ia berjalan di VM dan memakai queue bersama (shared ring buffer) untuk mengirim I/O langsung ke host. Tidak ada simulasi register — hanya deserialize request dari ring, proses, balas. Hasilnya latensi jauh lebih rendah dan throughput lebih tinggi.
| Aspek | Emulated (e1000) | Paravirtual (virtio) |
|---|---|---|
| Model | Meniru hardware fisik | Protokol bersama guest-host |
| Overhead | Tinggi (per-device emulation) | Rendah (shared ring) |
| Driver di guest | Umumnya bawaan | Perlu driver virtio (modul kernel) |
| Performa I/O | Sedang | Tinggi |
| Kapan dipakai | Kompatibilitas OS lawas | Standar untuk semua VM modern |
| Device | Fungsi | Pengganti Emulasi |
|---|---|---|
virtio-blk | Disk paravirtual | IDE/SATA |
virtio-net | Network paravirtual | e1000/rtl8139 |
virtio-gpu | Display paravirtual | VGA std |
virtio-scsi | Controller SCSI paravirtual | LSI/SATA |
virtiofs | Shared filesystem host↔guest | 9p |
Pemakaiannya di command line QEMU:
qemu-system-x86_64 \
-machine q35 -accel kvm -m 2048 -smp 2 \
-drive file=vm.qcow2,format=qcow2,if=virtio \
-netdev user,id=net0 -device virtio-net-pci,netdev=net0 \
-device virtio-gpu \
-fsdev local,path=/home/user/share,security_model=none,id=fs0 \
-device virtio-9p-pci,fsdev=fs0,mount_tag=hostshareDi sisi libvirt, device virtio otomatis dipilih saat --os-variant menyebut OS modern — contoh XML-nya (dari episode 10) memakai <model type='virtio'/> dan <target dev='vda' bus='virtio'/>.
Note
Satu-satunya alasan memilih emulasi e1000/ide adalah kompatibilitas dengan OS yang tidak punya driver virtio (misal Windows XP atau distro sangat lawas). Untuk segala sesuatu yang modern, virtio menang telak.
Virtio mengirim I/O dari guest ke QEMU user-space. Untuk network, itu masih berarti dua hop: QEMU → tap → kernel. vhost_net memotongnya: vhost di dalam kernel berbicara langsung dengan virtio ring, tanpa melewati user-space QEMU.
qemu-system-x86_64 \
-netdev tap,id=net0,vhost=on -device virtio-net-pci,netdev=net0Pada libvirt, vhost diaktifkan lewat elemen <driver name='vhost'/> pada interface (default modern). Efeknya: latency packet berkurang dan throughput naik, karena satu hop user-space dihilangkan. Prinsip yang sama berlaku untuk vhost-user dan blk (iSCSI/virtio-blk dengan vhost) untuk workload skala besar.
<interface type='network'>
<driver name='vhost' queues='4'/>
<source network='default'/>
<model type='virtio'/>
</interface>Untuk berbagi direktori host ↔ guest secara efisien, virtiofs menggantikan 9p yang lambat:
qemu-system-x86_64 \
-chardev socket,id=char0,path=/tmp/vhostfd.sock \
-device vhost-user-fs-pci,queue-size=1024,chardev=char0,tag=hostsharePada libvirt, definisikan <filesystem type='mount'> dengan <driver type='virtiofs'/>:
<filesystem type='mount' accessmode='passthrough'>
<driver type='virtiofs'/>
<source dir='/home/user/share'/>
<target dir='hostshare'/>
</filesystem>Lalu di guest, mount dengan:
mount -t virtiofs hostshare /mnt/shareif=virtio di QEMU → guest tidak menemukan disk. Solusi: pastikan virtio_blk di initramfs, atau pasang dulu driver, lalu ganti model.vhost=on hanya masuk akal dengan -netdev tap (atau macvtap), bukan user.virtiofsd berjalan — libvirt memakainya otomatis, QEMU manual harus menyediakannya.Pada episode 12 ini, kalian telah memahami virtio dan paravirtualisasi.
Inti yang harus dibawa pulang:
virtio-blk, virtio-net, virtio-gpu, virtio-scsi, virtiofs.vhost_net memindahkan datapath ke kernel — latency & throughput lebih baik.virtiofs adalah cara efisien berbagi filesystem host↔guest.Di episode 13 selanjutnya, kita akan membahas storage management & backup — storage pool libvirt (dir, LVM, iSCSI), volume virsh vol-*, snapshot qcow2 (virsh snapshot-create-as), blockcommit/blockcopy, serta strategi backup file-level vs block-level. Sampai jumpa di episode 13!