『絵で見てわかるOS/ストレージ/ネットワーク 新装版』は、ITインフラ技術の中でもそれぞれの関係性や仕組みをイメージしづらいOS、ストレージ、ネットワークについて、データベースの視点で解説した入門書です。
データベース管理者やアプリケーション開発者にとって、システムの効率化やトラブルシューティングは大きな課題です。そうした事態に対処するには、それぞれのインフラ技術の仕組みを理解していなければならず、ブラックボックスのままにしてはおけません。
本書ではそうしたインフラ技術を使う側であるデータベースにおいて、データがどのように入出力されるのか、その際のハードディスクやメモリの動作はどうなっているのかなど、大雑把に認識されがちな領域をより具体的なイメージで理解できるように解説しています。
また、特定の製品に依存しない原理原則を理解することが重要です。本書ではなるべく一般論として説明し、APPENDIXの項目でOracleデータベースがOS、ストレージ、ネットワークをどのように使っているかを紹介しました。今回の新装版発売にあたっては、最新のクラウドや仮想化についても追記しています。
特に仕事を始めて数年になる若手エンジニアに読んでほしい本書。自身が手掛けているシステムをより深く理解する一助となれば幸いです。
目次
■第1部 OS――プロセス/メモリの制御からパフォーマンス情報の見方まで
第1章 DBサーバーにおけるOSの役割
1.1 OSとDBMSの関係――第1部で学ぶこと
1.2 アプリケーションやDBMSの状態を読み取ってみよう
1.2.1 OSの稼働状況のデータから知るアプリケーションやDBMSの状態
1.3 OSで処理が実行される仕組みと制御方法
1.3.1 プロセスとスレッドは実行の単位
1.3.2 プロセスが生成されてから処理が実行されるまで
1.3.3 CPU使用率は何%までならOK?
1.4 CPU技術の進化とアプリケーションやDBMSとの関係を探る
1.4.1 仮想化技術とそのメリット/デメリット
1.4.2 OSが行なうスケジューリングって何?
1.4.3 優先度はコントロールすべき?
1.4.4 CPU使用率が高い場合にアプリケーションやDB側で何ができる?
1.4.5 アプリケーションやDBサーバーの性能はマルチコア化で向上するか?
1.5 今後CPUはどうなるのか?
1.6 まとめ
第2章 システムの動きがよくわかる超メモリ入門
2.1 メモリの仕組み
2.1.1 スタックは「過去を積んでいく」
2.1.2 プロセス間でデータを共有するための共有メモリ
2.1.3 共有メモリの注意点
2.2 DBMSのメモリの構造(一般論)
2.3 32ビットと64 ビットでは扱えるサイズが変わる
2.4 仮想メモリと物理メモリの関係
2.5 スワップとページングは要注意
2.5.1 「恐怖の悪循環」が発生することもある
2.5.2 キャッシュの本来の目的を考えよう
2.5.3 ページング情報の見方
2.5.4 スワップ領域を増やしてもかまわない?
2.6 I/O性能にとって重要なファイルキャッシュとは?
2.6.1 書き込みとファイルキャッシュ
2.6.2 いくつも存在するキャッシュの意味を整理しよう
2.7 ページの割り当ての仕組みとラージページ
2.8 メモリ情報の見方は難しい、でも基本はこう考える
2.8.1 OSレベルのメモリ情報の見方
2.8.2 サーバーにおける設定のコツ
2.8.3 DBサーバーのメモリの設定はどうするか?
2.8.4 DBMS側の設定はどうするか?
2.9 まとめ
第3章 より深く理解するための上級者向けOS内部講座
3.1 システムコールはOSとの窓口
3.1.1 システムコールを確認する方法
3.2 OSはI/Oをどう処理するのか?
3.2.1 同期I/Oと非同期I/O
3.3 スタックでプロセスやスレッドの処理内容を推測
3.4 「セマフォ」とは?
3.4.1 セマフォの確認と設定方法
3.5 OSにもロックがある
3.5.1 アプリケーションやDBMSに悪影響を与えることもあるOSのロック
3.6 時間の変更は慎重に
3.7 OSの統計情報が記録されるタイミング
3.8 プロセスファイルシステムを知る
3.8.1 procの中を見てみよう
3.9 プロセスに通知や命令を行なう「シグナル」
3.10 クラスタソフトとOSの密接な関係
3.11 ハードウェアからOSへの通知を行なう「割り込み」
3.12 DBサーバーの定常監視で取得すべきOS情報とは?
3.13 OSの性能情報を確認するときによく使うコマンド
3.14 まとめ
◇OS内部を勉強するのにお勧めの参考資料
■第2部 ストレージ――DBMSから見たストレージ技術の基礎と活用
第4章 アーキテクチャから学ぶストレージの基本と使い方
4.1 ディスクのアーキテクチャ
4.1.1 SSD
4.2 ストレージのインターフェイス
4.2.1 PCでは最大のシェアを持つATA
4.2.2 サーバー全般に適したSCSI
4.2.3 iSCSI
4.2.4 disconnectとreconnect
4.2.5 大規模ストレージに対応するFC
4.2.6 FCoE
4.2.7 HBA
4.3 SANとNASはどこがどう違うのか?
4.3.1 SANとNASの物理構成の違い
4.3.2 SANとNASのファイルシステムの位置
4.3.3 SANとNASの上位プロトコル
4.4 複数のディスクを組み合わせて信頼性を高めるRAID
4.4.1 RAID 0
4.4.2 RAID 1
4.4.3 RAID 5
4.4.4 RAID 6
4.4.5 RAID 1+0
4.4.6 RAIDの性能
4.5 物理的な複雑さを隠蔽するストレージの仮想化
4.5.1 シンプロビジョニング
4.6 ストレージにはどんな障害があるのか?
4.7 同期I/Oと非同期I/O
4.8 書き込みI/Oと同期書き込み(書き込みの保証)
4.9 ライトキャッシュが効果的なアプリケーションとは?
4.10 ファイルシステム
4.10.1 ファイルシステムの仕組み
4.10.2 ファイルシステムの保全性
4.10.3 mount
4.10.4 VFS
4.10.5 VHD
4.10.6 ボリュームマネージャー
4.10.7 rawボリューム
4.11 アプリケーションやRDBMSから見たファイルキャッシュ
4.12 RDBMSのI/O周りのアーキテクチャ
4.12.1 チェックポイント
4.12.2 グループコミット
4.12.3 RDBMSにおけるI/Oの実装
4.13 仮想化基盤やクラウドにおけるストレージ構成
4.13.1 仮想化基盤のストレージ
4.13.2 クラウドでのストレージ
4.13.3 分散するストレージを1つの巨大なかたまりにしたオブジェクトストレージ
4.14 これからのストレージはどうなっていくのか?
4.15 そのほかの注目すべき機能
4.15.1 セクション先読み
4.15.2 コマンドキューイング
4.16 ストレージとOSの関係図
4.17 まとめ
第5章 ディスクを考慮した設計とパフォーマンス分析
5.1 キャッシュの存在
5.2 スループット(I/O数)重視で考える
5.3 ディスクのI/Oネックを避ける設計
5.3.1 変更済みデータの書き込み
5.3.2 キャッシュの効果がない場合
5.4 表とインデックスの物理ディスクは分けるべきか?
5.5 ディスクの設計方針
5.6 DBシステムの耐障害性について
5.6.1 バックアップの仕組みの設計
5.7 ディスクを含めたシステムのパフォーマンスについて
5.7.1 サービスタイムとレスポンスタイムと使用率
5.7.2 ストレージの仮想化とサービスタイムや使用率の考え方
5.7.3 ページングによるI/O待ち
5.7.4 1つのI/Oだけが遅い場合は?
5.7.5 同時I/O数が多いときの見た目の挙動には要注意
5.8 ストレージを利用する側でしか実施できない性能分析の方法
5.9 まとめ
◆第3部 ネットワーク――利用する側が知っておくべき通信の知識
第6章 ネットワーク基礎の基礎――通信の仕組みと待ち行列
6.1 ネットワークの理解に必要な基礎知識
6.2 パケットの受け渡し
6.2.1 ボールという考え方
6.2.2 受け取ったことを通知する
6.2.3 ハブでケーブルをつなぐ
6.3 ネットワークの処理は階層構造
6.3.1 階層構造のメリット
6.3.2 TCP/IPの階層構造
6.4 通信相手にパケットを届けるには?
6.4.1 IPアドレス
6.4.2 ホスト名と名前解決
6.4.3 hostsファイル
6.4.4 MACアドレス
6.4.5 遠くのコンピュータとの通信
6.5 TCPレイヤーの役割
6.5.1 コネクション
6.5.2 ハンドシェーク
6.5.3 TCPのコネクションとDBMSの通信路の関係
6.5.4 タイムアウトと再送(リトライ)
6.6 通信の開始からソケットを作るまで
6.7 待ち行列
6.7.1 事務窓口に例えて考える待ち行列
6.7.2 なぜ待ち時間は右肩上がりのグラフになるのか?
6.7.3 WebシステムでDBMSのボトルネックが起きたらどうなるか?
6.7.4 エンジニアはどうすべきか?
6.8 ネットワークの仮想化
6.8.1 ネットワークを分割するVLAN
6.8.2 NICを束ねるチーミング
6.8.3 物理構成からネットワークを解放するSDN
6.8.4 仮想化技術との付き合い方
6.9 まとめ
第7章 システムの性能にも影響するネットワーク通信の仕組みと理論
7.1 WebシステムにおけるアプリケーションとDBMSとネットワーク
7.1.1 アプリケーションとDBMSの通信
7.1.2 アプリケーションからネットワークはどう見えるのか?
7.2 問題が起きたときの対処の仕組み
7.2.1 リトライ
7.2.2 再送タイムアウト
7.2.3 受信待ちタイムアウト
7.2.4 リトライやタイムアウトのチューニング
7.2.5 RSTパケット
7.2.6 VIPアドレス
7.3 帯域の制御
7.3.1 はじめチョロチョロ
7.3.2 ウィンドウサイズの変更
7.3.3 シーケンス番号
7.4 負荷分散
7.5 DBMSで効果があるACKのチューニング
7.6 接続処理とセキュリティ
7.6.1 接続処理
7.6.2 接続時のパスワード
7.6.3 通信の暗号化
7.6.4 ファイアウォール
7.7 まとめ
第8章 現場で生かせる性能問題解決とトラブルシューティングの王道
8.1 「接続できない」というトラブル
8.1.1 問題を切り分ける方法
8.2 性能問題の発生パターン
8.2.1 ボトルネックによる待ち行列
8.2.2 通信回数が多いだけというトラブル
8.2.3 相手の応答を待たざるをえない処理
8.2.4 純粋なネットワークのトラブル
8.3 トラブルを分析するには?
8.3.1 パケットキャプチャ
8.3.2 OSの統計情報
8.3.3 ネットワーク待ちはOSからどのように見えるか?
8.4 WANの性能
8.4.1 ディザスタリカバリとDBMS
8.5 ネットワーク障害のテストの仕方
8.6 まとめ
◇ネットワークを勉強するのにお勧めの参考資料
APPENDIX OracleデータベースはOS/ストレージ/ネットワークをこう使っている
A.1 OS関連のポイント
A.1.1 プロセスかスレッドか
A.1.2 優先度の調整
A.1.3 カーソルの注意点
A.1.4 リソースの使用制限
A.1.5 プロセスのメモリサイズと共有メモリ A.1.6 Oracleのキャッシュ
A.1.7 キャッシュサイズのチューニング
A.1.8 ラージページの使用
A.1.9 同期I/Oと非同期I/Oに関するデフォルト設定
A.1.10 セマフォ
A.2 ストレージ関連のポイント
A.2.1 ダイレクトI/O
A.2.2 I/Oによって遅れているSQLの調査
A.2.3 I/Oトラブルの分析
A.2.4 SSDを利用したI/Oネックの回避
A.3 ネットワーク関連のポイント
A.3.1 クライアントからのメッセージ待ち
A.3.2 DBMSのプロトコル階層
A.3.3 コネクションの待機ポート
A.3.4 接続のためだけのプロセスやスレッド
A.3.5 TCPのキープアライブ
A.3.6 Nagleアルゴリズム
A.3.7 接続のトラブルシューティング
A.3.8 大量の行の処理
A.3.9 Oracleのパケット分析機能