OSが管理するファイルシステムとは?

ファイルシステムとは、
OSがディスク・メモリ・ネットワーク越しに別のデバイス機器にあるデータをみんなあたかも同じようにファイルやフォルダとして見せるシステムです。

例えば、Cドライブに新規作成したファイルはディスクに保存したように見えます。しかし実際にはディスクに保存しているとは限らないのです。

OSをシャットダウンせずに突然電源ケーブルを抜くとシステムが壊れる可能性があるといいます。
これはユーザーもしくはシステムが書き込んだデータが直接ディスクに保存されるわけではなく、メモリ上にあったりするからです。
ハードディスクは不揮発性の記憶媒体なので電源を突然抜いてもデータがロストすることは少ないです。しかしメモリは揮発性の記憶媒体なので突然電源を抜かれるとデータは全てロストしてしまいます。
大雑把に言えば、ファイルシステムはメモリとディスクでデータ整合性を取っていますので、突然メモリ部分がなくなれば次回OS起動した時にシステムが起動する保障はないということになります。
(仮想環境上での仮想マシンスナップショットは、ディスク・メモリを一時停止的に保存しますのでファイルシステムの整合性はほぼ取れているといえます)

ファイルを書くということ(write IO)

一般的なシステムの場合、以下のような流れになります。
  1. ユーザーがOSを操作し、新規ファイルを(ファイルシステム上に)作成します。
  2. ファイルシステムがメモリに書き込みます。
  3. しばらくし他の書き込みデータでメモリ上のファイルキャッシュが溢れてきたタイミングにストレージに書き込みます(ディスクアクセス開始)
  4. ストレージ上のメモリ(ディスク単体のメモリ、RAIDコントローラのメモリや、外部ストレージ搭載のメモリ)に書き込み、OSにストレージ書き込み処理が完了したことを返します。
    (※ストレージの書き込みパフォーマンス性能を向上させるWrite Backという方式)
  5. OS(ファイルシステム)がデータをストレージ上に書き終えたと認識します(ディスクio終了)
Write Back(ライトバック)という処理はストレージの書き込み性能を上げますが、ストレージ上揮発性メモリに書き込みますのでバッテリーの搭載が不可欠となります。ストレージ上メモリもファイルキャッシュで溢れてきたタイミングに本当にディスクに書き込みに行きます。(OSとディスクは非同期)。

通常のWrite Back(ライトバック)という処理と異なった処理方式 Write through(ライトスルー)という方式もあります(RAIDアレイや外部ストレージ上のストレージコントローラの設定の話し)。
Write through(ライトスルー)では、ストレージ上のメモリに書き込んだことでは書き込み完了とせずに、本当のディスクに書き込んだ事をもってOSに書き込み処理完了を返す(ディスクio終了)方式になります。
Write Backのように書き込みパフォーマンスは落ちますが、ディスクに正確に書き込んでいるという保障がつきます(OSとディスクが同期)。
ストレージにバッテリーさえ搭載していれば問題ないので、あまりこの方式を選択するメリットは少ないでしょう。

ファイルを読むということ(Read IO)

一般的なシステムの場合、以下のような流れになります。
  1. ユーザーがOSを操作し、既存ファイルを(ファイルシステム上から)呼び出します
  2. ファイルシステム上に最近使われたファイルキャッシュとして運良く対象ファイルが存在すればメモリから呼び出し読み込み完了となります。
  3. メモリにない場合は、ストレージを探しに行きます。
    ストレージ上のキャッシュメモリにファイルが存在すればOSへデータを返し読み込み完了となります。
  4. ストレージ上のメモリにない場合はストレージコントローラがディスクからデータを読み込みます(プリフェッチのような先読み技術もあります)。
    OSへデータを返し読み込み完了となります。
ディスクへのアクセスが非常に遅いため、OSのメモリをファイルシステムは効率よくファイルキャッシュとして使用します。ストレージのコントローラもOS同様、ストレージ上に搭載されたメモリを効率よく使用し、なるべく遅いディスクにアクセスしないようなロジックになります。

書き込み処理(write io)と読み取り(read io)はどちらが多い?

一般的なサーバーシステムを考えます。
仮に1000人のクライアントが1つのサーバーを使い、一人あたり一秒間に50文字入力すると想定します。
1文字2byteなので、1秒あたり一人100byte。1000人のクライアントで100KB/s。
実際は文字(キャラクター)入力のサーバーは少ないですが、この100KB/sの100倍としても10MB/sの書き込みとなります。
10MB/s程度、多少のバーストを考慮してもOSのメモリ(ファイルキャッシュ)に載る程度の書き込みで、実際にディスクのwrite ioネックになる事は少ないのではないでしょうか。
一般的でないサーバーは、例えばバックアップサーバーなどは書き込み処理(write io)ネックというよりwrite io処理のみをこなすサーバーとなります。

書き込み処理(write io) に比べ、一般的なサーバーでは読み込み処理(read io)の方が多いと思われます。
例えば、ファイルサーバー上でファイル検索したり、データベースのようなテーブルデータを総なめして検索をしたり。

ストレージは特殊な書き込み処理が多いサーバーでない限り、より読み込み処理のパフォーマンスに重きを置いたほうが良いと考えます。

実現方法は
  • よりキャッシュ効率を高める工夫をする。
  • 性能のよい高価なストレージ・構成にコストをかける。
といった方法になります。


サーバーコンピュータ動作をスナックに例えてみる

サーバーコンピュータを動作させるユーザーがお客のあなた。
サーバーOS(プラスCPU)がスナックのママ。

スナック(OS)に訪れたお客(ユーザー)はママにお酒(データ)を注文します。
スナック店内にキープされているお酒(メモリ内データ)が基本出てきます。
なのでお酒(データ)の出は早いです。
しかし、スナック店内にキープされているお酒が切れてしまった場合、場合によってママが酒店にこっそり電話をし、お酒を配達してもらいます。
この場合の酒店がディスクにあたります。
非常にお酒(データ)の出が遅いです。
しかし、ママ(OS)はもしかしたら酒店に注文したお酒をあたかもスナックにあったかのように見せるかもしれません。
これがファイルシステムです。

メモリとディスクの速さの性能差はこの例えに似ていると思います。

サブページ リスト


更新日:2010/01/12
Comments