miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Windows で Rails があまりにも遅いので coLinux を入れてみた

WindowsRails がどうしようもなく遅いのは いつか 書いたとおりなんですが、客先で Rails アプリケーションのデモが必要になりまして。

  • デモは Windows のノート PC 上で実施したい
  • でも動作は速くしたい

ということで、とりあえず

で速いと言われていた coLinux を導入しましたので、ハマった点その他のメモです。(実際導入したのは半年ほど前で、思い出しながら書いているので、不正確な記述があったらすみません。。)

coLinux のインストール

ディストリビューションはいろいろあるけど、今回はステージング機と同じ CentOS を導入することに。(本当はポータビリティ確保するためにあえて別の環境を使うのが好きなんですけど、この時は余裕なかったので。)

うまいこと CentOS 5.5 が公開されていたタイミングだったので、

を参考にインストールしました。途中で

ハードディスクの量を変更したければ、12行目も修正します。

     set ROOT_SIZE=5G

みたいなことが書いてますが、仕事で使うような場合は横着せずに増やしておいたほうがいいです。「Linux 側にはファイル置かないから 2 GB で足りるでしょ」と思ってデフォルトのまま進めたら、後で容量が足りなくなって大変な思いをしたので。

Thinkad X61 で発生した問題

で、いきなりハマってしまったんだけど。インストール完了後(だったと思う)coLinux を起動すると、PC が固まってしまう。

解決のとっかかり

いろいろ調べてると、

何でかよくわからないが、ThinkPadX61+VistacoLinux無線LANという環境だと、Vistaを道連れにしてcoLinuxが落ちる。

ちなみに、無線LANをオフにしてれば落ちない。

ここで無線 LAN が原因っぽいことがわかる。

これも同様の報告。

無線 LAN をオフにして有線 LAN のほうで接続すればいけるみたいだけど、今回は社内ネットワークに無線 LAN でつなぐ必要があるからこの方法は使えない。

解決策

その後 BIOS で Security -> IO/Port Access とかいろいろいじっててようやく回避策にたどり着いた。有線 LAN のデバイスが認識されていなければ問題なく起動するみたい。

BIOS でいじらなくても、ncpa.cpl を立ち上げてローカルエリア接続(Intel(R) 82566MM Gigabit Network Connection)を無効にして、一回再起動すればいいみたい。(無効にした直後の状態ではダメで、PC 再起動が必要。)有線と同時に使う必要がなければこの方法で動くようになるんじゃないかなと。

無線 LAN のデバイスIntel(R) Wireless WiFi Link 4965AGN になってた。このあたりの不具合か何かなのかなぁ・・・。

coLinux の設定もろもろ

ようやく Thinkpad で動いたので、Rails を動かせるように色々と設定してみます。

必要ソフトのインストール

Ruby やら何やらのインストールが必要なわけですが、通常のサーバとほとんど同じなので省略します。
違いは Phusion Passenger を使わずに ruby script/server で動作確認するので Apache は要れる必要がないってくらいです。

ネットワークの設定

ruby script/server で起動して http://localhost:3000/ としてブラウザから動作確認したいので、co-boot.bat で

set P=%P% eth0=slirp,52:54:00:12:34:56,tcp:22:22/udp:177:177/tcp:3000:3000

みたいな感じで 3000/tcp も転送する設定にしています。

mount の設定

当時は WindowsNetBeans を使って開発していたので、Windows 側のファイルを Linux 側にマウントする方針にしました。

まず co-boot.bat で

set P=%P% cofs0="C:\\Users\\miau\\Documents\\workspace\\hoge\\src\\branches\\hoge"
set P=%P% cofs1="C:\\Users\\miau\\Documents\\workspace\\fuga"
set P=%P% cofs2="C:\\Users\\miau\\Documents\\workspace\\hoge\\src\\branches\\piyo"

のようにマウントしたいディレクトリを列記。

coLinux 側では準備として、マウント先のディレクトリを作っておいて・・・

mkdir /mnt/hoge
mkdir /mnt/fuga
mkdir /mnt/piyo

手動で試しにマウントしてみる。

mount -t cofs cofs0 /mnt/hoge
mount -t cofs cofs1 /mnt/fuga
mount -t cofs cofs2 /mnt/piyo

問題なさそうなら、自動的にマウントされるよう /etc/fstab を以下のように編集して再起動。

cofs0 /mnt/hoge cofs uid=root 0 0
cofs1 /mnt/fuga cofs uid=root 0 0
cofs2 /mnt/piyo cofs uid=root 0 0

パーミッション等はもっと工夫したほうがいいかもしれません。

あとは本番サーバと同じ場所で動作させられるようシンボリックリンクを設定、と。

mkdir /var/www
ln -s /mnt/hoge /var/www/hoge
ln -s /mnt/fuga /var/www/fuga
ln -s /mnt/piyo /var/www/piyo

