2013年1月14日月曜日

DragonflyBSDでvirtioを利用する

DragonflyBSDのGENERICにvirtioが入ったと聞いて早速ビルドして試してみたのだが、 残念ながらネットワークのvirtioサポートはまだらしい(そもそもソースがツ リーに含まれていない感じ)。 virtio_blk.koは存在して利用できるようなので、とりあえず書き込み性能だ け簡単に比較してみた。

ホスト

  • Linux hachune.local 3.6.11-1-ARCH #1 SMP PREEMPT Tue Dec 18 08:57:15 CET 2012 x86_64 GNU/Linux
  • QEMU emulator version 1.2.1, Copyright (c) 2003-2008 Fabrice Bellard

Virtioあり

QEMUの構成

qemu-system-x86_64 -enable-kvm -smp 2 -m 2048 \
  -drive file=/dev/vg0/Dragonfly,if=virtio \
  -net nic,model=virtio,macaddr=52:54:00:43:23:11 \
  -net tap,ifname=tap0,script=/home/miku/kvm/ifup_br0.sh \
  -serial pty \
  -cdrom /home/miku/Image/dfly-x86_64-3.3-current.iso -boot d

HAMMER

29895208.6 bytes/sec

# newfs_hammer -L TEST /dev/vbd0s1b
Volume 0 DEVICE /dev/vbd0s1b    size  11.25GB
initialize freemap volume 0
initializing the undo map (504 MB)
---------------------------------------------
1 volume total size  11.25GB version 6
boot-area-size:       32.00MB
memory-log-size:      32.00MB
undo-buffer-size:    504.00MB
total-pre-allocated:   0.51GB
fsid:                95359a72-5dc9-11e2-a6d0-e915af5f7f28

NOTE: Please remember that you may have to manually set up a
cron(8) job to prune and reblock the filesystem regularly.
By default, the system automatically runs 'hammer cleanup'
on a nightly basis.  The periodic.conf(5) variable
'daily_clean_hammer_enable' can be unset to disable this.
Also see 'man hammer' and 'man HAMMER' for more information.

