【読書】マスタリングTCP/IP

ループを検出するための技術

ブリッジでネットワーク接続するとき、ループを作るとフレームが次々コピーされて永久に増え続けてメルトダウンすることがある。

  • スパニングツリー

1〜10秒間隔でBPDU(Bridge Protocol Data Unit)と呼ばれるパケットを交換し、

使用するポートと使用しないポートを決めループを消すように制御する。

  • ソースルーティング

送信先コンピュータがどのブリッジを経由してフレームを流すか決定する。

フレームのRIF(Rooting Information Field)に書き込み、ブリッジがその除法を元に配送処理を行う。

PPP(Point to point protocol)

1対1でPCを接続するデータリンクプロトコル。データ通信を開始する前にPPPレベルでコネクションを確立する。認証や圧縮、暗号化などの設定を行う。

  • LPC

コネクションの確立や切断、パケット長、認証プロトコルの設定、通信品質の監視を行うかの設定を行う。

  • NCP

上位層に依存する。上位層がIPのときのNCPがIPCPである。IPアドレスの設定やヘッダを圧縮するかなどの設定を行う。

認証方式ではPAPとCHAPの二つがある。

  • PAP

コネクション確立時に一度だけIDとパスワードのやりとりを行う。平文で行われるため登頂の可能性がある。

  • CHAP

毎回パスワードが変更されるOTP(Once Time Password)を使用して盗聴を防ぐ。

通信中を定期的に交換を行い、相手が変わっていないかを確認する。

ルーティングプロトコル

スタティックルーティングとダイナミックルーティング
スタティックルーティングはルータやホストに固定的に経路情報を設定する。ダイナミックルーティングはルーティングプロトコルを操作させ自動的に経路情報を設定する。EGP(Exterior Gateway Protocol)とIGP(Interior Gateway Protocol)に分類される。EGPは地域ネットワークやプロバイダ間の経路制御が行われ、IGPによって組織内部の経路制御が行われる。EGPにはBGP(Border Gateway Protocol)が利用され、EGPにはRIP(Routing Information Protocol)、RIP2、OSPF(Open Shortest Path First)などが利用されている。
RIP
①経路制御情報をブロードキャストする。
30病周期で経路情報をブロードキャストし、6回(180秒)待ってもこない場合は接続が切れたと判断する。
②距離ベクトルにより経路を決定する。
距離(メトリック)の単位はホップ数(通過するルータの数)。できるだけ少ない数のルータを経由して目的のIPアドレスに到達できるように制御される。
③サブネットマスクを使用した場合の処理
サブネットマスクの情報は交換しないが、サブネットマスクを使用しているネットワークでも使用することができる。インターフェースに割り付けられているIPアドレスからクラスで判断したネットワークアドレスを求め、経路制御情報で流れてきたアドレスからクラスで判断したネットワークアドレスを求め、両者が同じネットワークアドレスとなった場合には、インターフェースに付けられているネットワークアドレスの長さと同じと見なす。異なる場合はそのIPアドレスをクラスで判断したネットワークドレスとして扱う。クラスで判断して異なるネットワークアドレスがある場合、ネットワークアドレス長が異なるネットワークを作るときは注意が必要。
④経路が変更されるときの処理
過去にルータに伝えた情報をネットワークが切断された後にも逆に教えられることで経路情報が無限に増える無限カウントが起きる。この問題を解決するために距離16を通信不能とし、さらに経路を教えたインターフェースには教えられた経路情報を流さないストリップホライズンと呼ばれる処理がなされる。
RIP2
RIPが改良されたもの。主な違いはマルチキャストを使用し、トラフィックの負荷を軽減する点、サブネットマスクの情報も組み込みサブネットマスク長の異なるネットワークにも対応している点である。
###OSPF
ルータがネットワーク全体の接続状態を理解して経路制御表を作成するリンク状態型のルーティングプロトコルのためループのあるネットワークでも安定した経路制御が可能。サブネットマスクに対応することで可変長サブネットで構成されたネットワークの経路制御が可能。エリアの概念(論理的な領域)を導入し不必要なプロトコルのやり取りを減少させる。OSPFでは各リンクに重みをつけることが可能であり、このコストが最小になるように経路制御される。OSPFでは役割ごとに5つのパケットを用意している。
・HELLO:隣接ルータの確認、指名ルータの決定。10秒に1回送信され接続が切れたと判断したらリンク状態更新パケットを送信する。
・データベース記述:データベースの要約情報(各ルータの経路制御情報同期用)
・リンク状態要求:データベースのダウンロード要求(要約情報が異なっていた場合)
・リンク状態更新:データベースの更新情報
・リンク状態確認応答:リンク状態更新の確認応答(更新情報を受けたら返す)
リンクコストに基づいてルートを選択する場合、ルータの性能やハードウェアの信頼性は考慮されなおので管理者によるコスト割り当てが必要となる。

