Windows で Rails がどうしようもなく遅いのは いつか 書いたとおりなんですが、客先で Rails アプリケーションのデモが必要になりまして。
- デモは Windows のノート PC 上で実施したい
- でも動作は速くしたい
ということで、とりあえず
で速いと言われていた coLinux を導入しましたので、ハマった点その他のメモです。(実際導入したのは半年ほど前で、思い出しながら書いているので、不正確な記述があったらすみません。。)
coLinux のインストール
にディストリビューションはいろいろあるけど、今回はステージング機と同じ CentOS を導入することに。(本当はポータビリティ確保するためにあえて別の環境を使うのが好きなんですけど、この時は余裕なかったので。)
うまいこと CentOS 5.5 が公開されていたタイミングだったので、
を参考にインストールしました。途中で
ハードディスクの量を変更したければ、12行目も修正します。
set ROOT_SIZE=5G
みたいなことが書いてますが、仕事で使うような場合は横着せずに増やしておいたほうがいいです。「Linux 側にはファイル置かないから 2 GB で足りるでしょ」と思ってデフォルトのまま進めたら、後で容量が足りなくなって大変な思いをしたので。
Thinkad X61 で発生した問題
で、いきなりハマってしまったんだけど。インストール完了後(だったと思う)coLinux を起動すると、PC が固まってしまう。
解決のとっかかり
いろいろ調べてると、
何でかよくわからないが、ThinkPadX61+Vista+coLinux+無線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 の設定
当時は Windows で NetBeans を使って開発していたので、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
チーム内に配布する場合
- coLinux と QEMU on Windows をインストールしてもらう
- .bat や .img を一式渡す
- config.bat と co-boot.bat のパスを環境に合わせて書き換えてもらう
という手順で配布できるはずです。
使用感
Ruby の実行自体はずいぶん速くなりました。rake routes に 20 秒くらいかかっていたのが 7 秒程度に落ち着いて、3 倍くらいの速度になっています。
ただ、ファイルアクセスが遅いので、svn や git は Linux 上からではなく Windows 側から使ってます。あくまでも coLinux は Ruby の動作を速くするためのものということで。
今後の改善点
実行速度について
coLinux はマルチコア対応じゃないらしく、1 CPU 使い切って終わってしまいます。2 コアくらいの PC ならちょうどいいですが、もっとコア数の多い PC で動作させる場合は
にあるように Cygwin を使ったほうが速いみたいです。
ファイルアクセスについて
によると、やっぱり cofs のマウントは遅く、coLinux 上にファイルを置くと 6 倍近いパフォーマンスが出るようです。Ruby や Rails は coLinux 上においているので Rails アプリの速度はあまり変わらない気がしますが、coLinux 上で svn や git を使うならこちらの方法のほうが良いかもしれません。
HDD がいっぱいになったときの対処法
・・・ということで半年ほど coLinux を使ってきたのですが、HDD がいっぱいになってしまって容量拡大が必要になりました。(これがきっかけで今回のエントリを書いてるわけですが・・・。)
を参考にして対応したのですが、coLinux 用インストーラで作成した場合はファイル名等が異なるので、簡単に手順を書いておきます。
事前準備
ディスクを壊してしまうと大変なので、あらかじめ scsi0.img のバックアップを取得してから作業しましょう。
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
に変更します。
これで容量が増えていると思います。