前回 詳解システムパフォーマンスを読んでいる話・2章/メソドロジ 読書メモ - えいのうにっき の続き。
- 作者: Brendan Gregg,西脇靖紘,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/02/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
読書メモに入る前に、輪読会で挙がった話題についてのメモを載せておく。
輪読会での話題
僕は東京勤務、輪読会の主体は京都オフィスということもあり、輪読会はハングアウトによるリモートで実施していて、そのため時々聞き取りにくいところがあったので聞き取れたところだけ記載する。
- カーネル空間とユーザー空間?
- 図3-8 あたり。
- カーネル空間はユーザー空間に比べて圧倒的に小さいはず。
- システムライブラリとはどういうもの?
- カーネルコンテキスト内での構造体の話
- malloc の挙動について・free なメモリの特定方法について
- fork と clone
スケジューラによってCPUリソースの割当を待ってるプロセスの数
がロードアベレージだよね- プロセスを作るシステムコールってあるんだっけ?
- goroutine ってスレッド?
- 同一タスク内での話にすぎないので、マルチコアスケールしない(環境変数で使用するコア数を指定できるようになった)
- キャッシュレイヤ、ひたすらある...
読書メモ
基礎知識
- アプリケーション -> (システムライブラリ -> )システムコール -> カーネル -> ハードウェア
- カーネルが実行されるとき:ユーザーレベルプログラムがシステムコールを発行したときやデバイスが割り込みを送ったときに実行される。オンデマンド。
- 頻繁に I/O を実行するワークロード=頻繁にカーネルコンテキストで実行される必要があるワークロード。
- カーネルは、デバイスへのフルアクセスと特権的な命令の実行を認めるカーネルモードという特別なCPUモードで実行される、唯一のプログラム。
- マルチタスクをサポートするためにデバイスアクセスを調停したり
- プロセスとユーザーがお互いのデータにアクセスするのを防ぐ(明示的に許可された場合を除く)
- ユーザープログラム(プロセス)はユーザーモードで実行される。ユーザープログラムからシステムコールが発行されると、CPUのモードはユーザーモードからカーネルモードに切り替わる。これをコンテキストスイッチという。
- このコンテキストスイッチには時間がかかる。NFSなどのを一部のサービスはコンテキストスイッチせずにデバイスI/Oを実行できるようにするために、カーネルモードソフトウェアとして実装されていたりする。
- 各モードは、専用のソフトウェア実行コンテキスト(スタック、レジスタなど)を持っている
- スタック:スレッドが必要とする過去の実行情報(関数、レジスタ)が格納されている
- 「割り込みと割り込みスレッド」よくわからなかった。「上半分」?「下半分」?
プロセス
- ユーザーレベルプログラムを実行するための環境のこと。メモリアドレス空間、ファイル記述子、スレッドスタック、レジスタから構成されていることもあり、ある意味では初期のコンピュータを仮想化したものに近い。
- fork して exec で別のプログラムを実行できる
- プロセスは、ひとつ以上の「スレッド」を収めている
プロセスのライフサイクル
- 「プロセスのライフサイクル」ではあるが、最近のマルチスレッドOSでは、スケジューリングされ・実行されるのはスレッド。
- プロセスが作成されると、まず「アイドル」状態になる
- 次に「実行可能」状態になる。これは、プロセスが実行できる準備は整っているものの、CPUランキュー内で自分がCPUを使える順番を待っている、という状態。
- CPU上で実行されているときが「処理中」状態。
- 「処理中」の過程において I/O を実行すると、それが完了するまでプロセスはブロックされ、「スリープ」状態になる。I/O が完了すると、プロセスは目覚めて「実行可能」状態になる。
- プロセスの終了中に親プロセスがプロセスの状態を読むか、カーネルから削除されるのを待つ間、プロセスはゾンビ状態になる(?)
プロセス環境
システムコール
仮想メモリ
- プロセスとカーネルに、メインメモリに対してほぼ無限の専用プライベートビューを提供するための、メインメモリの抽象概念。
- プロセスとカーネルは競合を気にすることなく、専用のプライベートアドレス空間を操作できる。
- メインメモリとセカンダリストレージのどちらかに仮想メモリを透過的にマッピングすることができる。
- ほとんどのOSでは、仮想メモリを実メモリにマッピングするのはオンデマンド・メモリに初めて書き込みをするときだけ。
メモリ管理
- スワッピング:プロセス全体をメインメモリとセカンダリストレージの間で移動する
- Unix のもともとの方法。深刻なパフォーマンス低下を引き起こす。
- ページング:ページと呼ばれるメモリの小さな単位を移動する
- どちらの場合も、最後に使用されてからもっとも時間が経っている LRU 方式でメモリがセカンダリストレージに移され、再び必要にならない限りはメインメモリに戻されることはない。
- Linux では、スワッピングという用語はページングと同じ意味で使われている。
スケジューラ
- Unix とその派生システムは、タイムシェアリングシステムであり、複数のプロセスを同時に実行できるようにするために、各プロセスに実行時間を分け与えている。そのスケジューリングは、カーネルの主要コンポーネントであるスケジューラによって行われている。
- スケジューラは、ランキューと呼ばれる優先度別のキューで実行可能状態のすべてのスレッドを管理している。
- カーネルスレッドのほとんどは、ユーザーレベルプロセスよりも優先度は高い。
- プロセスの優先度は、特定のワークロードのパフォーマンスを上げるために、スケジューラが動的に変えることができる。ワークロードの種別は以下。
- スケジューラは、上記ワークロード種別を見分け、I/O バウンドのワークロードが早く実行されるようにする(CPUバウンドワークロードよりもレイテンシの低い応答が望まれるため)。
- バウンド種別を見分けるのには、最近の CPU 時間と経過時間とを比較することで分類している
ファイルシステム
キャッシング
主なキャッシュの種類。チェックされる順番になっている。
- アプリケーションキャッシュ
- Webサーバキャッシュ
- Apache などによるキャッシュ
- キャッシングサーバ
- memcached など
- データベースキャッシュ
- MySQL バッファキャッシュなど
- ディレクトリキャッシュ
- DNLC(?)
- ファイルメタデータキャッシュ
- iノードキャッシュ(?)
- オペレーティングシステムバッファキャッシュ
- segvn(?)
- ファイルシステムプライマリキャッシュ
- ZFS ARC
- ファイルシステムセカンダリキャッシュ
- ZFS L2ARC
- デバイスキャッシュ
- ZFS vdev
- ブロックキャッシュ
- バッファキャッシュ
- ディスクコントローラキャッシュ
- RAID カードキャッシュ
- ストレージアレイキャッシュ
- オンディスクキャッシュ
ネットワーク
デバイスドライバ
- デバイスの管理と I/O のためのカーネルソフトウェア。多種多様な物理デバイスとの通信を実現する
- 対応するインターフェースの種類に「キャラクタインターフェース」「ブロックインターフェース」がある
- キャラクタインターフェース:1文字までの任意の I/O サイズに対する、バッファリングされないシーケンシャルアクセスを提供する。キーボードやシリアルポートなど。
- ブロックインターフェース:512バイトのブロックを単位として I/O を実行するもの。
マルチプロセッサ
- SMP : Synmetric MultiProcessing。全てのCPUを平等に扱う実装
- CPU クロスコール:メモリへの書き込み発生により、キャッシュされている内容が陳腐化したことを他のCPUに知らせるなどの目的で行なう、他CPUへの処理の要求のこと。
- ほかのスレッドの中断を最小限に抑えるために、すばやく実行されるように設計されたプロセッサ割り込み。
プリエンプション
- カーネルプリエンプション:優先度の高いユーザーレベルスレッドがカーネルに対して割り込んで処理を実行できる仕組み。
- ボランタリーカーネルプリエンプション:カーネルコード内の論理的に停止できるポイントにてプリエンプションが必要かどうかをチェックし、必要なら行なう、といったアプローチ手法。「ボランタリー」自発的。
リソース管理
可観測性
カーネル
Unix
- 元々は Multics を開発していた人たちが開発
- 軽いマルチタスクOSとカーネルとして UNIX を開発
- BSD や SunOS(Solaris)、Linux などのシステムは UNIX から派生。
Solaris ベースシステム
Linux ベースシステム
- Linux カーネルは、先行システムの以下のような点を基礎として開発された。
- Linux は、膨大なデバイスドライバをサポートし、それらをオープンソース化するように働きかけることを通じて、ほかの多くのOSにも間接的に貢献している
違い
練習問題
OS 用語について
- プロセス、スレッド、タスクの違い
- プロセス:ユーザーレベルプログラムを実行するための環境のこと。メモリアドレス空間、ファイル記述子、スレッドスタック、レジスタから構成されていることもあり、ある意味では初期のコンピュータを仮想化したものに近い。
- スレッド:プロセスは、ひとつ以上の「スレッド」を収めている。スレッドは、スタック・レジスタ・プログラムカウンタから構成される実行コンテキストである。プロセスのアドレス空間を操作し、同じファイル記述子を共有する。マルチスレッドにすることにより、ひとつのプロセスが複数のCPUにまたがって並列実行を行なうことができる。
- タスク:Linux の実行可能な実態。プロセス(シングルスレッドの場合) or マルチスレッドプロセスの各スレッド or カーネルスレッド、のいずれかを指す。
- コンテキストスイッチとは
- カーネルモードとユーザーモードの相互でのモードの切り替えのこと。システムコールが発行されるとコンテキストスイッチが起こる。
- ページングとスワッピングの違い
- I/Oバウンドワークロードと CPU バウンドワークロードの違い
- I/O がワークロードの大部分を占めるものが前者、Webサーバなど
- CPU 演算処理がワークロードの大部分を占めるものが後者。
コンセプトについて
その他
- スレッドが CPU を手放す理由?
- I/O 待ち
- プリエンプションが発生する
- 仮想メモリとデマンドページングの利点?
- 「デマンドページング」?
- 「デマンドページングとは、メモリ管理方式の一種で、該当アドレスのメモリ内容が必要となった時点で、物理ページを論理ページに割り当てる方式のこと」
- 本当に必要になるタイミングまで物理ページの割り当てを遅延させることで、レイテンシの高い物理ページへの不必要な割り当てを削減できる?
- 「デマンドページング」?
第3章/オペレーティングシステム の読書メモは以上。