標題の開発環境下で、異常に遅かったので調べてみた。
結論としては、 Laravel Debugbar
を無効にすると 3倍近く 速くなった。
レスポンスタイムが 2.6秒 → 0.85秒 なので3倍くらい。
考えられる要因
Laravel Debugbar は、 storage/debugbar/
以下に Xc590ef0f5b368cf34373093291b95147.json
のようなファイルを リクエストの度に 出力するようだ。
~> find storage/debugbar -type f | wc -l
58
中身を確認すると、スタックトレースなどが入っている。
/api
などはミドルウェアなどが多いので、そのファイルのサイズが異常に大きくなる。整形すると 24000行 ものファイルを作っている。
~> cat storage/debugbar/X2e75040e69de9cae006253a48fd5276c.json | jq . | wc -l
24676
今回出力されたファイルサイズは 500KB だった。
~> ls -lh storage/debugbar/X2e75040e69de9cae006253a48fd5276c.json
-rw-r--r-- 1 kazuya-mac staff 508K 3 27 18:32 storage/debugbar/X2e75040e69de9cae006253a48fd5276c.json
で、Mac上でDocker動かすと、ファイル書き込み処理が重くなるのは有名な話。
よって、このログ出力をやめるだけでもかなりの速度改善になる。
TODO
Laravel Debugbar 自体は使いたいので、パフォーマンス改善される方法を探す。
下記のいずれか、かなと。
- HTTP経由でどこかに飛ばす
- ログの出力先を共有ボリューム以外の場所にする
-
storage/
以下をvolume
でマウントしない(Dockerで部分的にマウントしないことができるのか・・?)
Debugbar 以外でも、ログ出力先を共有ボリューム以外にすれば、高速化できるかもしれない。
余録
これ便利。
speedtest
#!/usr/bin/env fish
while true
curl -H 'Accept-Encoding: gzip' -Ss -LI -o /dev/null -w \
'%{http_code} in %{time_total} seconds, %{content_type} as %{size_download} \n' \
$argv
sleep 1
end