【技術書】「絵で見てわかるシステムパフォーマンスの仕組み」を読みました。

【技術書】「絵で見てわかるシステムパフォーマンスの仕組み」を読みました。


# performance # book

今回読んだ本

タイトルにもある通り「絵で見てわかるシステムパフォーマンスの仕組み」を読みました。

前段

ここ最近システムパフォーマンスの改善に取り組むことが増えてきていました。 PytyonやAWSの速度を意識した実装については調査や勉強をしていたものの、自分の業務の内容に限った知識しか習得出来ていないことや、システムパフォーマンスについて分かる範囲が出てきていたため、評価の高い本を見て一般的と思われる知識を身に着けたいと思って本書を手に取りました。

本の概要とメモ

  • 【第1章】パフォーマンスの基礎的な考え方
    • 簡単なアルゴリズムの紹介が行われている
    • キャッシュやロックについての記載があり、アルゴリズムに入るか微妙な気もするが高速化に関する基礎知識が記載されている
  • 【第2章】パフォーマンス分析の基本
    • とにかく測定(分析できる状態に)することが命
    • 単体だとわからないこともあるので「はさみうち」で測定できると望ましい
    • ピークがあるような場合は「待ち行列理論」でピーク時の待ち時間を検討すると良い
    • パフォーマンス情報の種類
      • サマリ形式
        • 一定期間の情報を合計・平均等で出すもの
        • 期間内の変動は基本的に取得不可
      • イベント記録形式
        • パケットキャプチャやシステムコール等の各イベントを記録
        • 情報としては基本的に最大になる(ことが多い)
        • 情報が膨大なので常に保存は基本的にはせず、詳細調査等の際に使用する
      • スナップショット形式
        • その瞬間の細かな情報を取得する形式
          • サマリ形式の元データを取得するようなイメージ
        • どのプロセスが重いか等の原因調査に役立つケースが多い
        • 定期的に取得しておくと変化が見えて良い
      • パフォーマンス分析のためのOSコマンド等の例
        • 下部に紹介されているコマンドを記載
  • 【第3章】実システムのパフォーマンス分析
    • アプリケーション、データベース、ストレージ、ネットワーク等の役割ごとの分析方法
    • 上記のように複数の役割がある際の調査の方針
    • 本当のボトルネックが何かを様々なデータを統合して見ていく必要がある
  • 【第4章】パフォーマンスチューニング
    • システム全体で考えた際のチューニングの観点が紹介されている
    • 同期を非同期にする、カラムナデータベースを使うなど割と根本的な変更が視野に入っている
    • 設計時に参考にしておきたい内容が多い印象
  • 【第5章】パフォーマンステスト
    • テストに関する考え方や指標が色々と紹介されている
    • インフラ側でのテストとアプリケーションで区別してテストとするとクリティカルな手戻りが少ない
      • オンプレのように機材を容易するようなケースは重要
      • クラウド前提だと重要度は低い
  • 【第6章】仮想化環境におけるパフォーマンス
    • VMware等の仮想化環境を使った際特有のパフォーマンス観点が紹介されている
      • 本質的にはDockerも似たような考えて方が出来る(?)
    • 知識としては面白い
  • 【第7章】クラウド環境におけるパフォーマンス
    • 仮想化された状態の数値しか取れない等クラウド環境の特徴が紹介されている
    • クラウドベンダー側で自動でアップデートが入るので、性能がどんどん上がっていく傾向がある
      • 反面隠蔽されている箇所が多くボトルネックの特定が困難なケースもある

パフォーマンス分析のためのOSコマンド等の例

下記コマンドに関する情報はChatGPTを用いて記載している部分があり本の内容と異なる部分があるかもしれません。
正確な内容は本を参照してください。

sar (System Activity Reporter)

  • 形式: サマリ形式
  • どこで測っているのか: OSのカーネルや各サブシステム
  • 分かること: CPU使用率、メモリ使用量、I/O待ち時間、ネットワークのトラフィックなどのシステム全体のリソース使用状況
  • わからないこと: 個々のプロセスの詳細な情報や、特定のアプリケーションのパフォーマンスに関する情報
  • その他特記事項: 一定期間のシステム全体のパフォーマンスをサマリ形式でレポートするため、長期的なトレンド分析に有用。

vmstat (Virtual Memory Statistics)

  • 形式: サマリ形式
  • どこで測っているのか: OSのカーネルメモリ管理システム
  • 分かること: メモリの使用状況、スワップの発生状況、CPUのステータス、I/O待ち行列の長さなど
  • わからないこと: 個々のプロセスやスレッドの詳細情報
  • その他特記事項: 短期的なシステム全体のパフォーマンスの概要を確認するのに適している。

