Upgrade to Pro — share decks privately, control downloads, hide ads and more …

スロークエリ撲滅委員会

 スロークエリ撲滅委員会

「ココナラ×レアジョブテクノロジーズ+AWS 少人数エンジニア組織でサービス成長させるには?座談会」のLT資料。
https://coconala.connpass.com/event/296649/

coconala_engineer

October 30, 2023
Tweet

More Decks by coconala_engineer

Other Decks in Technology

Transcript

  1. Copyright coconala Inc. All Rights Reserved. 1. スロークエリを分析、サービスやユーザーへの 影響度が大きなものから優先度を設定 2.

    SQLをヒントに発生箇所を絞り込む 3. 実行計画とデータ量や偏り、コードの目的から 適切な改善方法を決定 4. 実際に改善を行い、リリース 5. 想定通り改善されているかモニタリング 11 改善フロー
  2. Copyright coconala Inc. All Rights Reserved. ログ分析(CloudWatch) 12 parse @message

    /Query_time: (?<query_time>\d+\.\d+)[^\n]*\nSET timestamp=\d+;\n(?<sql_tmp>.*)$/ | parse @message /\]\s+@\s+\[(?<host>[\d\.]+)\]/ | filter host != 'バッチサーバの IP' and host != ‘管理画面サーバの IP' # 直接ユーザーの操作に影響を与える箇所を優先する | fields substr(sql_tmp, 0, 64) as sql # 集計のため、適当な長さに切る | filter strlen(sql) > 1 # ゴミデータの除去 | stats count(*) as cnt, pct(query_time, 70) as p70, pct(query_time, 95) as p95, max(query_time) as max_time, min(query_time) as min_time by sql | sort cnt desc
  3. Copyright coconala Inc. All Rights Reserved. 発生箇所の特定 SELECT `hoges`.`id`, `hoges`.`name`

    FROM `hoges` WHERE (`hoges`.`type`) IN (1, 3) ORDER BY `hoges`.`id` ASC LIMIT 1000; Hoge.where(type: [:type_a, :type_b]) .select(:id, :name) .find_in_batches do 13 生SQL Rails/ActiveRecord キーワードでgrepしても簡単には特定できない……気合でなんとかする
  4. Copyright coconala Inc. All Rights Reserved. • SQL修正 ◦ インデックスが十分機能していない場合

    • インデックス追加 ◦ SQL修正だけでは解決できない場合 • BigQueryで集計 ◦ バッチ実行、リアルタイム性が不要な場合 • レプリカの活用 ◦ 若干のレプリカ遅延が許容できる場合 • DynamoDBの活用 ◦ 集計不要、TTLなどが有効な場合 • 中間データの作成 ◦ リアルタイムな集計結果が必要な場合 15 改善方法
  5. Copyright coconala Inc. All Rights Reserved. 1. 未読件数管理テーブルAの作成 2. メッセージの書き込み時にAの未読件数を更新

    3. 既存メッセージの未読件数データを一括生成 4. 未読件数はAから取得するように変更 1、2をリリース → 3を実行 → 4をリリースという流れ 17 例)メッセージ未読件数_対応
  6. Copyright coconala Inc. All Rights Reserved. ココがよかった 21 • 改善結果が自然に数値として見えるため、実感が湧きやすかった

    • 調査過程で過去の遺産を整理することができた • スロークエリ以外の改善ポイントも見えてきた • CloudWatch Logs Insightsにちょっとだけ詳しくなった
  7. Copyright coconala Inc. All Rights Reserved. ココがつらかった 22 • 生SQLからコードを特定するには気合が必要

    • ヘビーユーザーを救うとそれ以外のユーザーが悪化する • テストデータの不完全さによってテストが通らない
  8. Copyright coconala Inc. All Rights Reserved. 例)古いデータの削除バッチ_背景 24 • 特定のページで表示する内容をバッチで作成していた

    • 作成した内容は、古くなったらバッチで削除していた • 削除バッチでスロークエリ、レプリカ遅延が発生していた • 対象のテーブルは集計やページングが不要だった
  9. Copyright coconala Inc. All Rights Reserved. 例)古いデータの削除バッチ_対応 25 1. DynamoDBにテーブルAを作成

    2. バッチの書き込み先をAに変更し、TTLを設定 3. Aにデータがあれば返し、無ければ旧テーブルを見るように変更 4. バッチを停止