Home > Vagrant > Vagrant のプロビジョン時間を削減する vagrant-cachier プラグインが良い

Vagrant のプロビジョン時間を削減する vagrant-cachier プラグインが良い

この記事の所要時間: 529

Vagrant でプロビジョンを行う際に時間がかかるのが、yum などを使ったパッケージのインストールです。ネットワーク環境が悪い場合、ダウンロード自体に時間がかかるため、大きな待ち時間が発生します。

vagrant

vagrant-cachier プラグインを使うことで、このダウンロード時間を削減することができます。

vagrant-cachier プラグイン

vagrant-cachier プラグインは、プロビジョンなどでダウンロードしたパッケージをキャッシュしておくことで、次回以降のダウンロード時間を削減しようというプラグインです。

https://github.com/fgrehm/vagrant-cachier

vagrant-cachier プラグインの効果

これは効果を見たほうが早いと思うで、vagrant-cachier プラグインを導入した場合の効果についてです。

vagrant destroy で VM を破棄した後に、vagrant up を実行して、その実行時間を time コマンドで計測しています。

$ vagrant destroy -f
$ time vagrant up

今回、計測に利用した Vagrantfile は、ある PHP プロジェクトで利用しているものです。Ansible によるプロビジョン(VM内で実行)を行っており、Composer の実行や PHPUnit による自動テストも行っています。これらは本プラグインとは無関係なのですが、実際に使う場面で効果があるか見たかったので、この環境で計測しています。

  • プラグインなし

比較のために vagrant-cachier プラグインを入れていない状態で、vagrant up を実行した結果です。

vagrant up  4.64s user 2.19s system 0% cpu 11:36.15 total
  • プラグインインストール済み(初回)

vagrant-cachier インストールして、初回(キャッシュが無い状態)の実行時間です。

vagrant up  6.18s user 2.69s system 1% cpu 12:33.26 total
  • プラグインインストール済み(2回目)

vagrant-cachier インストール後、キャッシュがある状態での実行時間です。

vagrant up  6.26s user 2.68s system 2% cpu 6:42.31 total
  • 結果

結果を表にまとめたのが以下です。実行時間を比較してみると、プラグインをインストールして、キャッシュがある状態なら、実行時間が約半分になりました。これは大きな効果ですね。

実行時間
プラグイン無し 11.36.15
プラグイン有り(キャッシュ無し) 12.33.26
プラグイン有り(キャッシュ有り) 6.42.31

インストール

vagrant-cachier プラグインをインストールするには、vagrant plugin install コマンドを実行するだけです。

$ vagrant plugin install vagrant-cachier

Vagrantfile への記述

vagrant-cachier プラグインを有効にするには、Vagrantfile に下記の設定を行います。config.cache.scope では、キャッシュスコープを設定します。

下記では、:boxを指定しており、これは、プロビジョンでインストールしたパッケージを Box 単位でキャシュします。同一 Box を使う Vagrantfile であれば、別の VM でもキャッシュを共有することができます。

私の用途であれば、この設定が使いやすそうです。

あとは、通常どおり、vagrant up を行うとプラグインが有効となり、キャッシュを行うようになります。

Vagrant.configure("2") do |config|
  # (snip)

  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box  
  end

  # (snip)
end

その他のキャッシュスコープやオプションついては、vagrant-cachier のサイトを参照にして下さい。

http://fgrehm.viewdocs.io/vagrant-cachier/usage

何をキャッシュしているのか

プロビジョンで追加したパッケージをどうやってキャッシュしているのか気になったので、仕組みを見てみました。

コードを見たところ、CentOS の場合は、ゲストの /var/cache/yum/tmp/vagrant-cache/yum へのシンボリックリンクになっています。そして、この /tmp/vagrant-cache/ は、ホスト側との synced_folder となっており、~/.vagrant.d/cache/BOX_NAME/ がマウントされています。

つまり、ゲストで yum install コマンドでインストールすると、/var/cache/yum にパッケージのキャッシュファイルが保存されます。これは、ホストの ~/.vagrant.d/cache/BOX_NAME/yum と synced_folder で同期しているので、結果としてホストにこのキャッシュファイルが保存されます。

これは、なかなか面白い仕組みですね。

さいごに

vagrant-cachier プラグインを使うことで、プロビジョンの実行速度が大きく改善されます。プロビジョンコードを書くと、検証のために何度もプロビジョンを実行することになり、その度に待たされていました。このプラグインを使うことで、その時間が削減できるので、プロビジョンが捗ります。

ちなみに、このプラグインは、CakePHPで学ぶ継続的インテグレーション を読んで、知りました。

いま読み進めているところですが、PHP で CI したい人には嬉しい内容になっています。書評は、また別エントリで書きますね。

Pocket

follow us in feedly

Home > Vagrant > Vagrant のプロビジョン時間を削減する vagrant-cachier プラグインが良い

検索
フィード
メタ情報

Return to page top