アプリケーションプロトコル

遠隔ログイン

TELNET
ルータや高機能スイッチなどの設定を行うときに使用
行モード:改行キーが入力されるたびに1行分のデータをまとめて送る。
透過モード:入力された1文字ごとにサーバに送信する。

SSH
暗号化された遠隔ログインシステム。
より強固な認証機能を利用可能。
ファイルの転送が可能。
ポートフォワード機能(特定のp−と番号に届けられたメッセージを特定のIPアドレス、ポート番号に転送する仕組み)を利用可能。

FTP
制御用(21番)、転送用の2つのポートが利用される。
制御用コネクション上でPUT、GET、LISTといったコマンドが実行されるたびにデータ転送用のコネクションが確立される。

【読書】絵で見てわかるSQL Serverの内部構造

第1章 SQL ServerによるCPUリソースの使用

SQLOSスケジューラ
WINDOWSスケジューラにすべてのスレッドの管理を全て任せると、
待機中のSQL ServerにCPUリソースが割り当てられることがあり効率が下がる。
(ロック獲得待ちのスレッド、子スレッドの処理を待っている親スレッドなど)

Windowsスケジューラの配下にありながら、効率的にCPUリソースを使用する仕組みがSQLOSスケジューラ
SQL Server起動時にCPU数(コア数)と等しい数のスケジューラが作成される。
スケジューラがワーカの管理を行う。

ワーカ:
クライアントからのクエリは最終的に一つ以上のワーカに関連付けられて処理される。

ワーカスレッドプール:
各スケジューラで使用可能なワーカ数を管理する。
ワーカの最大数は「max worker threads」の設定値に依存する。
デフォルトで255個。
ワーカ使用要求があると、最大数に達していない場合は新たに作成され、
上限に達している場合はランナブルキューに追加され待機状態となる。

ランナブルキュー:
各スケジューラは一つのランナブルキューを持っている。
2つ以上のワーカが実行可能状態だった場合キューに追加され使用可能になるのを待つ。

ワークリクエストキュー:
ワーカ数が不足した時このリストに追加され、使用可能になるのを待つ。
ワーカ不足の一般的な要因はブロッキングや過度の並列処理。

I/Oリクエストリスト:
I/Oリクエストを要求したワーカは完了するまでこのリストに追加される。

ウェイターリスト:
ワーカ処理実行時に必要となるSQL Server内のリソースを確保できない場合にワーカはこのリストに追加される。
ロックやラッチが起きた時。ラッチとはページやアロケーションなどの物理的な単位に対して行われる。

第2章 SQL Serverが実行するI/O動作

管理するデータベースの実態
データファイル(.mdl, .ndf)とログファイル(.ldf)が存在する。

データファイル:
ユーザが参照・挿入・更新・削除を行うデータ本体。
8KBのブロックに分割されていて、ブロックは「ページ」という論理的な単位で管理されている。

ログファイル:
実行した更新内容を記録している。
先行書き込みログとなっており、トランザクションとデータの整合性を保つために
先にログに書き込み、その後処理を行う。必ず時系列順となる。

データベースへのアクセスパターン
・オンライントランザクジョンシステムの場合(OLTP)
多数のクライアントがアクセスを行い、それぞれが必要とする小規模データの操作を行う。
類似する小規模なトランザくジョンが多数存在する。
・意思決定支援システム(DSS)
データベースに蓄積されたデータを、経営戦略のためなどに様々な視点からの分析に使用する。
多くの場合結果としてデータファイルへ順次アクセスする傾向が強い。

先行読み取り(Read-Ahead)
実際の読み込み要求が発生する前にバッファキャッシュにデータを読み込むこと。
実際に読み込み要求が発生した際にI/Oのオーバーヘッドを緩和する。

チェックポイント(Check point)
以下、データ更新のフロー
先行書き込みログ操作⇨バッファキャッシュ上のデータが更新(論理書き込み)⇨物理ディスクに書き込み(物理書き込み)
まだ物理書き込みが行われていないバッファキャッシュ上のデータをダーティページと呼ぶ。
チェックポイントプロセスと呼ばれる内部コンポーネントが定期的にスキャンを行い、
ダーティページを物理ディスクに書き込む。

