メッセージ欄

2012年1月の日記

一覧で表示する

NetBSD on KVM で性能が出ない (dbenchによるベンチマーク)
2012/01/22(日) 23:16 NetBSD はてブ情報 はてブに登録 はてブ数

NetBSDでKVMを動かしていますが、どうにもディスクの速度がもっさりです。

そこで、同じ仮想科環境でLinuxなみの速度を目標に、まずはベンチマークをして現状把握をすることにしました。

用意した環境は次の三つで、リファレンスとなるのはx86_64なUbuntuと我らがNetBSD/amd64, NetBSD/i386です。
  • Ubuntu *1
  • NetBSD/i386 *2
  • NetBSD/amd64 *3
ベンチマークに使ったのはdbenchです。ddベンチでもよいかと思っていましたが、せっかくなので専用のベンチマークを使うかなと思いました。ちなみにdbenchを選んだ理由は特になく、pkgsrcをあさってdiskのdかなーと思ってみたらそうだった、ぐらいの軽いノリです。
  • dbenchについて
    • dbench-3.04を使用
    • client.txtは同一
    • 実行コマンドはdbench -c client.txt 5
  • diskについて
    • すべてvirtioを使用
    • linuxは(/dev/vda1 on / type ext4 (rw,errors=remount-ro))
    • NetBSDは(/dev/ld0a on / type ffs (log, local))
    • すべてqemu-imgによるイメージファイル
まずは何のチューニングもせずに測定です。

あっ、NetBSD/amd64はhttp://www.tokuda.net/diary/KVM/NetBSDinstallにも書いたとおりACPI, MPの両方をOFFにして動作させています。

結果は次のとおり。
OSスループット(MB/s)
Ubuntu350.458
NetBSD/i3866.043
NetBSD/amd6428.191
なんというか、ちょっとびっくりするくらいの差がついています。NetBSD/i386はなにかの測定ミスかと思うくらいの違いです。

また、NetBSD/amd64も速度が安定せず、徐々にスループットをあげて35MB/sぐらいで安定したと思いきや、徐々に下がってきて、結果として28MB/sぐらいになるという挙動です。

このぐらい差がつくと、ちょろっとしたチューニングで劇的に改善するんじゃないの? とかあさはかな考えでdkctlによるstrategyの変更を実施してみました。具体的にはpriocscanからfcfsです。

結果、26.1531 MB/s って下がってしまいました。

これにめげず、ジャーナルしないほうが速いかもとWAPBLをOFFに (mountオプションからlogを削除) してみました。

結果、22.5587 MB/s ってもっと下がってしまいました。WAPBLの説明を改めて読むと、asyncよりも少し遅い、と書いてあるくらいですから当たり前ですね。

そのあとも何度かベンチマークを走らせたのですが、どんどん結果が悪くなる一方です。

これはちょっとおかしい傾向で、悪いなら悪いなりに数字が安定してくれないと困ってしまいます。

ファイルシステムのチューニング以外の見落としがある可能性も高いということで、今日はここまで。

*1 : Linux ubuntu 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:24 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

*2 : NetBSD nbsd-head 5.99.59 NetBSD 5.99.59 (GENERIC) #0: Fri Jan 13 00:27:37 UTC 2012 builds@b7.netbsd.org:/home/builds/ab/HEAD/i386/201201121750Z-obj/home/builds/ab/HEAD/src/sys/arch/i386/compile/GENERIC i386

*3 : NetBSD head64. 5.99.59 NetBSD 5.99.59 (GENERIC) #0: Thu Jan 12 19:43:43 UTC 2012 builds@b8.netbsd.org:/home/builds/ab/HEAD/amd64/201201121750Z-obj/home/builds/ab/HEAD/src/sys/arch/amd64/compile/GENERIC amd64

1: 774 『ubuntuがいくらなんでも速すぎませんか。 お高いディスクお使いですか。』 (2012/01/30 15:54)

2: tokuda 『いえ、高いディスクでもなんでもない、何の変哲もないSATA 3.5inchディスクです。dmesgにはWD20EARS-00Mっ...』 (2012/02/11 24:52)

3: 774 『なるほど、dbenchのことは知りませんが、ちょっと前のSSDのカタログ性能くらい出ちゃってるのであれれと思いました。 NetB...』 (2012/02/16 11:42)

Tipsと落とし穴
2012/01/22(日) 21:38 NetBSD はてブ情報 はてブに登録 はてブ数

