2012年04月08日

さくらのVPS 1GでFreeBSD9.0の使用時にvirtio-modを有効化

さくらのVPS 512Mプランでは仮想ディスクはSATAとして認識されていましたが、新しくリリースされた1Gプランではvirtioが使われるようになりdisk I/Oの性能が改善されています。

しかしながら、virtioはFreeBSD 10のカーネルで取り込まれる予定で、FreeBSD 9.xや8.xではkernel moduleとして提供されています。まずはkernel moduleを導入します。
kernel moduleはportsで提供されています。

$ cd /usr/ports/emulators/virtio-kmod
$ make install clean

次に、/boot/loader.confに設定を追記します。今のところ、さくらのVPSではvtnet等は使えない状態ですが、今後対応があるかもしれないので追記しておきました。

$ more /boot/loader.conf
[/usr/ports/emulators/virtio-kmod]
virtio_load="YES"
virtio_pci_load="YES"
virtio_blk_load="YES"
if_vtnet_load="YES"
virtio_balloon_load="YES"

次に、仮想マシンのvirtioを有効化します。
さくらのVPSは、Linuxがインストールされている場合は標準でvirtioが有効化されています。FreeBSDに関しては8.1-RELEASEがインストールされるため、virtioは有効化されません。一度、CentOS等のLinuxのOS再インストールをVPSのコントロール画面から行う必要があります。そうすることで、仮想マシンのディスク周りにvirtioが使われるようになります。OSの再インストール用のイメージが走り始めたら、途中でコントロールパネルから再起動を行い、FreeBSDを起動させます。
注意すべきは、必ず「カスタムOSインストール」から選んでください。rootパスワードを入力して再インストールする画面から行うと、HDDにイメージが書き込まれてしまい、FreeBSDが消えてしまいます。「カスタムOSインストール」画面からなら仮想CDドライブにインストールイメージがマウントされるだけなので、インストール途中で再起動すればHDDへの書き込みは一切ありません。
ちなみに、SATA接続に戻したい場合は、OSの再インストールからFreeBSDを選んで再起動すれば戻ります。

再起動されると、/dev/ad*がなくなり、/dev/vtbd*といったデバイスが生えてきます。
fstabを書き換えてないので、途中でmountrootが見つからないといってエラーで止まりますので、rootの場所をOSに教えてあげます。
私の環境ではad0s1aだったので、vtbd0s1aがmountrootになります。

mountroot> ufs:/dev/vtbd0s1a

無事に起動できたら/etc/fstabを編集しましょう。失敗したら、SATAに戻せば普通に起動できます。

# more /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
#/dev/ad0s1a            /               ufs     rw              1       1
/dev/vtbd0s1a           /               ufs     rw              1       1
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0

これでvirtio-modが有効化されます。time -p dd if=/dev/zero of=/tmp/hoge bs=1M count=8192などで、単純にrealな書き込み時間を計測すると、大体2倍から3倍の高速化がみられました。ゲストマシンのIOキャッシュとホストマシンのIOキャッシュが、どの程度効いているかはわかりませんが、かなりの速度アップが見込まれます。