Vagrant(VirtualBox)でディスクアクセスが遅い問題の対処法

はじめに

Windows + Vagrant + VirtualBox で Laravel を動かすと、ローディングにかなりの時間がかかって仕事が進まなかったという問題の対処方法を紹介します。NFS を使用する方法です。

Virtual Box の共有フォルダ機能は遅い

ホスト側とゲスト側でプログラムファイルなどを共有するために VirtualBox には共有フォルダ機能が存在しますが、デフォルトの共有方法を用いるとかなり遅くなります。
仕事で Laravel を使った Web サイトを VirtualBox で構築(指定されたので...)していたところ、Windows 環境や Mac 環境でも 1 ページ読み込むのに 5 秒ほどかかり、まともに仕事ができない状態になってしまいました。
Laravelのデバッグツールのスクリーンショット、Bootingに1.15s、Appに1.03sかかっている
デフォルトのファイル共有機能は、比較的安定性は高く、多くの OS で使用できるのですが、メモリキャッシュなどの機能を使用していないため、ディスクアクセスは遅い欠点があります。
一方、Laravel は大量の依存ファイルを読み込むのでディスクアクセスが大量に発生します。そのため表示が遅くなります。

対処方法

Docker などの仮想化技術が使用できるツールに切り替えができるのであれば、切り替えるのをおすすめします(ちなみに Docker ToolBox は VirtualBox を使用するので意味ありません...)。それができない場合は、NFS でマウントする機能を使用します。
仕組みは公式ドキュメントをご確認ください。
NFS - Synced Folders | Vagrant by HashiCorp
https://www.vagrantup.com/docs/synced-folders/nfs

Windows の場合はプラグインが必要

公式ドキュメントには下記の記載があり、Windows ホストでは使えないと書いてあります。
Windows users: NFS folders do not work on Windows hosts. Vagrant will ignore your request for NFS synced folders on Windows.
ところが、なんと Windows で NFS 機能を使用できるプラグイン(vagrant-winnfsd)がコミュニティに存在します!素晴らしすぎて感謝してもしきれません。
winnfsd/vagrant-winnfsd: Manage and adds support for NFS for Vagrant on Windows.
https://github.com/winnfsd/vagrant-winnfsd
ホスト側が Windows の場合は下記コマンドでプラグインを先にインストールしておいてください。
vagrant plugin install vagrant-winnfsd

NFS に変更する方法

NFS に変更するには VagrantFile の共有ディレクトリの設定にあたる部分を変更する必要があります。
先ほどの公式ドキュメントに記載されていた通り、type: "nfs" を追加するだけで使用できます。
例えば下記のように設定します。
config.vm.synced_folder ".", "/var/www/src", type: "nfs"
尚、private_network が必要です。IP は例ですが、静的 IP アドレスだとトラブルがすくないです(.1 はホスト側で予約されていますので.2 以上にする必要があります)。
config.vm.network :private_network, ip: "192.168.2.2"
(とくに Mac)ファイアウォールに引っかかりやすいので、うまく動作しない場合はファイアウォールの設定をご確認ください。

CSS や JavaScript が壊れてしまう場合

環境の組み合わせによっては、sendfile の影響で CSS や JavaScript が壊れてしまう場合があります。その場合の対処方法はこちらをご確認ください。
仮想環境で開発中 JavaScript が途中で途切れて壊れる場合の対処法
https://bicstone.me/enablesendfile-js-broken/

シンボリックリンクが動作しない場合

Laravel では、シンボリックリンクを貼らないといけない機能(ファイルストレージ)があります。
ファイルストレージ 6.x Laravel
https://readouble.com/laravel/6.x/ja/filesystem.html
ホストが Windows の環境では、なぜかシンボリックリンクが壊れてしまい利用できませんでした。
$ ls -l storage
lrwxrwxrwx 1 root root 0 Dec 24 02:12 storage -> ../../storage/app/public
$ cd storage
cd: no such file or directory: storage
vagrant-winnfsd プラグインの影響なのか、Windows の影響なのかわかってはいません。
私は、Public ディレクトリのみ、標準の共有ファイルに設定しました。下記のようなイメージです。
config.vm.synced\_folder ".", "/var/www/src", type: "nfs", rsync\_\_exclude: "./public"
config.vm.synced\_folder "./public", "/var/www/src/public"
これで、高速化しつつ、ファイルストレージも使用できる環境になりました。それでも Laravel は遅いですけどね…。
Larabelのデバッグツールスクリーンショット Bootingが304ms、Appが195ms

ホームプロフィール外部リンクのため、別ウインドウで開きますプライバシーポリシー

© 2023 Oishi Takanori / Made with Gatsby.js