November 14, 2022

minikube mountでボリュームマウント後に立ち上げたPodでアプリケーションサーバの起動が遅かったのでどうにかした話

[環境]

  • Mac M1 Pro Ventura 13.0
  • minikube v1.27.1
  • Docker for Mac v4.13.0
  • rails v5.2.4.6

[前提]

  • minikube start --driver=dockerでdriverにdockerを指定してminikubeを起動
  • minikube mount マウントするローカルのディレクトリ:/マウント先のディレクトリでボリュームマウント
  • railsアプリケーションのPodを作成

[事象]

railsのサーバ起動やコマンド実行にめちゃくちゃ時間がかかる。

root@web-app:/opt/web-app# time rails version
Rails 5.2.4.6

real    1m5.563s
user    0m2.450s
sys     0m9.606s

つらすぎる…

[推定要因]

minikubeのリファレンスを見ると、
minikube mountは9Pというファイルシェアリングプロトコルでマウントを実現している様
https://minikube.sigs.k8s.io/docs/handbook/mount/

9Pマウントは600ファイルを超えるとパフォーマンスや信頼性に問題が出てくる様です。
先に挙げた事象もこれが影響していそう。

[対処]

上に挙げたリファレンスでは代替案としてDrive Mountが提示されていますが、
M1 Macだと今のところ掲載されているdriverは使用できません。
ので、9Pマウントを使う前提で改善の余地がないか検討。

minikube mountは内部でmountコマンドを呼んでおり、–typesオプションでファイルシステムに9Pを指定している様。
https://github.com/kubernetes/minikube/blob/master/cmd/minikube/cmd/mount.go#L88

9Pのオプションで cacheのモードが指定できそう。
https://www.kernel.org/doc/Documentation/filesystems/9p.txt

試行した末、cache=fscacheでオプション指定した場合に事象が改善される事を確認しました。

minikube mount --options cache=fscache,trans=tcp マウントするローカルのディレクトリ:/マウント先のディレクトリ

root@web-app:/opt/web-app# time rails version
Rails 5.2.4.6

real    0m5.843s
user    0m1.145s
sys     0m1.067s

変更前よりは…

ただ、fscacheを指定した場合ファイルがread onlyとして扱われるので、ホスト-クライアント間のファイル変更が自動で同期されません。 暫定運用として、kubectl cp で反映を行っています。

https://neos21.net/blog/2019/04/15-01.html
https://devops.stackexchange.com/a/3208

より良い案があれば教えて下さいm( _ _)m

+----- Share ? -----+

© YK 2023

Powered by Hugo & Kiss.