SA.04.1 性能見積もりと評価 (重要度: 3)
性能に関わる要件
業務特性
参考:パターンp.96
ユーザー数, 負荷ピーク傾向, サービス提供時間, 総データ量, データの増分傾向など
性能要件
参考:パターンp.96
アクセス数/秒, 同時接続数, 許容レスポンスタイム, I/O 速度 (IOPS, スループット, レイテンシ) など
制約条件
排他制御の必要性, ロックの粒度など
アプリケーションの特性
マルチコア活用, キャッシュ特性など
性能の見積もりとサイジング
業務機能ごとのリソース使用率の分析
参考:パターンp.97
性能要件 (許容レスポンスタイムなど) のコンポーネントへの割り振り検討
詳細不明
リソースの (仮) 選定
参考:パターンp.96-99
評価方法
実機テスト (PoC)
ベンチマークとの比較
参考:パターンp98-99
セオリーp121-122
ユーティリティを活用した性能測定
参考:LPICレベル2
動作全般に対して
vmstat, iostat, mpstat, netstat, sar, gnome-system-monitor, top, powertop, Performance Co-Pilot (PCP), dmesg, dmidecode, sosreport, など
カーネルに対して
/proc/sysディレクトリやsysctlは、Linuxオペレーティングシステムにおいてカーネルのパラメータやシステムの設定を管理するための仕組みです。一方、/sysディレクトリは、Linuxカーネル自体やデバイスドライバに関する情報を提供するための仕組みです。
/proc/sysディレクトリは、実行時に変更できるカーネルパラメータの設定を含んでいます。このディレクトリ内の各ファイルは、カーネルの各種設定を管理し、プロセスとカーネルの間でやり取りするためのインターフェースを提供します。例えば、/proc/sys/net/ipv4/ip_forwardファイルは、IPv4ネットワークフォワーディングの有効化や無効化を制御します。
sysctlコマンドは、/proc/sysディレクトリのファイルを操作するためのユーティリティです。sysctlコマンドを使用することで、カーネルパラメータを取得、設定、変更することができます。
一方、/sysディレクトリは、Linuxカーネルプロセスとデバイスドライバの間の通信用に設計されたファイルシステムです。このディレクトリ内の各ファイルは、システムのハードウェア情報やデバイスの状態、設定などを表しています。例えば、/sys/class/netディレクトリは、ネットワークデバイスに関する情報を提供します。
/sysディレクトリ内のファイルは、プロセスによって直接読み書きされ、デバイスドライバとのインターフェースとして機能します。このディレクトリは、システム管理者やデバイスドライバ開発者にとって、システムのデバイス情報を監視・制御する上で便利なツールとなっています。
総じて、/proc/sysディレクトリと/sysディレクトリは、カーネルやシステムの設定や情報を提供しており、Linuxの管理やトラブルシューティング、カーネルの制御に役立ちます。
アプリケーションに対して
ps, top, Valgrind, SystemTap, eBPF ツールファミリ (syscount, gethostlatency, その他)
Valgrindは、デバッグやプロファイリングに使用されるオープンソースのツールキットです。Valgrindは、x86やARMなどのプロセッサアーキテクチャで実行されるLinuxプログラムを対象にします。
Valgrindは、実行時にコードを解析し、メモリのリーク、不正なメモリアクセス、未初期化の変数、パフォーマンス上の問題など、さまざまな問題を検出することができます。具体的な機能には以下があります:
- メモリリークの検出: Valgrindは、動的メモリ割り当ておよび解放のトレースを行い、メモリリークを検出します。リークしたメモリのサイズや位置などの情報も提供します。
- 不正なメモリアクセスの検出: Valgrindは、プログラムが配列の範囲外にアクセスするなど、不正なメモリアクセスを検出します。また、未初期化のメモリにアクセスすることも特定できます。
- 未初期化変数の検出: Valgrindは、プログラム内の未初期化の変数を特定し、これによるバグを検出します。
- パフォーマンスプロファイリング: Valgrindには、プログラムのパフォーマンス解析機能も備わっています。これにより、プログラムのホットスポットやボトルネックを特定し、最適化のための改善点を見つけることができます。
Valgrindは、コマンドラインで使用することも、他のツール(例:Memcheck、Cachegrind、Callgrindなど)と組み合わせて使用することも可能です。これにより、さまざまなデバッグニーズに応えることができます。
一般的にValgrindは、プログラムの品質や安定性を向上させるために重要なツールとされています。開発者はValgrindを使用してメモリリークやバグを早期に検出し、よりクリーンで信頼性の高いコードを開発することができます。
SystemTap(システムタップ)は、Linuxカーネルおよびユーザースペースで動作するアプリケーションのダイナミックトレーシングツールです。SystemTapを使用すると、実行中のシステムの挙動を観察、分析、トレースすることができます。
SystemTapは、プローブと呼ばれる特別な命令を使用して、トレースポイントをカーネルやユーザーアプリケーションに挿入します。プローブは、システムの特定のイベント、関数の呼び出し、変数の読み取り/書き込みなどを監視するために使用されます。
SystemTapの特徴は次のとおりです:
- ダイナミックトレース: SystemTapは、実行中のシステムの挙動を迅速かつ柔軟にトレースできます。カーネルモジュールやユーザースペースのアプリケーションにトレースポイントを挿入することで、システムの内部動作をリアルタイムで観察できます。
- テキストベースのスクリプト言語: SystemTapは独自のスクリプト言語を使用してトレーススクリプトを記述します。このスクリプト言語は、トレースするイベントやアクションを指定するための豊富な機能を提供します。
- イベント駆動型: SystemTapは、イベント駆動型のトレースをサポートしています。例えば、特定の関数が呼び出されたときに、パラメータ値や返り値を表示するといったトレースが可能です。
- プローブライブラリ: SystemTapには、既に用意されたプローブライブラリがあります。これにより、SystemTapを使用したトレースに必要なプローブの作成と管理を容易にすることができます。
SystemTapは、デバッグ、パフォーマンス解析、トラブルシューティングなど、さまざまな目的で使用されます。開発者はSystemTapを活用して、システムやアプリケーションの問題を特定し、改善点を見つけ出すことができます。
eBPF (extended Berkeley Packet Filter) は、Linuxカーネルで実行されるプログラムのセキュアで効率的な拡張フレームワークです。eBPFツールファミリは、eBPFを活用してシステムの監視、解析、トレースを行うためのツールの集まりです。以下にいくつかのeBPFツールについて説明します:
- syscount (システムコールのカウンタ): syscountは、実行中のプログラムが実行するシステムコールの数をカウントするためのツールです。システムコールの使用状況を把握したり、アプリケーションのパフォーマンス改善のためにシステムコールの数を最小限に抑えるための情報を取得するのに役立ちます。
- gethostlatency (ホスト遅延の測定): gethostlatencyは、ホスト名の解決時間を測定するためのツールです。ネットワークトラフィックの解析において、ホスト名の解決がボトルネックとなる場合に役立ちます。これにより、パフォーマンスの低下やネットワークの問題を特定できます。
- 其他のツール: 他のeBPFツールには、schedlat、biolatency、ext4slowerなどがあります。schedlatはタスクのスケジュール遅延を測定し、biolatencyはブロックデバイスのIO待機時間を測定します。ext4slowerは、ext4ファイルシステムのパフォーマンスボトルネックを特定します。
eBPFツールファミリは、カーネル内部の動作や性能を解析するのに役立ちます。これらのツールは、デバッグやトラブルシューティング、チューニングなどの目的でシステム管理者や開発者によって利用されます。eBPFは柔軟かつ拡張可能なフレームワークであり、Linuxカーネルのオペレーティングシステム層における深い洞察を提供します。
性能未達時のボトルネックやその原因の絞り込み
ボトルネックの対象
CPU, I/O, メモリ, ネットワーク
デフォルトの設定値, 利用目的別推奨値, 最適値
デフォルトの設定値は、アプリケーションやシステムの設定の初期値です。これは、一般的な設定であり、一般的な使用ケースに適した値です。ただし、特定のアプリケーションや要件に応じて最適な設定値が異なる場合があります。
利用目的別の推奨値は、特定の目的や要件に基づいて推奨される設定値です。このような推奨値は、パフォーマンス改善、セキュリティ強化、特定のワークロードへの最適化などの目的で設定されます。例えば、Webサーバーの推奨される設定値は、同時接続数に応じて調整されます。
最適値は、特定の環境や要件に合わせた最適な設定値です。これは、深いパフォーマンスチューニングや特定のワークロードの最適化を目指す場合に有用です。最適な設定値は、各種のトライアンドエラー、ベンチマークテスト、ワークロード分析などを通じて求められます。
一般的には、デフォルトの設定値は一般的な用途には合理的な値ですが、アプリケーションのユースケースや要件により、推奨値や最適値に調整することが求められる場合があります。設定変更の前に、それぞれのケースについて文書化されたガイドやベストプラクティスを参照することをおすすめします。また、設定の変更やチューニングが実際のシステムに与える影響を十分理解するために、十分なテストとモニタリングが求められます。
タスクを実行するツールのバージョン選択
タスクを実行するツールのバージョン選択は重要な決定です。ツールのバージョンには、新しい機能や改善点、バグ修正が含まれます。基本的には、最新バージョンを選択することが推奨されます。
最新バージョンの利点は、以下の通りです。
- 新機能や改善点が追加されるため、より効率的にタスクを実行できる場合があります。
- バグが修正されるため、安定性が向上する可能性があります。
- セキュリティの問題が解消されることがあります。
ただし、最新バージョンを使用することにはいくつかの考慮事項もあります。
- ツールの互換性: 最新バージョンが他のシステムや依存ツールと互換性があるかどうかを確認する必要があります。互換性の問題がある場合、アップグレードによって問題が発生する可能性があります。
- サポートとドキュメント: 古いバージョンよりも新しいバージョンのサポートやドキュメントが充実している場合があります。他のユーザーのフィードバックや知識ベースを参考にできるため、問題のトラブルシューティングや学習が容易になります。
したがって、新しいバージョンは一般的にはオプションとして検討されますが、各組織や個人はシステムの要件や制約に基づいて最善のバージョンを選択する必要があります。デプロイ前に十分なテストを行い、問題や予期しない結果が発生しないことを確認してください。
上限
性能未達時のボトルネックとして、以下の要素が上限となります。
- セッション数:アプリケーションが同時に処理できるセッション数には上限があります。セッションは、クライアントとサーバー間の接続を表します。セッションの数が多すぎると、サーバーのリソース(メモリやCPU)が枯渇し、処理能力が低下します。
- ファイル・ディスクリプタ:オペレーティングシステムは、プロセスがファイルやネットワークソケットなどのリソースにアクセスするために、ファイル・ディスクリプタと呼ばれる識別子を使用します。ファイル・ディスクリプタの数には上限があります。ファイル・ディスクリプタが使用されている場合、新しい接続を受け入れることができなくなります。
- ソケット・ポート関連:ネットワーク通信では、ソケットと呼ばれるエンドポイントと、ポート番号を使用して通信が行われます。ソケットとポートの組み合わせには上限があります。アプリケーションが同時に利用できるポート番号が限られている場合、新しい接続を受け入れることができなくなります。
これらのボトルネックは、アプリケーションの設計やサーバーのリソース制約によって異なります。性能のボトルネックを特定するためには、最初にこれらの要素がどれほど使用されているかを監視し、上限に達するかどうかを確認する必要があります。ボトルネックが特定された場合、ハードウェアのスケーリング、リソースの最適化、またはアプリケーションの設計の見直しなどを検討する必要があります。