チーム内に配布する場合

  1. coLinuxQEMU on Windows をインストールしてもらう
  2. .bat や .img を一式渡す
  3. config.bat と co-boot.bat のパスを環境に合わせて書き換えてもらう

という手順で配布できるはずです。

使用感

Ruby の実行自体はずいぶん速くなりました。rake routes に 20 秒くらいかかっていたのが 7 秒程度に落ち着いて、3 倍くらいの速度になっています。

ただ、ファイルアクセスが遅いので、svn や git は Linux 上からではなく Windows 側から使ってます。あくまでも coLinuxRuby の動作を速くするためのものということで。

今後の改善点

実行速度について

coLinux はマルチコア対応じゃないらしく、1 CPU 使い切って終わってしまいます。2 コアくらいの PC ならちょうどいいですが、もっとコア数の多い PC で動作させる場合は

にあるように Cygwin を使ったほうが速いみたいです。

ファイルアクセスについて

によると、やっぱり cofs のマウントは遅く、coLinux 上にファイルを置くと 6 倍近いパフォーマンスが出るようです。RubyRailscoLinux 上においているので Rails アプリの速度はあまり変わらない気がしますが、coLinux 上で svn や git を使うならこちらの方法のほうが良いかもしれません。

ネットワークについて

上記の設定だと slirp という一番低速な方法で接続しています。普段はそれほど気になりませんが、画像がたくさん使われているようなページで読み込みが遅かったりするので、場合によってはここも変更したほうがいいみたいです。

coLinux のネットワーク接続にはいろいろあるようで、

にまとまっていました。

もっと簡単な比較ということでは

こちらが参考になって。TAP と WinPcap が速いけど、WinPcap は無線で問題があるとのことなので、次に試すなら TAP かなと。

HDD がいっぱいになったときの対処法

・・・ということで半年ほど coLinux を使ってきたのですが、HDD がいっぱいになってしまって容量拡大が必要になりました。(これがきっかけで今回のエントリを書いてるわけですが・・・。)

を参考にして対応したのですが、coLinuxインストーラで作成した場合はファイル名等が異なるので、簡単に手順を書いておきます。

事前準備

ディスクを壊してしまうと大変なので、あらかじめ scsi0.img のバックアップを取得してから作業しましょう。

空のイメージファイル作成

Windows 上で 4 GB のファイルを作成しました。

fsutil file createnew scsi2.img 4294967296
co-boot.bat の編集

default.colinux.xml の代わりにこちらを変更します。block_device〜の代わりに

set P=%P% scsi2=disk,"%CWD%\scsi2.img"

を追加し、念のため

set P=%P% cofs0="C:\\Users\\miau\\Documents\\workspace\\hoge\\src\\branches\\hoge"
set P=%P% cofs1="C:\\Users\\miau\\Documents\\workspace\\fuga"
:
set P=%P% eth0=slirp,52:54:00:12:34:56,tcp:22:22/udp:177:177/tcp:3000:3000
set P=%P% eth1=tuntap

といった不要な設定をコメントアウト

set P=%P% fastboot 3

コメントアウトして、代わりに

set P=%P% single

を追加、と。

ブート、フォーマット、マウント

ブートすると「Do you really want to continue (y/n)?」と言われるので、とりあえず y と入力して。

プロンプトが出たら以下を実行。

mkfs.ext3 /dev/sdc
mount -t ext3 /dev/sdc /mnt/
df -h

# 一応これも実行したけど、あまり意味ない感じ
tune2fs -m 3 /dev/sdc
データの移動
cd /
cp -a bin/ boot/ dev/ etc/ home/ lib/ lost+found/ media/ misc/ net/ opt/ root/ sbin/ selinux/ srv/ sys/ tmp/ usr/ var/ /mnt/

として色々とコピー。/sys 配下のコピーで結構エラーが出ていたけど、なんだか大丈夫みたい。

手順に従い、/mnt と /proc も作成しておきます。

mkdir /mnt/mnt /mnt/proc

先頭のほうに書いたマウント設定をしているなら、ここで作っておいたほうが楽です。

mkdir /mnt/mnt/hoge /mnt/mnt/fuga /mnt/mnt/piyo
/mnt/etc/fstba の編集

一行目末尾の defaults 1 1 を errors=remount-ro 0 1 にせよということらしいです。

あと、mtab もリネームしておけとのこと。

mv /mnt/etc/mtab /mnt/etc/mtab.disable
co-boot.bat の再編集

最初に行った変更はすべて元に戻します。

そして

set P=%P% scsi0=disk,"%CWD%\scsi0.img"

set P=%P% scsi0=disk,"%CWD%\scsi2.img"

に変更して、新規に作ったディスクが使われるように設定します。

上記の方法でフォーマットした場合は root の設定も変更する必要があるようで、

set P=%P% root=/dev/sda1

set P=%P% root=/dev/sda

に変更します。

これで容量が増えていると思います。