cache-distribution

大きなデータを効率良く扱うための手法 OSのキャッシュと分散

前回は、メモリとディスク、Webアプリと負荷といった大規模データ処理入門についてまとめた。ここでは、大きなデータを効率良く扱うための手法であるOSのキャッシュと分散について解説する。

1 OSのキャッシュ機構

OSのキャッシュ機構を知ってアプリケーションを書く

キャッシュ機構はディスクのデータに速くアクセスできるようなしくみのこと。ディスクとメモリの速度差は10の5乗倍以上ある。

 

仮想メモリ機構

仮想メモリ機構は論理的なリニアアドレスを物理的な物理アドレスへ変換するという働きをしている。この仕組みがある理由は、OSが物理的なハードウェアを抽象化したいからである。また、仮想メモリ機構はプロセスによるメモリの扱いやすさなどの利点を提供しており、OSがカーネルの中でメモリを抽象化している点が重要である。メモリ(OSが物理メモリを確保/管理する単位)もページという4KB程度のブロックで確保している。

 

Linuxのページキャッシュのしくみ

Linuxのページキャッシュとは、ディスクの内容をいったんメモリに読み込み(ページ作成)、作成したページは破棄せずに残すというものである。その効果は例外を除きすべてのI/Oに透過的に作用する。そのためOSは再起動せずにずっと動かしている方が速くなるのである。

 

VFS

VFS(Virtual File System、仮想ファイルシステム)とは、ファイルシステムの上にある抽象化レイヤであり、ファイルシステムのインタフェースの統一をする役割を持つ。このVFSがページキャッシュのしくみを持っている。

 

Linuxはページ単位でディスクをキャッシュ

ページとは仮想メモリの最小単位であり、ファイルの一部分をさす。キャッシュにはLRU(Least Recently Used)という一番古いものを廃棄して一番新しいものを残すというしくみがあるため、DBをずっと動かしていれば最適化されていくのである。なお、Linuxはファイルをiノード番号と、そのファイルのどこから始まるかというオフセットの2つの値をキーにキャッシュしている。

 

メモリが空いていればキャッシュ

Linuxはメモリが空いていれば全部キャッシュする。その制限はなく、sysstatというパッケージのsarというツール(sar -r)によって確認できる。

 

メモリを増やすことでI/O負荷軽減

メモリを増やすとキャッシュに使える容量が増えるため、ディスク読み出し回数が減ってI/O負荷を軽減することができる。

 

ページキャッシュは透過的に作用する

キャッシュは透過的に作用する。OS起動直後はカーネルがディスクをあまり読みにいかないためほとんどキャッシュが入っていないが、何かファイルをreadするとそれをキャッシュするというものである。

 

2 I/O負荷の軽減策

キャッシュを前提にしたI/O軽減策

  • データ規模よりも物理メモリが大きければすべてキャッシュできる
  • 経済的コストとのバランスを考慮:現状のコモディティは8GB〜16GB

 

複数サーバにスケールさせる

キャッシュしきれない規模になったならば複数サーバにスケールさせること。CPU負荷分散では単純に増やし、I/O分散では局所性を考慮する必要がある(後述)。

 

単に台数を増やしてもスケーラビリティの確保はできない

単純に台数を増やすだけではキャッシュできない割合はそのままのため、再度ボトルネックになってしまう。

 

3 局所性を活かす分散

局所性を考慮した分散とは

局所性を考慮した分散とは、アクセスパターンを考慮した分散のこと。アクセスパターンを考慮して振り分けることでキャッシュできない箇所がなくなり、メモリはディスクの10の6乗倍の速度の恩恵が得られる。

 

パーティショニング

パーティショニングは1つだったDBを複数のサーバに分割する手法のこと。例えばRDBMSのテーブル単位での分割、データの途中で分割する、用途ごとにシステムを「島」に分ける(後述)などがある。

 

リクエストパターンで「島」に分割

用途ごとにシステムを「島」に分ける方法は、はてなブックマークがよく使っている手法である。例えば通常のユーザ、画像など一部のAPIリクエスト、ボット(bot)の3つの島に分けるというものである。

 

ページキャッシュを考慮した運用の基本ルール

  • OS起動後すぐにサーバを投入しないこと(キャッシュがたまっていないため)
  • 性能評価はキャッシュが最適化されたときに実施する

 

最後に

メモリを増やすとキャッシュに使える容量が増えるため、ディスク読み出し回数が減ってI/O負荷を軽減することができる。また、分散は局所性を考慮して実施すること、データ規模に合わせて搭載メモリを調整することが重要である。

次回は、分散を考慮したMySQLの運用 DBのスケールアウト戦略について解説する。

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


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>