なんじゃくにっき

プログラミングの話題中心。

Ridgepoleの動作が遅いときは・・?

概要

Ruby製のmigration toolのRidgepole話。

GitHub - ridgepole/ridgepole: Ridgepole is a tool to manage DB schema. It defines DB schema using Rails DSL, and updates DB schema according to DSL. (like Chef/Puppet)

これの動作が遅かったので調査した。

結論

OSにdiffコマンドがないと遅くなる

調査方法

Gemfile経由でインストールして

bundle exec ridgepole -c config.yml --apply 

としたときに動くものの実体は

https://github.com/ridgepole/ridgepole/blob/2.0/bin/ridgepole

なので、このbin以下にあるファイルを実行環境にコピーしてきてprofilerを入れる(今回はruby-profを使いました)

で、実行時間を食っている場所を探していくと、

RidgepoleがさらにDiffyというライブラリを呼んでいて、

https://github.com/ridgepole/ridgepole/blob/ca48b44b2fb61a4d5919bccae91067f7c9bd46df/lib/ridgepole/diff.rb#L627

これがOSのdiffコマンドを叩くところで時間を食っていることが分かった。

diffy/lib/diffy/diff.rb at 85b18fa6b659f724937dea58ebbc0564f4475c8c · samg/diffy · GitHub

これでOSにdiffコマンドをインストールしてあげれば解決。

CentOS系とかだと入ってないことがあって

$ sudo yum install diffutils

とか

$ sudo dnf -y install diffutils

でインストール。