Systems Performance: Enterprise and Cloudを読んでいく。
前回に引き続き自分用メモ。 後半は3節部分。
このブログに書き起こす作業に予想以上のコストがかかっているので、今後の章ではSolarisベースの説明に関しては書かないことにした。 Linuxの比較として特に重要と思われる部分は書くかもしれないが基本的には省いて書く予定。
3.3 Kernels
このセクションではSolarisとLinuxベースのカーネルについて、歴史と特徴、パフォーマンスにおける違いの議論について紹介していく。 また、背景として、Unixの起源についても議論する。
いくつかの明確な違いとして、ファイルシステムのサポートと、パフォーマンス観測フレームワークの違いがある。
また、システムコールや、ネットワークスタックのアーキテクチャ、リアルタイムサポートやCPU, disk, I/O schedulingにも違いがある。
表3.3にそれぞれのあるバージョンにおけるシステムコール数の違いを挙げておく。
表3.3
もちろんこれだけで違いを比較することはできない。 しかしこれを見るとそれぞれのOSでバージョンが上がるごとに、Linuxではシステムコールが増え、Solarisでは減っていることがわかる。 どちらのカーネルも複雑度が上がってきているが、これらのユーザランドへの影響は違ったものになっていることがわかるだろう。
3.3.1 Unix
UnixはKen Thompson, Dennis RitchieやAT&T Bell Labsの他のメンバーによって、1969年ごろに開発された。 その正確な起源は"The UNIX Time-sharing System"に説明されている。 最初のバージョンは我々のうちの一人(Thompson)が利用可能なコンピュータ環境に失望した時に書かれた。 UNIXの開発者たちは以前は様々な情報やコンピュータサービスであるMultics上で働いていた。 UNIXはマルチタスク用のOS, kernelとして開発され、"UNiplexed Information and Computing Service(UNICS)"と名付けられていた。
カーネルは唯一ユーザの好みでコードを代理することが出来ないようになっている。 これはユーザが同じことをするときに様々なオプションを許可するということではない。 むしろ、何かをするときに1つの方法しか取れないようにするということである。
カーネルが小さい一方で高いパフォーマンスを提供する特徴がある。 プロセスはスケジューラの優先度があり、より高い優先度の優先度を減らすようにしている。 Disk I/Oは大きいブロック(512byte)のブロックを使い効率化し、デバイスごとにメモリにバッファキャッシュがある。 そしてもちろんプロセスはマルチタスクで並行によりされる。
3.3.2 Solaris-Based
Solarisカーネルは単にUnix由来ではないが、いくらかはUnixカーネルから残っているものもある。 SolarisはSunOSとして、Sun Microsystemsによって1982年から開発が始まった。 BSDをベースとして、Sunワークステーションでよく動くように小さく保たれている。 198年の後半から、SunはBSDとXenixから、AT&TのUnix System V Release 4(SVR4)のために新しいオペレーティングシステムを開発し始めた。 SVR4が新しいUnixのスタンダードになり、新しいカーネルとそれをベースとしたOSを作った。これはSunOS 5.だが、Sunはマーケティング上これをSolaris 2.0と予備、以前のSunOSをSolaris1.0とした。 (しかしエンジニアはカーネル内にSunOSの名前を残していた)
3.3.3 Linux-Based
Linuxは1991年にLinus TorvaldsによってIntel personalコンピュータ向けに作られた。 これはMINIXというUNIXをより小さいコンピュータ向けに自由に、小さく作ろうとしたものである。 同じ時期にBSDもUnixのfree版を提供しようとしていたが、法的なトラブルがあった。
Linuxは一般的なアイディアとして以下を祖先としている
- Unix
- operating system lyers
- system calls
- multitasking
- processes, process priorities
- virtual memory
- global file system
- device files
- buffer cache
- BSD
- paged virtual memory
- demand paging
- fast file system(FFS)
- TCP/IP network stack
- sockets
- Solaris
- Plan 9
- resource forks(rfork)
- for creating different levels of sharing between processes and threads
Linuxのパフォーマンスに関する項目は以下のようなものがある。 それぞれの機能が実装されたlinuxのカーネルバージョンや詳細が説明されている章は省略している。
- CPU scheduling classes
- I/O scheduling classes
- 異なるスケジューリングアルゴリズムが開発されている。
- deadline, anticipatory, completely fair queueing(CFQ)
- TCP congestion
- Overcommit
- out-of-memory(OOM) Killerに関するもの
- これはメインメモリの消費量を低減する以上のことをする
- Futex
- "fast user-space mutex"の略称
- ユーザレベルの高機能な同期機構(?)
- Huge pages
- OProfile
- RCU
- カーネルが提供する"read-copy update"同期機構
- たいていが読み込みの環境で、更新を伴う複数の並行な読み取りを可能にする
- epoll
- Modular I/O scheduling
- DebugFS
- パフォーマンスツールに使われる、ユーザレベルへカーネルの非構造化データを提供する簡単なインターフェース
- Cpusets
- プロセスへの排他的なCPUグルーピング
- Voluntary kernel preemption
- 完全なプリエンプションを除く低レイテンシなスケジューリング
- inotify
- blktrace
- I/Oブロックイベントをトレースするフレームワークとツール
- splice
- Delay accounting
- タスクごとのトラックの遅延状態
- IO accounting
- プロセスごとの様々なI/Oの情報を計測する
- DynTicks
- Dynamic ticksはカーネルのタイマー割り込みに不必要なtickをかけないようにしてくれる
- SLUB
- slabメモリアロケータのシンプルで新しい物
- CFS
- Completely Fair Scheduler
- cgroups
- プロセスのグループに使用や計測の制限をかける
- latencytop
- OSのレイテンシを観測するツール
- Tracepoints
- カーネルに論理的に実装された静的なトレースポイント
- トレースに関するツールは次の章で紹介される
- perf
- Linux Performance Events(perf)はパフォーマンス監視のためのツール一式
- これはCPUパフォーマンスカウンタのプロファイリングや、静的・動的なトレーシングも含む
- Transparent huge pages
- 巨大なメモリページを簡単に扱うためのフレームワーク
- Uprobes
- ユーザレベルのソフトウェアを他のツール(perf, SystemTapなど)を使って動的にトレーシングする機構
- KVM
epollとKVMはSolarisベースのシステムから持ってこられたり、再実装されたりしている。 Linuxも大量のデバイスドライバへの対応など間接的に他のOSに貢献している。
3.3.4 Differences
どちらのOSもUnixをベースにしているとはいえ、さまざまな点で異なっており、簡単にそれをまとめることは難しい。
Linuxベースシステムの利点はその多くが固有のカーネルやOSから来ておらず、アプリケーションパッケージやデバイスドライバのサポートによってできていて、かつ大きなコミュニティがあり、オープンソースであることである。
大抵のSolarisベースカーネルもオープンソースだが、(Oracle Solarisは現在違う)それらは同じ拡張ドライバーサポートがない。
Solarisベースシステムはエンタープライズ向けのファイルシステム用にZFSを提供している。 これはLinuxにも移植されているが、Solarisのほうが充実しているといえる。 一方で、観測の機能を拡張するトレーシングツールは様々な新しいツールが出ている。
Solarisベースシステムはデフォルトでクラッシュダンプを取得することができるので、システムがクラッシュした際の分析が最初の設定でできる。 これらの主要な違いの他に非常にたくさんの細かい違いが特に最適化の点で存在する。 これらの違いを知るには、意図する負荷をかけて自身で差を見るのが良いだろう。
細かい違いの例として、POSIXのfadvise()コールがある。 これは現在Linuxでは実装されているが、Solarisでは無視されている。 fadvise()はアプリケーションからファイルディスクリプタ関連のデータがキャッシュされているかの情報を取得できるので、Linuxカーネルをより効果的に使える。
以下(略)はMySQLデータベースでの使用例である。
こういった細かい違いは、すぐに変化するので、Solarisベースのシステムでもこの本を読んでいる間にも対応がなされているだろう。 このように細かい違いはあるものの、一番大きな違いはパフォーマンス監視ツールで、特に動的なトレーシングだろう。 もしプロダクション環境でこれのサポートがあれば、あなたは10倍有利になるだろう。10%程度の違いを早く見つけられることはそれほど重要ではない。
次の章では観測ツールをカバーしている。