#Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと
##環境
ホスト側
Mac OS X 10.9.2
Vagrant 1.5.1
VirtualBox 4.3.10
ゲスト側
CentOS 6.5
##対象者
- VirtualBoxを使っている
- CentOSを使っている
- アプリが何か重いなーおかしいなーと思っている人
状況
- VirtualBox上でFacebookアプリを作っていた。
- なんかしらんがアプリ動かすとめっちゃ重い
- 調べるとどうやらfacebookSDKでgraphAPI叩いた時にめっちゃ時間かかってる
- 内部ネットワークへのアクセスは軽い、外部ネットワークへのアクセスが重い
という感じで、調べてみると外部ネットワークへのアクセスに時間かかってた事を発見
VagrantをNATモードで動かしているんだが、NAT変換するときの名前解決にはちゃめちゃに時間がかかっているご様子
追記:CentOS固有の問題だったことがわかりました。
http://www.kunitake.org/chalow/2012-11-02-1.html
じゃあどうしたらいいの
方法としてはそもそも仮想環境をブリッジ接続にしちゃって、静的IP割り振ってあげれば良いってのがあった。
http://www.h-fj.com/blog/archives/2013/10/31-103556.php
静的IP振って良いんだったら上記でもOKだったんだけど、今回はNAT変換モードのままうまくやる方法を書く。
VagrantFileの設定
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
...
config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
end
...
end
http://vboxmania.net/content/vboxmanage-modifyvm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
によると
--natdnsproxy<1-N> on|off:
このオプションは、NATエンジンのプロキシがすべてのゲストマシンのDNS要求をホストマシンのDNSサーバーに要求します。
--natdnshostresolver<1-N> on|off:
このオプションは、NATエンジンがDNS要求を処理する際にホストのリゾルバ機構を使うようになります。
- See more at: http://vboxmania.net/content/vboxmanage-modifyvm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89#sthash.MYEzzmBh.dpuf
とのことで、
ゲストOSからのネットワーク接続の際にホストマシンのDNSサーバーを使って名前解決をする様になり、これで速度改善しました。
バグ(メール送れない)
--natdnshostresolverをonにしている場合にmxレコードが引けずにaレコードが返ってくるというバグが
virtualboxにあるらしく、実際この設定をonにすると仮想マシンからメールが送れなくなります。
https://www.virtualbox.org/ticket/11540
なので、メールを送るシステムの場合はnatdnshostresolverはoffにした方が良いです。
(VagrantFileで一度onにした場合は一度明示的にoffにしてreloadなりしないと直らないので注意)
ちなみに、これやると再びネットワークが遅くなります。
バグ対応
vagrant $ sudo vim /etc/resolv.conf
で、以下を追記する
options single-request-reopen
これでようやく解決しました。