読者です 読者をやめる 読者になる 読者になる

えいのうにっき

主に Web 系技術ネタ。背景画像 is powered by grass-graph.shitemil.works

読書メモ・詳解システムパフォーマンス 第3章/オペレーティングシステム

前回 詳解システムパフォーマンスを読んでいる話・2章/メソドロジ 読書メモ - えいのうにっき の続き。

詳解 システム・パフォーマンス

詳解 システム・パフォーマンス

読書メモに入る前に、輪読会で挙がった話題についてのメモを載せておく。

輪読会での話題

僕は東京勤務、輪読会の主体は京都オフィスということもあり、輪読会はハングアウトによるリモートで実施していて、そのため時々聞き取りにくいところがあったので聞き取れたところだけ記載する。

  • カーネル空間とユーザー空間?
    • 図3-8 あたり。
    • カーネル空間はユーザー空間に比べて圧倒的に小さいはず。
  • システムライブラリとはどういうもの?
    • glibc とかそういうの。
    • システムコールのかわりにシステムライブラリを使っているようなもので具体例は?
      • malloc とか? sprintf も?
  • カーネルコンテキスト内での構造体の話
  • malloc の挙動について・free なメモリの特定方法について
  • fork と clone
    • fork(2) とは異なり、clone() では、子プロセス (child process) と呼び出し元のプロセスとが、メモリー空間、ファイルディスクリプターのテーブル、シグナルハンドラーのテーブルなどの 実行コンテキストの一部を共有できる。
  • スケジューラによってCPUリソースの割当を待ってるプロセスの数ロードアベレージだよね
  • プロセスを作るシステムコールってあるんだっけ?
  • goroutine ってスレッド?
    • 同一タスク内での話にすぎないので、マルチコアスケールしない(環境変数で使用するコア数を指定できるようになった)
  • キャッシュレイヤ、ひたすらある…

読書メモ

基礎知識

  • アプリケーション -> (システムライブラリ -> )システムコール -> カーネル -> ハードウェア
  • カーネルが実行されるとき:ユーザーレベルプログラムがシステムコールを発行したときやデバイスが割り込みを送ったときに実行される。オンデマンド。
    • 頻繁に I/O を実行するワークロード=頻繁にカーネルコンテキストで実行される必要があるワークロード。
  • カーネルは、デバイスへのフルアクセスと特権的な命令の実行を認めるカーネルモードという特別なCPUモードで実行される、唯一のプログラム。
  • スタック:スレッドが必要とする過去の実行情報(関数、レジスタ)が格納されている
  • 「割り込みと割り込みスレッド」よくわからなかった。「上半分」?「下半分」?

プロセス

  • ユーザーレベルプログラムを実行するための環境のこと。メモリアドレス空間、ファイル記述子、スレッドスタック、レジスタから構成されていることもあり、ある意味では初期のコンピュータを仮想化したものに近い。
  • fork して exec で別のプログラムを実行できる
  • プロセスは、ひとつ以上の「スレッド」を収めている
    • スレッドは、プロセスのアドレス空間を操作し、同じファイル記述子を共有する。
    • スレッドは、スタック・レジスタ・プログラムカウンタから構成される実行コンテキストである。
    • マルチスレッドにすることにより、ひとつのプロセスが複数のCPUにまたがって並列実行を行なうことができる。
プロセスのライフサイクル
  • 「プロセスのライフサイクル」ではあるが、最近のマルチスレッドOSでは、スケジューリングされ・実行されるのはスレッド。
  • プロセスが作成されると、まず「アイドル」状態になる
  • 次に「実行可能」状態になる。これは、プロセスが実行できる準備は整っているものの、CPUランキュー内で自分がCPUを使える順番を待っている、という状態。
  • CPU上で実行されているときが「処理中」状態。
  • 「処理中」の過程において I/O を実行すると、それが完了するまでプロセスはブロックされ、「スリープ」状態になる。I/O が完了すると、プロセスは目覚めて「実行可能」状態になる。
  • プロセスの終了中に親プロセスがプロセスの状態を読むか、カーネルから削除されるのを待つ間、プロセスはゾンビ状態になる(?)
