Description
概要
夜会キャンペーンに向けた負荷対策 その1
対応の前提
ジョリーの通常のゲームページおよび Ajax リクエストでは、リクエスト開始時のログイン処理で user_lock によるユーザー単位の排他制御が行われる。
そのため、同一ユーザーのリクエストで重い処理が発生すると、その処理が完了して user_lock が解放されるまで、後続の同一ユーザーリクエストは user_lock の取得待ちになる。
アクセス集中やサーバー負荷の増大により個々のリクエスト処理時間が伸びると、ユーザーの再読み込みや画面操作による後続リクエストが滞留しやすくなる。結果として、PHP プロセスや DB 接続がロック待ち状態で消費され、サーバー全体の負荷増大につながる可能性がある。
夜会キャンペーンでは集中アクセスによりこの影響が顕著になりやすいため、キャンペーン期間中に重くなる可能性がある処理を改善し、user_lock の保持時間および待ちリクエストの増加を抑えることを目的とする。
対応背景
5/21と5/22のレイド開催時のDatadogとアクセスログ上、問題となった箇所に対応を入れる
codexにアクセスログとDatadogのデータを渡した際の出力抜粋
Datadog の解析
最優先
SELECT COUNT (?) FROM log_team_raid_item WHERE raid_monster_no = ? AND user_no = ?
直近1日で約127K回出ています。アクセスログの解析
最優先は /ajax.php?M=main&A=default 経由の count_user_raid_item() 削減です。
このURLはログ上で約 402K回 / 総処理時間 42,749秒 / 平均 0.106秒 と、累積負荷が最大です。※Datadogのみで解析した際に該当クエリの最適化をAIから提案されましたが、EXPLAIN結果を踏まえて対応不要という結論になりました。調査が被ると時間の無駄になるため、メモとして残しておきます。
対応内容
Default.incでの召喚の書ボーナス取得時に 未受け取りのレイド報酬の回数分 log_team_raid_itemに対するSELECTが行われていた。
これをGROUP BYを使い、SELECTを1回に減らしクエリの実行回数を削減
TODO
- [ ] Github移行後にPRの作成し直し