ps (Process Status)

  • 形式: スナップショット形式
  • どこで測っているのか: OSのプロセステーブル
  • 分かること: 現在実行中のプロセスの一覧と、それらのプロセスのリソース使用状況(CPU、メモリなど)
  • わからないこと: プロセスの履歴や過去のパフォーマンス状況
  • その他特記事項: スナップショット形式で現在のシステムの状態を確認できるが、リアルタイム性やトレンド分析には不向き。

netstat (Network Statistics)

  • 形式: サマリ形式、スナップショット形式
  • どこで測っているのか: OSのネットワークサブシステム
  • 分かること: 現在のネットワーク接続状況、ルーティングテーブル、インターフェース統計、プロトコルごとの通信状況
  • わからないこと: 過去の通信履歴や詳細なトラフィック解析(トレースレベルの情報)
  • その他特記事項: サマリ形式とスナップショット形式の両方があり、ネットワークの瞬間的な状態や接続状況を把握するのに有効。

iostat (Input/Output Statistics)

  • 形式: サマリ形式
  • どこで測っているのか: OSのディスクI/Oサブシステム
  • 分かること: ディスクの読み書きの速度、I/O待ち時間、システム全体のI/Oバランスなど
  • わからないこと: 個々のファイルやプロセスによるI/Oの詳細な情報
  • その他特記事項: 長時間のI/Oパフォーマンスの傾向を把握するのに有用。

top

  • 形式: スナップショット形式
  • どこで測っているのか: OSのプロセステーブル
  • 分かること: リアルタイムのプロセス一覧、各プロセスのCPU使用率、メモリ使用量など
  • わからないこと: プロセスの過去のパフォーマンスやトレンド
  • その他特記事項: インタラクティブにリアルタイムのシステム状態を監視するツールとして有用。

パケットダンプ (Wireshark, tcpdumpなど)

  • 形式: イベント記録形式
  • どこで測っているのか: ネットワークインターフェースレベル
  • 分かること: ネットワークパケットの詳細な内容、通信のプロトコル解析、パケットのタイミングなど
  • わからないこと: アプリケーションの高レベルの動作や、ネットワーク外のシステムリソース使用状況
  • その他特記事項: ネットワークのトラブルシューティングやプロトコルの解析に特に有用。

pstack

  • 形式: スナップショット形式
  • どこで測っているのか: OSのプロセステーブルおよびスタック情報
  • 分かること: 実行中のプロセスのコールスタック情報、デッドロックやハング状態の分析
  • わからないこと: プロセスの外部リソースの使用状況や、スタック外の詳細なパフォーマンスデータ
  • その他特記事項: 問題が発生した時点のスタックトレースを取得するために使用。

システムコール (straceなど)

  • 形式: イベント記録形式
  • どこで測っているのか: OSのシステムコールインターフェース
  • 分かること: プロセスが呼び出すシステムコールの詳細、入出力操作やエラーの追跡
  • わからないこと: プロセスの全体的なパフォーマンス、システム全体のリソース使用状況
  • その他特記事項: 問題の特定やトラブルシューティングに有効だが、パフォーマンスのオーバーヘッドが大きい場合がある。

プロファイラ

  • 形式: サマリ形式
  • どこで測っているのか: OSや言語ランタイムのプロファイリング機能
  • 分かること: コードの実行時間の詳細な分布、特定の関数やメソッドのパフォーマンス、CPU使用状況など
  • わからないこと: システム全体のリソース使用状況や、特定のプロセスの詳細なI/O操作
  • その他特記事項: アプリケーションやシステム全体のパフォーマンスのボトルネックを特定するのに有用。理屈としてはOSに関してはpstackを連打しても同様の情報が取れる

感想

ある程度のシステム経験を詰んだりパフォーマンスについて考えるような機会がある人は、読む価値がある本だと感じました。

Amazonのレビュー等にも書いてあることですが、良くも悪くも広く浅く学べる本です。 システム全体としてボトルネックがどこになるのかを調査するための考え方としては非常に分かりやすく記載されている印象を受けたため、今の自分にはぴったりな本でした。

一方、細かなプログラム上のボトルネック改善の方法には深く触れられておらず(自分の担当範囲に限っては正しい実装が出来る前提を感じました)、個別の細かい事象に対する対応は別の本や公式ドキュメント等から学ぶこととなりそうです。

また、全体最適化をきちんとしていこうという主旨の話が多いことが印象的でした。 きっと縦割りでうまく回らないシステムを本書の著者は見てきたのでしょうね…。

絵で見てわかるシステムパフォーマンスの仕組み