こんにちわ、Takeuchiです。
先日、案件のリリースがあったんですが
結果から言うと、リリースに失敗しました(泣)
資材をリリースした後、DBの負荷が急に上昇し
100%から下がらなくなってしまいました。
案件の内容的には1テーブルの追加とか追加したテーブルの値で
表示するボタンを変更するとか、難しい内容ではなかったんです。
原因の調査を行なっていくなかで分かったことは
案件で使用しているフレームワークがPHPのCakePHPなのですが
このCakePHPはDBと接続を行うMODELが特殊で基本的にはSQLを書きません。
抽出条件となるキーは書きますが抽出系は「find()」、
挿入・更新系は「save()」といった関数を使用してDBとの接続を行います。
また、テーブル同士の紐付けを行うキーは使用するテーブルを
定義する際に記載するのですが、こいつが罠でした。
基本、DBからレコードの抽出を行う際はDBへの負荷を抑えるため
親として使用するテーブルのレコードを絞り込んでから、コードマスタ等の
テーブルと紐付けを行います。
しかし、CakePHPの場合はテーブルを定義する際に紐付け設定を行うために
親テーブルの全レコードと子供のテーブルを紐付けてしまい
CPU・メモリを逼迫させてしまいました。
対処としては、親テーブルと新規追加テーブルの紐付けをやめ
親テーブルと新規追加テーブルへのアクセスを2回に分けることで事なきを得ました。
SQLを書かないフレームワークの場合は
裏でどんなSQLが動いているのか簡単には見えないため
不具合が発生した時に状況を把握するのに時間が掛かります。
開発環境では問題なく動作していたのに、
リリースした途端に不具合を起こして暴走する事だってあります。
リリース後に不具合を出さないようにするためには
開発環境で可能な限り商用と同じレコード数にして
動作及び性能を確認する事です。
リリースに失敗しないためにも
性能検証はしっかりとやっておきましょう。