しょんぼり技術メモ

まいにちがしょんぼり

続・ディスクイメージのスループット

ディスクイメージのスループット - しょんぼり技術メモの続き。

ext3パーティションを作ってからマウントして計測していたが、思ったよりもvirtioがふるわずという結果に。twitterで相談したら、デバイスファイルに直接読み書きしてみたら?とアドバイスを受けたので、実際にやってみた。

あんまり時間がないので測定サイズは1GB。

準備

前回と同様の方法で1GiBのRAWイメージを2つ作成。ide-modeとvirtioでvirt-managerを使って登録。

ゲスト上で、readテスト用のランダムデータを作成。

# dd if=/dev/urandom of=/tmp/random.1GiB.dat bs=1M count=1024

ide-modeとvirtioの区別がしやすいように、ハードリンクを作成

# ln /dev/sda /dev/idemode
# ln /dev/vdb /dev/virtio

write測定

次のようにして測定。(前回エントリでホスト側のエントリ削除を書き忘れてました。測定時には実施)

# 【ホストOSで】echo 3 > /proc/sys/vm/drop_caches          # ホスト側キャッシュ削除
# echo 3 > /proc/sys/vm/drop_caches                        # ゲスト側キャッシュ削除
# dd if=/dev/zero of=測定対象 bs=1M count=1024 oflag=direct

んで、結果はこちら。virtioが健闘している。なんだやるじゃんvirtio。

ide virtio
60.8MBps 62.4MBps
60.0MBps 62.7MBps
59.3MBps 61.1MBps
↓平均 ↓平均
60.0MBps 62.1MBps

read測定

あらかじめ作っておいた1GiBのランダムデータファイルをcpして、それを読み出す。

# cp /tmp/random.1GiB.dat /dev/idemode
# cp /tmp/random.1GiB.dat /dev/virtio

同様に、次のようにして測定。

# 【ホストOSで】echo 3 > /proc/sys/vm/drop_caches          # ホスト側キャッシュ削除
# echo 3 > /proc/sys/vm/drop_caches                        # ゲスト側キャッシュ削除
# dd if=/dev/測定対象 of=/dev/null bs=1M count=1024 iflag=direct

結果はこちら。virtioェ…

ide virtio
87.7MBps 34.3MBps
84.9MBps 33.5MBps
86.9MBps 31.7MBps
↓平均 ↓平均
86.5MBps 33.1MBps

結論

【急募】virtioの良さ

追記

テストデータのサイズ(1GiB, 2GiB)がゲストのメモリサイズ(2GiB)に収まってたのが原因では?と思いつき、ゲストのメモリサイズを512MiBにして試した。変わらなかった。泣いた。

さらに追記

[twitter:@hamano]さんに「本当にIDEとして見えてる?」とご指摘頂いたので早速チェック。

# lspci (コピペできなかったので手打ち。当該部分のみ抜粋)
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:05.0 SCSI storage controller: Qumranet, Inc. Virtio block device
00:06.0 SCSI storage controller: Qumranet, Inc. Virtio block device

システム用にVirtIO Diskを1つ、測定用にIDE DiskとVirtIO Diskを1つずつ割り当てているので、どうやら正しく(?)認識されているようです。

もっと追記

それぞれの詳しい環境です。

ホスト(Fedora 12 x64)
# uname -r
2.6.32.16-141.fc12.x86_64

# rpm -qa | grep kvm
qemu-kvm-0.11.0-13.fc12.x86_64
ゲスト(Fedora 13 x64)
# uname -r
2.6.33.3-85.fc13.x86_64

# lsmod
Module                  Size  Used by
fuse                   54749  2 
sunrpc                192013  1 
ip6t_REJECT             4055  2 
nf_conntrack_ipv6      17513  2 
ip6table_filter         2743  1 
ip6_tables             16558  1 ip6table_filter
ipv6                  267065  62 ip6t_REJECT,nf_conntrack_ipv6
uinput                  7230  0 
snd_ens1370            20973  2 
gameport                8936  1 snd_ens1370
snd_rawmidi            19917  1 snd_ens1370
snd_seq                50941  0 
snd_seq_device          5895  2 snd_rawmidi,snd_seq
snd_pcm                76131  1 snd_ens1370
microcode              17930  0 
i2c_piix4              11822  0 
snd_timer              19234  2 snd_seq,snd_pcm
snd                    60573  10 snd_ens1370,snd_rawmidi,snd_seq,snd_seq_device,snd_pcm,snd_timer
i2c_core               24427  1 i2c_piix4
joydev                  9439  0 
virtio_balloon          3237  0 
virtio_net             13581  0 
soundcore               6198  1 snd
snd_page_alloc          7221  2 snd_ens1370,snd_pcm
virtio_blk              4311  3 
virtio_pci              5923  0 
virtio_ring             5199  1 virtio_pci
virtio                  4058  4 virtio_balloon,virtio_net,virtio_blk,virtio_pci

# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB Controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Qumranet, Inc. Virtio network device
00:04.0 Multimedia audio controller: Ensoniq ES1370 [AudioPCI]
00:05.0 SCSI storage controller: Qumranet, Inc. Virtio block device
00:06.0 SCSI storage controller: Qumranet, Inc. Virtio block device
00:07.0 RAM memory: Qumranet, Inc. Virtio memory balloon

# dmesg の一部
ata_piix 0000:00:01.1: version 2.13
ata_piix 0000:00:01.1: setting latency timer to 64
scsi0 : ata_piix
scsi1 : ata_piix
ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc000 irq 14
ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc008 irq 15

ata1.00: ATA-7: QEMU HARDDISK, 0.11.0, max UDMA/100

scsi 0:0:0:0: Direct-Access     ATA      QEMU HARDDISK    0.11 PQ: 0 ANSI: 5
sd 0:0:0:0: Attached scsi generic sg0 type 0
sd 0:0:0:0: [sda] 2097152 512-byte logical blocks: (1.07 GB/1.00 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
 sda:
ata2.00: configured for MWDMA2
 unknown partition table

ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10
virtio-pci 0000:00:03.0: PCI INT A -> Link[LNKC] -> GSI 10 (level, high) -> IRQ 10
ACPI: PCI Interrupt Link [LNKA] enabled at IRQ 10
virtio-pci 0000:00:05.0: PCI INT A -> Link[LNKA] -> GSI 10 (level, high) -> IRQ 10
ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 11
virtio-pci 0000:00:06.0: PCI INT A -> Link[LNKB] -> GSI 11 (level, high) -> IRQ 11
virtio-pci 0000:00:07.0: PCI INT A -> Link[LNKC] -> GSI 10 (level, high) -> IRQ 10
 vda: vda1 vda2
 vdb: unknown partition table