Edited at

Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと

More than 5 years have passed since last update.


Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと


環境

ホスト側

Mac OS X 10.9.2

Vagrant 1.5.1

VirtualBox 4.3.10

ゲスト側

CentOS 6.5


対象者


  • VirtualBoxを使っている

  • CentOSを使っている

  • アプリが何か重いなーおかしいなーと思っている人


状況


  1. VirtualBox上でFacebookアプリを作っていた。

  2. なんかしらんがアプリ動かすとめっちゃ重い

  3. 調べるとどうやらfacebookSDKでgraphAPI叩いた時にめっちゃ時間かかってる

  4. 内部ネットワークへのアクセスは軽い、外部ネットワークへのアクセスが重い

という感じで、調べてみると外部ネットワークへのアクセスに時間かかってた事を発見

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

これでようやく解決しました。