集中書き込み(Eager Write)
大量のデータを書き込む場合、大量のログ書き込みが発生し、
この処理がボトルネックとなりスループットを低下させることがある。
その場合に備えて一括操作と呼ばれる選択肢が存在する。
個別の更新データに対してログを書き込まなくなり、最小限のデータだけログに記録される。
一括操作が実行されるとバッファキャッシュ上に大量のダーティページが発生する。
このダーティページを物理書き込みする操作が集中書き込み。

レイジー書き込み(Lazy Write)
将来的なデータの読み込みに備えて、参照された頻度が最も低いバッファキャッシュ上のページを初期化する。
そのページがダーティページだった場合は物理ディスクへ書き込みを行う。

第3,4章 SQL Serverのメモリ管理

仮想アドレス空間の状態
・Committed
仮想アドレス空間で実際に使用されている領域。
この領域に対してはOSが物理メモリの領域を割り当てている。
・Reserved
後の使用に備えて仮想アドレス空間が予約済みとなっている状態のこと。
この状態では物理メモリは一切与えられていない。
SQLサーバで設定されたメモリ使用量は起動時に必要な分だけcommittedされ残りはReserved状態となる。
・Free
文字通り自由な割り当てが可能。
物理メモリ以上のサイズをReserved, Committedの状態にせず残りはFreeとなる。

ページング
SQL Serverの使用するメモリをページファイルへ書き込むことを抑制するために
「Lock Page in Memory」特権を
SQL Serverの起動アカウントに追加すればページング対象になることを避けることができる。

メモリ使用量
デフォルト設定の場合「物理メモリのサイズ-5MB」まで拡張される。
上限を設定する場合以下のコマンドを実行する。
exec sp_configure ‘max server memory’, 1024 — 最大値をMB単位で設定する。
go
reconfigure

バッファキャッシュ領域
・データキャッシュ
バッファキャッシュの大部分を占める。
DBのデータページやインデックスページを読み込んでキャッシュするために使用される。
各データページが持つ固有の値を基にハッシュ値が生成され、ハッシュバケットと呼ばれるページへ格納される。

・プロシージャキャッシュ
クライアントが実行したクエリは最適な形で処理されるようにコンパイルされ、
クエリプランに変換される。
一度コンパイルされたクエリプランは同じクエリが再度実行された時に備えてプロシージャキャッシュに保存される。

MemToLeave領域
8KBよりも大きなメモリブロックを使用する場合MemToLeave領域が使用される。
・SQLCLR
・拡張ストアドプロシージャ
・スレッドスタック
解放タイミングは不要になったらすぐに解放される。

第10章SQL Serverとネットワーク

通信の際SNI(SQL Server Network Interface)と呼ばれる層がTCP/IPや名前付きパイプといったプロトコルを抽象化。

上位層ではプロトコル間の差異を意識する必要がない。

複数のプロトコルの優先順位を設定して何らかのトラブルで特定のプロトコルで通信できなくても別のプロトコルで接続を試行する。

接続時にクライアント側で特定のプロトコルを指定することも可能だが、何らかの原因でそのプロトコルを使用して通信できない時に

問題が解決するまで通信ができなくなる。

・TCP/IPの場合

sqlcmd -E -Stcp : SQL1¥Instance1

デフォルトインスタンス

明示的に変更されない限り、常にポート番号1433を使用してクライアントからの接続を待ち受けている。

名前付きインスタンス

クライアントから接続要求を待つポートが複数。動的に決定される。

インスタンス起動時に未使用のポートを確認して自身に割り当てる。

クライアントが接続先のインスタンスを発見するのが容易ではない。

クライアントは接続時にSQL Server Browserサービスに必要な情報を問い合わせて接続に行く。

2度目以降はキャッシュされた情報を利用。

 

【覚書】メンテナンス・トラシュ用コマンド

・CPU状態確認
dbcc sqlperf(‘umsstats’)

・ディスクIO確認
dbcc sqlperf(‘waitstats’)
select * from sys.dm_os_wait_stats

・メモリ使用量確認
dbcc memorystatus go

・メモリ最大使用量設定
exec sp_configure ‘max server memory’, 1024 — 最大値をMB単位で設定する。
go
reconfigure

・キャッシュクリアコマンド
dbcc DROPCLEANBUFFERS — データキャッシュの削除
dbcc FREEPROCCACHE — プロシージャキャッシュの削除

・セッション確認
select * from sys.dm_exec_session

・コネクション確認
select * from sys.dm_exec_connections