xmlファイルの直接編集はだめ。virshのedit使うべし。

  • /etc/libvirt/qemu の下にあるxmlファイルを編集しちゃダメ。反映されません。
  • virshからeditしましょう。

ファイル形式のディスクイメージをqcow2形式で作る

qcow2だとrawとちがって使った量に合わせて増えるので便利です。


1TBのイメージを1TB-01.imgという名前で作る例です。
root@t105:/kvm/images# qemu-img create -f qcow2 1TB-01.img 1T
Formatting '1TB-01.img', fmt=qcow2 size=1099511627776 encryption=off cluster_size=0 
qemu-imgにinfoを与えると情報が見られます。
root@t105:/kvm/images# qemu-img info 1TB-01.img 
image: 1TB-01.img
file format: qcow2
virtual size: 1.0T (1099511627776 bytes)
disk size: 148K
cluster_size: 65536
virshを起動し、edit netbsd51などと入力して設定ファイルを手書きする。
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/kvm/images/1TB-01.img'/>
  <target dev='hdb' bus='ide'/>
</disk>

気をつけること

ゲストOSのディスクはCache=noneが安全。キャッシュをホストOSにまかせるということ。
バリア ON (EXT4)が安全。これは理由なんだっけ?

virshをつかってCUI管理
2012/01/22(日) 21:31 NetBSD はてブ情報 はてブに登録 はてブ数

リモート管理のためにvirshをがんばって使っています。
用途コマンド備考
VMの一覧表示list--allをいつもつけてます
VMの起動start 
VMのコンソールに接続console 
VMの停止shutdownGuest OSがLinuxの場合はOSのシャットダウンを待ってくれるけどNetBSDだと意味ないので使わないかも
VMの強制終了(電源断)destroyこっちの方が使うかもなー
VM設定の変更edit 
設定をファイルにダンプするdumpxmlドメインを起動していないとできない
VMの作成createこれだけでは永続化されないのでdefineを使うこと
VMの永続化define 
VMの削除undefine試しに作ったやつとかゴミを消すときに使う

既存NetBSDマシンをKVMへ移行
2012/01/22(日) 21:27 NetBSD はてブ情報 はてブに登録 はてブ数

KVMを導入するにあたって、今まさに手元にあるNetBSDも含めてKVMへ移行したくなります。

とはいえ、現行のマシンはそれなりの手間をかけているのでぶっ壊れては困りますし、いつでも元に戻せるようにしておきたいはずです。

KVMは既存のNetBSDが入っているHDDをつなげて、そこからブートさせることができます。しかし、何らかのトラブルで環境を壊してしまっては元も子もありません。

したがって、既存のNetBSDが入っているディスクをddコマンドでHDDイメージにして、それをHDD代わりに使って移行のテストをすることにしました。いつでもHDDをつなぎ直せば元に戻れるという、物理的なバックアップがあるのは安心です。

たしかにddでの吸い出しは時間がかかりますが、安心感とのトレードオフですね。

なお、吸い出したHDDイメージは、おそらくシリアルブートの設定はしていません。

次の手順でシリアルブートの設定をしました。
  1. まず、小さなNetBSDが動くVMを作る
  2. 吸い出したHDDイメージをVMにディスクとして見せる設定を追加(virsh edit)
  3. 小さなNetBSDに吸い出したHDDイメージをマウント
  4. installbootを打ち込むのがよいでしょう。
    1. man installブートするとinstallboot -e -o console=com0 /dev/rwd0aという例があるのでこれを使いました
ACPIはOFFにしないとNICを認識しません。ただし、ACPIをOFFにするとshutdown -pがうまくいきません。virshからdestroyしないとOSが終了できません。

USBデバイスをゲストOSに見せる
2012/01/22(日) 19:55 未分類 はてブ情報 はてブに登録 はてブ数

USBデバイスをゲストOSに見せるためには、USBデバイスの情報を取得し、その情報をvirsh editでXMLファイルに記述する必要があります。

USBデバイスの情報を取得する

lsusbコマンドでつながっているUSBデバイスのIDなどがとれます。
tokuda@t105:~$ lsusb
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

XMLファイルでの指定方法

Bus IDとDevice IDを指定する方法とベンダIDとプロダクトIDで指定する方法の二通りがあります。

ベンダIDとプロダクトIDで指定する方法だとこんな感じ。
<hostdev mode='subsystem' type='usb'>
 <source>
  <vendor  id='0x13fd'/>
  <product id='0x1240'/>
 </source>
</hostdev>
Device IDとBus IDで指定する方法は、きっと同じデバイスを複数つなぐときに使うんでしょうね。