CloudSQLのログに記録されていた「`SELECT * FROM infomation_scheme`と`SHOW TABLES `」を
はじめに
前回の「CloudSQLの「Query Insight」を有効にしたら謎のCOMMITが大量に記録されていた件(cakePHP 5.x)」の続きになります。
システムの構成をざっくりと説明すると
という流れになっています。
詳しい構成はこちらの記事にまとめています。
原因・解決方法
それでは実際にQueryInsightに記録されているSQLを見ていきましょう。
今回の問題になっているSQLは以下の3つです。
SELECT * FROM infomation_scheme ~~
SHOW TABLES ~~
SHOW INDEXES FROM ~~
いずれもテーブルの情報を確認するものであって、プログラム内で明示的に実行している部分は見つかりませんでした。
なのでフレームワーク内部で実行されている可能性が高いと考えました。
ComputeEngineに設置しているプロダクトでは↑のSQLは発生してないので、AppEngine側に問題があるのでは・・と疑ったり。
原因
いろいろと調べて分かった原因は「アプリケーション側でモデルのキャッシュを無効化している」ということでした。
このシステムを開発したのが約5年前(自分が今の会社に入ったばかりの頃・・)で、当時はAppEngineにはファイルの書き込みができないと誤解していたみたいです。
実際にCakePHPの設定ファイルを見てみたところ
'Cache' => [
'default' => [
'className' => NullEngine::class,
'path' => CACHE,
],
'_cake_model_' => [
'className' => NullEngine::class,
'prefix' => 'myapp_cake_model_',
'path' => CACHE . 'models' . DS,
このようにキャッシュをNullEngine::class
と書くことで無効化していることが分かりました。
モデルのキャッシュが効かない状態になっているので、SQLを実行するたびにスキーマやインデックスを確認するクエリーが走っていたのだと考えられます。
解決方法
AppEngineへのファイル書き込みについて調べてみて、以下のような説明を見つけました。
ここにも書いてあるように/tmp
には書き込むこむことができるようです。
実際にフレームワーク側の設定ファイルを以下のように書き換えたところ
+ CACHE_DIRCTORY: /tmp
'_cake_model_' => [
- 'className' => NullEngine::class,
+ 'className' => FileEngine::class,
'prefix' => 'myapp_cake_model_',
- 'path' => CACHE . 'models' . DS,
+ 'path' => env('CACHE_DIRCTORY', '') . CACHE . 'models' . DS,
書き込みエラーが発生することはなく、負荷の原因になっているSQLも実行されないようになりました。
最後に
公式ドキュメントはしっかり読もうと思いました(GCPの公式サイトは分かりづらい説明が多いですが・・)
Discussion