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

Webアプリケーションのパフォーマンス・チューニングの勘所 / web tuningperformance

Webアプリケーションのパフォーマンス・チューニングの勘所 / web tuningperformance

soudai sone

October 24, 2023
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

  1. 自己紹介
 曽根 壮大(38歳)
 Have Fun Tech LLC 代表社員
 株式会社リンケージ CTO


    
 そ
 • 日本PostgreSQLユーザ会 勉強会分科会 担当
 • 3人の子供がいます(長女、次女、長男)
 • 技術的にはWeb/LL言語/RDBMSが好きです
 • コミュニティが好き たけ
 ね
 とも

  2. • アクセスログなどのWebサーバのログ
 ◦ レイテンシーやリクエストされた回数など実際に思いエンドポイントを 
 見つけるために必要
 ◦ LTSVやJSONなどの使いやすい形にフォーマットを指定することも重要 
 •

    CPUやメモリなどのシステムメトリックの可視化
 ◦ 最初はプラットフォームの提供サービスで十分 
 ◦ もう少し踏み込みたくなったらSaaS 
 • スロークエリログなどデータベースのログ
 ◦ デフォルトでは吐き出さないので設定が大事 
 ◦ 集計ツールの都合に合わせる必要もあるので集計方法は先に決める 
 計測するために必要な情報
  3. • ERRORやCRITICALの文字列を検索してalertを飛ばす
 ◦ SaaSやクラウドサービスには仕組みが用意されている
 ◦ AWSならEC2のsyslogをCloud Watch Logsに送る
 • VPSの場合などにアクセスログを集計してリクエストされた回数や

    レスポンスステータスを集計する
 ◦ AWSならALBのメトリックを見ればアクセス数がわかるが、ない 場合は自分で用意する必要がある
 ◦ Mackerelだと mackerel-plugin-accesslog が便利
 定期的に検索して集計の例
  4. • 実行に数秒以上かかるようなスロークエリ
 • N+1なINSERTでDisk I/Oなどが起因のクエリ
 • 単発のクエリは早いがN+1な検索クエリ
 • ロックが競合して待たされているクエリ
 •

    デッドロックで頻繁にkillされるクエリ
 …etc
 DBに負荷がかかる例 最初以外のクエリはスロークエリログには出てこない!
  5. • 実行に数秒以上かかるようなスロークエリ
 • N+1なINSERTでDisk I/Oなどが起因のクエリ
 • 単発のクエリは早いがN+1な検索クエリ
 • ロックが競合して待たされているクエリ
 •

    デッドロックで頻繁にkillされるクエリ
 …etc
 DBに負荷がかかる例 CPU、Disk i/o統計情報やテーブルの データ量から類推できる。
  6. • 実行に数秒以上かかるようなスロークエリ
 • N+1なINSERTでDisk I/Oなどが起因のクエリ
 • 単発のクエリは早いがN+1な検索クエリ
 • ロックが競合して待たされているクエリ
 •

    デッドロックで頻繁にkillされるクエリ
 …etc
 DBに負荷がかかる例 統計情報で類推できる。 数が純粋に多い場合はスロークエリログの 閾値を0秒にして出てきたクエリをカウントしてソート するとわかる
  7. • 実行に数秒以上かかるようなスロークエリ
 • N+1なINSERTでDisk I/Oなどが起因のクエリ
 • 単発のクエリは早いがN+1な検索クエリ
 • ロックが競合して待たされているクエリ
 •

    デッドロックで頻繁にkillされるクエリ
 …etc
 DBに負荷がかかる例 ロック待ちは実行時間に含まれない timeoutする場合はエラーログに出る ロックが頻発するとCPUも跳ねる テーブルロックの場合はUPDATEにWHEREのINDEXが足 りていないことがほとんど
  8. • 実行に数秒以上かかるようなスロークエリ
 • N+1なINSERTでDisk I/Oなどが起因のクエリ
 • 単発のクエリは早いがN+1な検索クエリ
 • ロックが競合して待たされているクエリ
 •

    デッドロックで頻繁にkillされるクエリ
 …etc
 DBに負荷がかかる例 アプリケーションやDBのログからkillされたことはわかるが、 デッドロックの条件を見つけることが難しい。 SHOW ENGINE INNODB STATUSやpg_stat_activityで 地道な検証と対応が必要になる。 デッドロックのtimeoutを短くしてアプリケーション側でリトラ イすることで解決することも多い
  9. クライアント
 インターネット
 サーバサイド
 通信
 DNS
 BGP
 ISP
 サーバ
 ネットワーク
 アプリケーション


    キャッシュの勘所と使い方 クライアントに近いところで キャッシュしたほうが効果は高い しかし、更新コストや難易度は上がる