プロセス環境
  • プロセスの環境は、「ユーザーアドレス空間内のデータ」と「カーネルコンテキスト(カーネル内のメタデータ)」から構成される。
    • カーネルコンテキストは、プロセスの様々なプロパティと統計情報から構成されている。
    • ユーザーアドレス空間には、実行可能ファイル、ライブラリ、ヒープによるプロセスのメモリセグメント、が含まれている

システムコール

仮想メモリ

  • プロセスとカーネルに、メインメモリに対してほぼ無限の専用プライベートビューを提供するための、メインメモリの抽象概念。
  • プロセスとカーネルは競合を気にすることなく、専用のプライベートアドレス空間を操作できる。
  • メインメモリとセカンダリストレージのどちらかに仮想メモリを透過的にマッピングすることができる。
  • ほとんどのOSでは、仮想メモリ実メモリマッピングするのはオンデマンド・メモリに初めて書き込みをするときだけ。

メモリ管理

  • スワッピング:プロセス全体をメインメモリとセカンダリストレージの間で移動する
    • Unix のもともとの方法。深刻なパフォーマンス低下を引き起こす。
  • ページング:ページと呼ばれるメモリの小さな単位を移動する
  • どちらの場合も、最後に使用されてからもっとも時間が経っている LRU 方式でメモリがセカンダリストレージに移され、再び必要にならない限りはメインメモリに戻されることはない。
  • Linux では、スワッピングという用語はページングと同じ意味で使われている
    • Linux カーネルは、スレッド全体・プロセス全体をスワッピングすることはサポートしていない。

スケジューラ

  • Unix とその派生システムは、タイムシェアリングシステムであり、複数のプロセスを同時に実行できるようにするために、各プロセスに実行時間を分け与えている。そのスケジューリングは、カーネルの主要コンポーネントであるスケジューラによって行われている。
  • スケジューラは、ランキューと呼ばれる優先度別のキューで実行可能状態のすべてのスレッドを管理している。
    • カーネルスレッドのほとんどは、ユーザーレベルプロセスよりも優先度は高い。
  • プロセスの優先度は、特定のワークロードのパフォーマンスを上げるために、スケジューラが動的に変えることができる。ワークロードの種別は以下。
    • CPUバウンド:CPUに負担のかかる計算を実行するアプリケーションなどで、長い実行時間を要することが想定されるもの。CPUリソースがボトルネックとなりうるもの。
    • I/Oバウンド:Webサーバ、ファイルサーバ、対話的シェルなどのように、主として I/O を行い、CPU にほとんど負担をかけないアプリケーション。負荷が増えると、ストレージやネットワークリソースとの間の I/O がボトルネックになる。
  • スケジューラは、上記ワークロード種別を見分け、I/O バウンドのワークロードが早く実行されるようにする(CPUバウンドワークロードよりもレイテンシの低い応答が望まれるため)。
    • バウンド種別を見分けるのには、最近の CPU 時間と経過時間とを比較することで分類している

ファイルシステム

キャッシング

主なキャッシュの種類。チェックされる順番になっている。

  1. アプリケーションキャッシュ
  2. Webサーバキャッシュ
    • Apache などによるキャッシュ
  3. キャッシングサーバ
  4. データベースキャッシュ
    • MySQL バッファキャッシュなど
  5. ディレクトリキャッシュ
    • DNLC(?)
  6. ファイルメタデータキャッシュ
    • iノードキャッシュ(?)
  7. オペレーティングシステムバッファキャッシュ
    • segvn(?)
  8. ファイルシステムプライマリキャッシュ
  9. ファイルシステムセカンダリキャッシュ
  10. バイスキャッシュ
  11. ブロックキャッシュ
    • バッファキャッシュ
  12. ディスクコントローラキャッシュ
    • RAID カードキャッシュ
  13. ストレージアレイキャッシュ
  14. オンディスクキャッシュ

