詳解システムパフォーマンス 第2版
第5章
・パフォーマンスを引きあげるテクニック:マルチスレッドプログラミング、ハッシュテーブル、ノンブロッキングIO
・ロックと同期プリミティブ
適切な目標設定
レイテンシ?スループット?何を目標にするかで、目標を阻む要因が異なる
レイテンシならディスクIOなど。スループットならCPU使用率など
Adpexを目標指標とすることで、顧客エクスペリエンスをうまく定量化できる
ビッグオー記法
アルゴリズムの複雑度を分析し、入力データセットが増えたときに、パフォーマンスがどう変わるかをモデリングする
5.2 アプリケーションパフォーマンス向上のためのテクニック
・I/Oサイズ選択
・キャッシング
・バッファリング
・ポーリング
・並列実行、並列処理
タイムシェアリングシステムで提供される
・ノンブロッキングI/O
・プロセッサのバインド
・パフォーマンスマントラ
並列実行、並行処理のボリュームが大きい
プログラミング言語
・コンパイル言語
→gccの話が興味深い
・インタープリタ言語
・仮想マシン
→ガベージコレクションのデメリットの話が面白い
メソドロジ
・CPUプロファイリング
・off-CPU分析
・システムコール分析
・USEメソッド
・スレッドの状態の分析
・ロック分析
・静的パフォーマンスチューニング
・分散トレーシング
プロファイリングとは
可観測性ツール多すぎ
第6章
・基礎知識
・アーキテクチャ
・メソドロジ
・可観測性ツール
・チューニング
6.2
ハードウェアスレッドは一つで1個の論理CPUとしてアドレッシングができる。
つまり、4コアあり、それぞれ2つのハードウェアスレッドを持つプロセッサの場合、OSからみると8CPUあるように見える。
プロセッサではハードウェアキャッシュがさまざま用意されており、それぞれサイズが異なる。小さく、高速であればあるほど、キャッシュはCPUに近くなる。
ランキューはよくわからん
6.3
4Ghzであれば毎秒40億秒、、といったように、クロックスピードは、CPUごとに異なる。
なかには、動的にクロックスピードを変えられるプロセッサも存在する。
クロックスピードはプロセッサのパフォーマンス指標としてあげられやすいが、いくらスピードが早くとも、中でやってる処理がパフォーマンスに寄与するものでなければ、いくらスピードが早くともワークロードのスループットがあがらない。
命令のとこはよくわからん。
使用率は、CPUが仕事をしていてビジーとなっていた時間の割合のことである。
この時間は、ユーザーレベルの実行で使われていた時間(ユーザー時間)と、カーネルレベルの時間(カーネル時間)に分けられるが、99:1の割合で、ほぼユーザー時間がCPU時間を占めている。
使用率100%のCPUを飽和状態と言い、こうなるとパフォーマンスが下がる
プリエンプションはよくわからん
実行スレッドを分割し、複数のCPUで仕事を処理する方法として、マルチプロセスとマルチスレッディングが存在する。
マルチスレッディングの方がパフォーマンスに優れるが、開発者にとっては複雑となりやすい。
プロセッサは最大ワードサイズ(32bit or 64bit)を持っており、サイズが多いいほどパフォーマンスはよくなる反面、データ型によっては、未使用ビットが発生した場合にメモリにオーバーヘッドがかかったり、ポインタサイズが大きくなるとより大きなメモリI/Oが必要となったりする。
6.4
長い、、、
ハードウェア
・プロセッサの仕組み
・Pステート(パフォーマンス設定)とCステート(電力設定)
・CPUキャッシュ:読み出しキャッシングと書き込みバッファリングによるパフォーマンス向上
・インターコネクトによるマルチプロセッサ内でのCPU接続
・ハードウェアカウンタ
・GPU
ソフトウェア
スケジューラは主要機能として、以下をもつ
・タイムシェアリング:実行可能スレッドの中で、優先度がもっとも高いものを先に実行する
・プリエンプション:優先度の高いスレッドが実行可能になった時に、優先度の高いスレッドをプリエンプションで実行可能にする
・ロードバランシング:ビジーではないCPUのランキューにスレッドを移す
・・・他にもソフトウェアについて色々書いてた
6.5 メソドロジ
・ツールメソッド
利用できるツールを順に試す。時間がかかる
・USEメソッド
パフォーマンス調査の初期段階として、全てのコンポーネントの使用率(Utilization)、飽和度(Satuation)、エラー(Error)を調べる
・ワークロード特性の把握
ロードアベレージ、ユーザー時間とシステム時間の比率、システムコールの頻度、磁ハウ的なコンテキストスイッチの頻度、割り込みの頻度など。
負荷の特性を明らかにしていくことを目的とする
・プロファイリング
解析対象の具体像を構築する
・タイマーベースのサンプリング:現在実行している関数かスタックトレースのサンプルを集める
・関数トレーシング:関数呼び出しをインストルメンテーションし、所要時間を計測する
プロファイルをあつめたら、フレームグラフから読み解いていく。
・サイクル分析
サイクルレベルでのCPUの使用率がわかる
・パフォーマンスモニタリング
元にある問題、経時的な振る舞いのパターンを明らかにする
CPUにおいては、使用率と飽和度が指標となる。
・静的パフォーマンスチューニング
構成された環境の問題点に注目する
・優先度のチューニング
Unixでは、プロセスの優先度をnice値で設定している。正の値であれば優先度低、負の値であれば優先度高である。
・リソースコントロール
あんまよくわからん
可観測性ツールが長すぎるので、一旦読み飛ばす
第7章 メモリ
メモリで考慮すべきこと
・メモリのアロケート
・関数
・メモリのコピー
・アドレス空間のマッピングの管理にかかるCPUコスト
7.2 コンセプト
・仮想メモリ
スワップデバイスを用いて物理メモリ以上の容量を提供する。
スワッピングはカーネルによって行われる。(オーバーサブスクライブ)。これには限度を設けることができるが、linuxでは制限を設けないこともできる。(オーバーコミット)
・ページング
ページをメモリに出し入れ(ページin/out)すること。
この仕組みは以下を実現する
・部分的にロードされたプログラムの実行
・メインメモリよりも大きいプログラムの実行
・メインメモリとストレージデバイスの間のプログラムの効率的な移動
また、種類としてはファイルシステムページングと無名ページングが存在する
・ファイルシステムページング:mmapを用いてメモリマップとファイル内(?)のページの読み書きに起きる「良い」ページング
・無名ページング(スワップ)(?):パフォーマンスを下げるため、「悪い」ページング
・デマンドページング
仮想メモリページをオンデマンドで物理メモリにマッピングする
・オーバーコミット
システムが格納できる以上のメモリのアロケーションを認める。
・プロセススワッピング
メインメモリとスワップデバイス or スワップファイル間でプロセス全体を移動する。
再び実行しようとすると、膨大なディスクIOが必要となり、パフォーマンスを大きく損なう
7.3 アーキテクチャ
・ハードウェア
メインメモリ:DRAMがよく使われる。
・ソフトウェア
用語が多い、、、
メソドロジ
・ツールメソッド
・USEメソッド
・使用形態の特性の把握
・高度な使用形態の特性チェックリスト
第8章 ファイルシステム
アプリケーションにとってはファイルシステムのパフォーマンスの方が重要であり、ファイルシステムはアプリケーションがディスクレベルのレイテンシに悩まされないよう、キャッシング、バッファリング、非同期I/Oなどを駆使する。
8.2 モデル
ファイルシステムは、アプリケーションおよびシステムツールと、ストレージデバイス間の中立を行っており、読み出し要求に対してキャッシュ、もしくはディスクからデータを返却(キャッシュミス)している。
8.3 コンセプト
・ファイルシステムレイテンシ
ファイルシステムパフォーマンスの最も重要な指標。
・キャッシング
ファイルシステムでは、一般にRAMをキャッシュとして用いることで、パフォーマンス向上を図る。
・ランダムI/OとシーケンシャルI/O
シーケンシャルI/Oでは、前のI/Oの末尾からオフセットが始まり、ランダムI/Oでは、不規則にオフセットが変化する。伝統的に、フラグメンテーションを避けるためにランダムI/Oは避けられてきた
・プリフェッチ
大量のファイルデータをシーケンシャルに読み出す場合、大きすぎてキャッシュに収まりきらなかったり、1度しか読み出されないため、キャッシングされる可能性が低い。プリフェッチは、現在のファイルI/O オフセットと前回のオフセットからシーケンシャルな読み出しワークロードを検出し、アプリケーションの要求前にディスク読み出しを予想して発行する。
・ライトバックキャッシング
メインメモリへの転送が終わったら、書き込みを完了扱いし、ディスクへの書き込みはあとで非同期に行われる。
・同期書き込み
永続化層への書き込みが完全に完了しないと終わらない書き込み。
・RAW I/OとDirect I/O
RAW I/Oは、ファイルシステムを素通りして、直接ディスクオフセットに書き込まれる。Direct I/Oは、ファイルシステムを使いつつ、ファイルシステムキャッシュをバイパスできるようにする。
長い。
8.4 アーキテクチャ
・VFS
異なるファイルシステムタイプに対し、共通インターフェースを提供する
・ファイルシステムキャッシュ、ページキャッシュ、dentryキャッシュ、iノードキャッシュ
ファイルシステムまわりのいろんなキャッシュ
・パフォーマンス関連
長い。挫折
第9章 ディスク
9.2 モデル
・単純ディスク
ディスクが受け入れたI/Oは、処理されているかキューに待機しているかのどちらか。
ただし、必ずFIFOが使われるわけではない。
・オンディスクキャッシュ
一部の読み出し要求を、高速なメモリタイプで満足させる。
ライトバックによって、書き込みのパフォーマンスも上げられる。
・コントローラ
ディスクコントローラは、ディスクデバイスとCPUのI/Oトランスポートの橋渡しをする
9.3 コンセプト
時間の計測
・I/O要求時間:I/Oを発行してから完了するまでの時間
・I/O待ち時間:キューで待機していた時間
・I/Oサービス時間:処理されていた時間。最近のディスクは内部にキューを持っているため、この時間にはオンディスクキューでの待ち時間も含まれる
第10章
ネットワークインターフェース
ネットワークに接続するOS側のエンドポイント
コントローラ
ポートとシステムのI/Oトランスポートの間でパケットを転送するマイクロプロセッサ
プロトコルスタック
ネットワーキングは、プロトコルスタックによって実現される。
層が異なれば、メッセージを表す用語が異なってくる。