- 2014-09-27 (土) 20:30
- Vagrant
Vagrant でプロビジョンを行う際に時間がかかるのが、yum などを使ったパッケージのインストールです。ネットワーク環境が悪い場合、ダウンロード自体に時間がかかるため、大きな待ち時間が発生します。
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 コマンドを実行するだけです。
1 | $ vagrant plugin install vagrant-cachier |
Vagrantfile への記述
vagrant-cachier プラグインを有効にするには、Vagrantfile に下記の設定を行います。config.cache.scope
では、キャッシュスコープを設定します。
下記では、:box
を指定しており、これは、プロビジョンでインストールしたパッケージを Box 単位でキャシュします。同一 Box を使う Vagrantfile であれば、別の VM でもキャッシュを共有することができます。
私の用途であれば、この設定が使いやすそうです。
あとは、通常どおり、vagrant up
を行うとプラグインが有効となり、キャッシュを行うようになります。
1 2 3 4 5 6 7 8 9 | 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 したい人には嬉しい内容になっています。書評は、また別エントリで書きますね。
- Newer: [書評] CakePHPで学ぶ継続的インテグレーション
- Older: Ansible で、複数サーバの RPM を一括で更新する