ネットワーク

デバイスドライバ

  • バイスの管理と I/O のためのカーネルソフトウェア。多種多様な物理デバイスとの通信を実現する
  • 対応するインターフェースの種類に「キャラクタインターフェース」「ブロックインターフェース」がある
    • キャラクタインターフェース:1文字までの任意の I/O サイズに対する、バッファリングされないシーケンシャルアクセスを提供する。キーボードやシリアルポートなど。
    • ブロックインターフェース:512バイトのブロックを単位として I/O を実行するもの。

マルチプロセッサ

  • SMP : Synmetric MultiProcessing。全てのCPUを平等に扱う実装
  • CPU クロスコール:メモリへの書き込み発生により、キャッシュされている内容が陳腐化したことを他のCPUに知らせるなどの目的で行なう、他CPUへの処理の要求のこと。
    • ほかのスレッドの中断を最小限に抑えるために、すばやく実行されるように設計されたプロセッサ割り込み。

プリエンプション

  • カーネルプリエンプション:優先度の高いユーザーレベルスレッドがカーネルに対して割り込んで処理を実行できる仕組み。
  • ボランタリーカーネルプリエンプション:カーネルコード内の論理的に停止できるポイントにてプリエンプションが必要かどうかをチェックし、必要なら行なう、といったアプローチ手法。「ボランタリー」自発的。

リソース管理

可観測性

カーネル

Unix

Solaris ベースシステム

  • オリジナル Unix のコードの一部も含んでいる、SunOS から発展したもの。SunOSBSD を基礎としたもの。

Linux ベースシステム

違い

練習問題

OS 用語について

  • プロセス、スレッド、タスクの違い
    • プロセス:ユーザーレベルプログラムを実行するための環境のこと。メモリアドレス空間、ファイル記述子、スレッドスタック、レジスタから構成されていることもあり、ある意味では初期のコンピュータを仮想化したものに近い。
    • スレッド:プロセスは、ひとつ以上の「スレッド」を収めている。スレッドは、スタック・レジスタ・プログラムカウンタから構成される実行コンテキストである。プロセスのアドレス空間を操作し、同じファイル記述子を共有する。マルチスレッドにすることにより、ひとつのプロセスが複数のCPUにまたがって並列実行を行なうことができる。
    • タスク:Linux の実行可能な実態。プロセス(シングルスレッドの場合) or マルチスレッドプロセスの各スレッド or カーネルスレッド、のいずれかを指す。
  • コンテキストスイッチとは
  • ページングとスワッピングの違い
    • スワッピング:プロセス全体をメインメモリとセカンダリストレージの間で移動する
      • Unix のもともとの方法。深刻なパフォーマンス低下を引き起こす。
    • ページング:ページと呼ばれるメモリの小さな単位を移動する
    • どちらの場合も、最後に使用されてからもっとも時間が経っている LRU 方式でメモリがセカンダリストレージに移され、再び必要にならない限りはメインメモリに戻されることはない。
    • Linux では、スワッピングという用語はページングと同じ意味で使われている
      • Linux カーネルは、スレッド全体・プロセス全体をスワッピングすることはサポートしていない。
  • I/Oバウンドワークロードと CPU バウンドワークロードの違い
    • I/O がワークロードの大部分を占めるものが前者、Webサーバなど
    • CPU 演算処理がワークロードの大部分を占めるものが後者。

コンセプトについて

その他

  • スレッドが CPU を手放す理由?
    • I/O 待ち
    • プリエンプションが発生する
  • 仮想メモリとデマンドページングの利点?
    • 「デマンドページング」?
      • 「デマンドページングとは、メモリ管理方式の一種で、該当アドレスのメモリ内容が必要となった時点で、物理ページを論理ページに割り当てる方式のこと」
    • 本当に必要になるタイミングまで物理ページの割り当てを遅延させることで、レイテンシの高い物理ページへの不必要な割り当てを削減できる?

第3章/オペレーティングシステム の読書メモは以上。



follow us in feedly