【書評】「大規模サービス技術入門」

エンタープライズシステムを扱うSE, SIerにはぜひとも読んでもらいたい書籍。

数年ぶりに読み返して、良い本だなーと改めて思ったので紹介しておきます。

[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)

[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)

 

 

内容は、負荷分散にまつわるOSの動作原理、DBの分散方法、大規模データを処理するための基礎知識、実践的なアルゴリズムをシステムに組み込む実装、検索エンジンの仕組み、システム全体を見渡すためのインフラ設計の知識・・・と多岐にわたる。

はてなの夏のインターンで講義した内容を書籍にまとめた本ですが、この内容をきちんと押さえている方はそう多くはないはず。とはいえ、システムを扱うならこの内容くらいは一般常識として知っておいてもらわないとぶっちゃけやばいです。

 

全部重要ですが、特に、大切なポイントをさらっておきます。詳細を知りたい方は本書を購入してみてください。(私はいまでもこの本をたまに眺めるので買って損はしないはずです)

 

(できるかぎりくだけた感じで書いておきます。)

(1)OSの動作原理

①OSのキャッシュ

ディスクIOは低速(メモリはディスクの10^5倍以上高速)。なので、できる限りメモリで計算したい。じゃあどうするの?→「キャッシュ」。キャッシュってどんな仕組みなの?→一般的には「LRU」という仕組み。LRUとは、一番古いものを廃棄して、一番新しいものを残す。つまり、最近読んだものはキャッシュに残って、昔読んだものが破棄されていく。

補足:

Linuxは、メモリが空いていれば全部キャッシュする。

なので、例えば、sarコマンドなどで、キャッシュされている容量を確認すると、「99%」とか表示されて、「やばい、メモリが全く足りねーじゃねーか!」とか慌てることはないです。だって、OSがメモリの空いているところにどんどんキャッシュしているだけですから。

 

仮想メモリ機構

仮想メモリ機構…聞いたことはあるけどいまいちピンとこないという方も少なくないのではないでしょうか。仮想メモリ機構とは、「論理なリニアアドレスを物理的なアドレスへ変換する」という仕組みです。

なのでそんなことするの?って思うかもしれませんが、一番の目的は、「OSが物理ハードウェアを抽象化したい」からです。

プロセスというのは、メモリのどこを使っているのかということを気にせずに、必ずここから始めるという形(絶対的な場所)で定義したいからです。(その方が扱いやすいから)

実際に、UNIXの共有ライブラリは、プロセス内のある決まった番地に割り当てられるようになっている。なので、OSはメモリを直接プロセスに渡すのではなく、いったんカーネルの中でメモリの仕組みを抽象化してます。(つまり、仮想化)。これが「仮想メモリ機構」です。

 

(2)スケーラビリティ

単にサーバを増やすだけじゃダメ。

<主なポイント>

①CPU負荷のスケーリングは簡単

 ・同じ構成のサーバを増やす(Web, APサーバなどが該当 )

②IO負荷のスケーリングは難しい

 ・同期を取るのが難しいから。

  (例えば、DBを増やした場合、増やした台数分のDBをすべて同期とらないとダメだもんね。)

 

(3)ボトルネックの見極め方

ロードアベレージを確認(topコマンドなどで確認)

 (ロードアベレージ:システム全体の負荷状況を示す指標)

 ・ロードアベレージが高い→CPU, IOのどっちが原因か調査

 ・ロードアベレージが低い→ソフトウェア設定や、NWの原因を疑う。

②CPU, IOのどっちがボトルネックになっているか確認

 ・sarやvmstatコマンドで確認

  →CPU負荷が原因の場合:「サーバの増設やプログラム改修で対応」

  →IO負荷が原因の場合:「メモリの増設やプログラム改修で対応」

 

本書を読んでもっと詳細を知りたい方は下記の本もなかなか良いです。

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)