WARNING: HAMMER filesystems less than 50GB are not recommended!
You may have to run 'hammer prune-everything' and 'hammer reblock'
quite often, even if using a nohistory mount.
# mount_hammer /dev/vbd0s1b /mnt
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 37.101394 secs (28262442 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 32.183600 secs (32581066 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 38.717169 secs (27082972 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 34.504874 secs (30389214 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 33.650971 secs (31160349 bytes/sec)

UFS

51055029.6 bytes/sec

# newfs /dev/vbd0s1b
/dev/vbd0s1b: media size 11515.96MB
Warning: Block size and bytes per inode restrict cylinders per group to 89.
Warning: 80 sector(s) in last cylinder unallocated
/dev/vbd0s1b:   23584688 sectors in 5758 cylinders of 1 tracks, 4096 sectors
        11516.0MB in 65 cyl groups (89 c/g, 178.00MB/g, 22400 i/g)
super-block backups (for fsck -b #) at:
 32, 364576, 729120, 1093664, 1458208, 1822752, 2187296, 2551840, 2916384,
 3280928, 3645472, 4010016, 4374560, 4739104, 5103648, 5468192, 5832736,
 6197280, 6561824, 6926368, 7290912, 7655456, 8020000, 8384544, 8749088,
 9113632, 9478176, 9842720, 10207264, 10571808, 10936352, 11300896, 11665440,
 12029984, 12394528, 12759072, 13123616, 13488160, 13852704, 14217248,
 14581792, 14946336, 15310880, 15675424, 16039968, 16404512, 16769056,
 17133600, 17498144, 17862688, 18227232, 18591776, 18956320, 19320864,
 19685408, 20049952, 20414496, 20779040, 21143584, 21508128, 21872672,
 22237216, 22601760, 22966304, 23330848
# mount_ufs /dev/vbd0s1b /mnt
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 19.852371 secs (52818678 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 19.631861 secs (53411951 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 21.491887 secs (48789388 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 22.926797 secs (45735826 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 19.233114 secs (54519305 bytes/sec)

Virtioなし

QEMUの構成

qemu-system-x86_64 -enable-kvm -smp 2 -m 2048 \
  -hda /dev/vg0/Dragonfly \
  -net nic,model=e1000,macaddr=52:54:00:43:23:11 \
  -net tap,ifname=tap0,script=/home/miku/kvm/ifup_br0.sh \
  -serial pty \
  -cdrom /home/miku/Image/dfly-x86_64-3.3-current.iso -boot d

HAMMER

17620950.4 bytes/sec

# newfs_hammer -L TEST /dev/ad1s1b
Volume 0 DEVICE /dev/ad1s1b     size  11.25GB
initialize freemap volume 0
initializing the undo map (504 MB)
---------------------------------------------
1 volume total size  11.25GB version 6
boot-area-size:       32.00MB
memory-log-size:      32.00MB
undo-buffer-size:    504.00MB
total-pre-allocated:   0.51GB
fsid:                ff28dca3-5dcb-11e2-b2ce-535400432311

NOTE: Please remember that you may have to manually set up a
cron(8) job to prune and reblock the filesystem regularly.
By default, the system automatically runs 'hammer cleanup'
on a nightly basis.  The periodic.conf(5) variable
'daily_clean_hammer_enable' can be unset to disable this.
Also see 'man hammer' and 'man HAMMER' for more information.

WARNING: HAMMER filesystems less than 50GB are not recommended!
You may have to run 'hammer prune-everything' and 'hammer reblock'
quite often, even if using a nohistory mount.
# mount_hammer /dev/ad1s1b /mnt
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 59.103703 secs (17741291 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 57.336238 secs (18288190 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 57.117314 secs (18358286 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 62.101431 secs (16884893 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 62.296237 secs (16832092 bytes/sec)

UFS

28662327.0 bytes/sec

# newfs /dev/ad1s1b
/dev/ad1s1b: media size 11515.96MB
Warning: Block size and bytes per inode restrict cylinders per group to 89.
Warning: 80 sector(s) in last cylinder unallocated
/dev/ad1s1b:    23584688 sectors in 5758 cylinders of 1 tracks, 4096 sectors
        11516.0MB in 65 cyl groups (89 c/g, 178.00MB/g, 22400 i/g)
super-block backups (for fsck -b #) at:
 32, 364576, 729120, 1093664, 1458208, 1822752, 2187296, 2551840, 2916384,
 3280928, 3645472, 4010016, 4374560, 4739104, 5103648, 5468192, 5832736,
 6197280, 6561824, 6926368, 7290912, 7655456, 8020000, 8384544, 8749088,
 9113632, 9478176, 9842720, 10207264, 10571808, 10936352, 11300896, 11665440,
 12029984, 12394528, 12759072, 13123616, 13488160, 13852704, 14217248,
 14581792, 14946336, 15310880, 15675424, 16039968, 16404512, 16769056,
 17133600, 17498144, 17862688, 18227232, 18591776, 18956320, 19320864,
 19685408, 20049952, 20414496, 20779040, 21143584, 21508128, 21872672,
 22237216, 22601760, 22966304, 23330848
# mount_ufs /dev/ad1s1b /mnt
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 37.872868 secs (27686733 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 38.206654 secs (27444853 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 32.039132 secs (32727978 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 40.281541 secs (26031179 bytes/sec)
# dd if=/dev/zero of=/mnt/test.img bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 35.640524 secs (29420892 bytes/sec)

結果

virtioを利用した場合のほうが書き込み性能は2倍近く高くなることが分かっ た。読み込みは測るのをうっかり忘れてて途中で気が付いた。

HAMMER(virtio)HAMMERUFS(virtio)UFS
128262442177412915281867827686733
232581066182881905341195127444853
327082972183582864878938832727978
430389214168848934573582626031179
531160349168320925451930529420892
平均29895209176209505105503028662327

おまけのdmesg

# dmesg
Copyright (c) 2003-2013 The DragonFly Project.
Copyright (c) 1992-2003 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
DragonFly v3.3.0.942.gfa75bf-DEVELOPMENT #0: Mon Jan 14 04:04:37 JST 2013
    root@vy1.hachune.local:/usr/obj/usr/src/sys/X86_64_GENERIC
TSC clock: 1646507109 Hz, i8254 clock: 1193192 Hz
CPU: QEMU Virtual CPU version 1.2.1 (1646.52-MHz K8-class CPU)
  Origin = "AuthenticAMD"  Id = 0x623  Stepping = 3
  Features=0x783fbfd<FPU,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE,SSE2>
  Features2=0x80802001<SSE3,CX16,POPCNT,VMM>
  AMD Features=0x20100800<SYSCALL,NX,LM>
  AMD Features2=0x65<LAHF,SVM,ABM,SSE4A>
real memory  = 2147081216 (2047 MB)
avail memory = 1964879872 (1873 MB)
lapic: divisor index 0, frequency 500010320 Hz
Initialize MI interrupts
FQ scheduler policy version 1.1 loaded
wdog: In-kernel automatic watchdog reset enabled
kbd1 at kbdmux0
disk scheduler: set policy of md0 to noop
md0: Malloc disk
ACPI: RSDP 0xfd950 00014 (v00 BOCHS )
ACPI: RSDT 0x7fffe3d0 00038 (v01 BOCHS  BXPCRSDT 00000001 BXPC 00000001)
ACPI: FACP 0x7fffff80 00074 (v01 BOCHS  BXPCFACP 00000001 BXPC 00000001)
ACPI: DSDT 0x7fffe410 0124A (v01   BXPC   BXDSDT 00000001 INTL 20121018)
ACPI: FACS 0x7fffff40 00040
ACPI: SSDT 0x7ffffe30 00110 (v01 BOCHS  BXPCSSDT 00000001 BXPC 00000001)
ACPI: APIC 0x7ffffd10 00080 (v01 BOCHS  BXPCAPIC 00000001 BXPC 00000001)
ACPI: HPET 0x7ffffcd0 00038 (v01 BOCHS  BXPCHPET 00000001 BXPC 00000001)
ACPI: SSDT 0x7ffff660 0066E (v01   BXPC BXSSDTPC 00000001 INTL 20121018)
cryptosoft0: <software crypto> on motherboard
acpi0: <BOCHS BXPCRSDT> on motherboard
ACPI FADT: SCI testing interrupt mode ...
ACPI FADT: SCI select level/low
objcache_reclaimlist
objcache_reclaimlist
objcache_reclaimlist
objcache_reclaimlist
acpi0: Power Button (fixed)
Warning: ACPI is disabling APM's device.  You can't run both
acpi_timer0: <24-bit timer at 3.579545MHz> port 0xb008-0xb00b on acpi0
acpi_hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
acpi_hpet0: frequency 100000000
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
pci_link4: Unable to route IRQs: AE_NOT_FOUND
isab0: <PCI-ISA bridge> at device 1.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel PIIX3 WDMA2 controller> port 0xc060-0xc06f,0x376,0x170-0x177,0x3f6,0x1f0-0x1f7 at device 1.1 on pci0
ata0: <ATA channel 0> on atapci0
ata1: <ATA channel 1> on atapci0
disk scheduler: set policy of acd0 to noop
acd0: DVDROM <QEMU DVD-ROM/1.2.1> at ata1-master WDMA2
pci0: <bridge> (vendor 0x8086, dev 0x7113) at device 1.3 irq 9
vgapci0: <VGA-compatible display> mem 0xfebf0000-0xfebf0fff,0xfc000000-0xfdffffff at device 2.0 on pci0
virtio_pci0: <VirtIO PCI Network adapter> port 0xc040-0xc05f mem 0xfebf1000-0xfebf1fff irq 11 at device 3.0 on pci0
virtio_pci1: <VirtIO PCI Block adapter> port 0xc000-0xc03f mem 0xfebf2000-0xfebf2fff irq 11 at device 4.0 on pci0
virtio_pci1: host features: 0x710006d4 <EventIdx,0x10000000,NotifyOnEmpty,Topology,FlushCmd,SCSICmds,BlockSize,DiskGeometry,MaxNumSegs>
virtio_pci1: negotiated features: 0x254 <FlushCmd,BlockSize,DiskGeometry,MaxNumSegs>
disk scheduler: set policy of vbd0 to noop
atkbdc0: <Keyboard controller (i8042)> port 0x64,0x60 irq 1 on acpi0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model IntelliMouse Explorer, device ID 4
cpu0: <ACPI CPU> on acpi0
cpu_cst0: <ACPI CPU C-State> on cpu0
cpu1: <ACPI CPU> on acpi0
cpu_cst1: <ACPI CPU C-State> on cpu1
orm0: <Option ROM> at iomem 0xed000-0xeffff on isa0
pmtimer0 on isa0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1: can't drain, serial port might not exist, disabling
ppc0: cannot reserve I/O port range
hpt27xx: no controller detected.
CAM: Configuring 2 busses
CAM: finished configuring all busses
disk scheduler: set policy of cd0 to noop
no B_DEVMAGIC (bootdev=0)
Device Mapper version 4.16.0 loaded
dm_target_error: Successfully initialized
dm_target_zero: Successfully initialized
cd0 at ata1 bus 0 target 0 lun 0
cd0: <QEMU QEMU DVD-ROM 1.2.> Removable CD-ROM SCSI-0 device
cd0: 16.000MB/s transfers
cd0: cd present [347187 x 2048 byte records]
Mounting root from cd9660:cd0
DMA space used: 152k, remaining available: 16384k
Mounting devfs

0 件のコメント:

コメントを投稿