12 特殊なニーズのための入出力特性の調整

これまでの章で説明した基本的なファイルシステム構成手順は、ほとんどの状況で、最適かつバランスの取れたパフォーマンスを提供します。したがって、アプリケーションの動作方法についてまったく確信が持てない場合は、通常、このセクションに含まれる設定をデフォルト値のままにしておくことをお勧めします。ただし、アプリケーションの入出力要求が非常に一貫している、あるいは非常に大きい場合、ファイルシステムによる物理入出力の処理方法を調整または変更すると、全体のパフォーマンスが向上する可能性があります。

物理入出力がもっとも効率的なのは、読み取りや書き込みのすべてあるいはほとんどが、ディスクセクターの 512 バイト境界で開始および終了するような場合です。ディスク入出力はセクターサイズのチャンクでしか発生できません。したがって、入出力要求がセクター境界をまたがる場合、システムはアプリケーションデータを同じセクター内の無関係なデータから分離する追加の操作を実行する必要があります。プロセスの後半の処理が失敗しないようにする必要があります。最悪の場合、セクターをまたがる書き込みの際に、ファイルシステムはセクターを読み取り、メモリー内のセクターデータを変更したあと、セクターをディスクに書き戻す必要があります。そのような読み取り/変更/書き込み操作は、機械的なアクティビティーの増加だけを考慮しても、パフォーマンス上きわめてコストが高くなります。

しかし、ほとんどのアプリケーションは、セクター境界に適切に整列されていないさまざまなサイズのデータの読み取りや書き込みを行う必要があります。このため、Oracle HSM では多くのファイルシステムと同様に、デフォルトでページ入出力が使用されます。ファイルシステムがアプリケーションからの即時入出力要求を処理する際は、Solaris ページメモリー内のデータキャッシュに対して読み取りや書き込みを行います。ファイルシステムが非同期でキャッシュを更新する際は、より効率的なサイズで、適切に整列された物理読み取り/書き込みを行います。ディスクからデータを読み取るたびに、次の読み取りを予測して同じ操作内で対応するデータをキャッシュにロードしておくことにより、物理入出力を最大限に活用できます。したがって、ほとんどの入出力要求は、追加の物理ディスクアクティビティーなしに、仮想メモリーページ内にキャッシュされたデータを使用して対応されます。ページ入出力ではメモリーが使用され、システム CPU にもある程度の負荷がかかりますが、そのコストはほとんどの場合、物理入出力の効率アップによって十分に相殺されます。

ただし、ある場合には、その利点によってもページ入出力に関連する追加のオーバーヘッドが相殺されないことがあります。常に適切に整列された入出力を常に実行するアプリケーションや、そのように調整可能なアプリケーションでは、ページキャッシュの利点はありません。きわめて大きな入出力を実行するアプリケーションでも、整列されていないセクターは最初と最後だけであり、入出力が大きすぎるとキャッシュに収まらないことがあるため、ページキャッシュの利点がほとんどない場合があります。最後に、テレメトリデータ、監視ビデオ、またはその他の種類のリアルタイム情報をストリーミングするアプリケーションでは、書き込みが即時に非揮発性ストレージに収容されない場合、回復不可能なデータが失われる危険性があります。このような場合は、直接入出力を使用したほうが良い可能性があります。直接入出力が指定された場合、ファイルシステムはアプリケーションのメモリーとディスクデバイスとの間でデータを直接転送し、ページキャッシュをバイパスします。

Oracle HSM では、入出力キャッシュ動作の選択や調整についてユーザーにさまざまな選択肢を用意しています。アプリケーションの入出力特性を理解し、予測したファイルシステム入出力に合わせた Solaris システムおよびドライバパラメータの調整で説明したタスクを完了したら、次のように方法を選択してください。

大規模データ転送のためのページ入出力の最適化

ページ入出力は、アプリケーションやハードウェアの特性と一致するように調整できます。キャッシュへの読み取りやキャッシュからの書き込みのサイズは、アプリケーションが転送する平均データ量、または物理ストレージが転送可能な最大データ量のいずれかの大きいほうを転送できる大きさにする必要があります。このいずれかに合わせてページキャッシュ動作を調整できなかった場合、キャッシュ使用率が低下し、アプリケーションの入出力要求に対して必要な物理入出力が増加し、システム全体のパフォーマンスが低下します。

たとえば、単一のディスクボリューム上に実装された md データデバイスと、3+1 RAID 5 ボリュームグループ上に実装された md デバイスを比較することを検討します。アプリケーションからの各書き込み要求を処理する際に、マルチディスクデバイスで可能な追加の帯域幅を無視し、単一の 64K バイトディスク割り当て単位 (DAU)をキャッシュから後者のデバイスに書き込む場合、RAID デバイスは、その入出力を 3 つの小さな、効率の低い 21K/22K バイトのフラグメントに分割してから、RAID グループ内の 3 つのデータディスクにデータを書き出す必要があります。したがって、アプリケーションからの 64K バイトの入出力要求の処理に対して、この構成では、ページキャッシュによって複数の要求を結合して 3-DAU (192K バイト) の単一の入出力にする場合より必要な作業が著しく増加します。アプリケーションがデバイス帯域幅の偶数倍 (192、384、または 576K バイト) で入出力要求を実行できれば、またはそのように調整可能であれば、物理入出力ごとにキャッシュまたは転送できるデータ量を増やせるため、オーバーヘッドがさらに減少し、結果的にパフォーマンスが向上します。

そのためには、アプリケーションの入出力要件を明確にし、ハードウェアの入出力特性を理解しておきます。その後、次の手順を実行します。

  1. ファイルシステムホストに root としてログインします。

    root@solaris:~# 
    
  2. オペレーティングシステムの /etc/vfstab ファイルをバックアップします。

    root@solaris:~# cp /etc/vfstab /etc/vfstab.backup
    root@solaris:~# 
    
  3. テキストエディタで /etc/vfstab ファイルを開き、調整が必要なファイルシステムの行を検索します。

    この例では、ファイルシステムの名前は qfsma です。

    root@solaris:~# vi /etc/vfstab
    #File
    #Device    Device   Mount     System  fsck  Mount    Mount
    #to Mount  to fsck  Point     Type    Pass  at Boot  Options
    #--------  -------  --------  ------  ----  -------  --------------------
    /devices   -        /devices  devfs   -     no       -
    ...
    qfsma      -        /qfsma    samfs   -     yes      ...
    
  4. ファイルシステムの「Mount Options」フィールドに、writebehind=n マウントオプションを追加します。ここで、n8K バイトの倍数です。マウントオプションを区切るにはコンマ (空白なし) を使用します。ファイルを保存して、エディタを閉じます。

    writebehind オプションは、ページキャッシュがディスクにフラッシュされるまでに、特定のファイルのどれだけの量がキャッシュの待ち行列に入れられるかを決定します。このパラメータの値の設定を大きくするとパフォーマンスが改善されますが、これは、キューが大きければ、多数の小さなアプリケーション書き込みが、少数の大きい、より効率的な物理入出力にまとめられるためです。このパラメータに設定する値が小さいほど、変更がすぐに非揮発性ストレージに書き込まれるため、データ保護が強化されます。

    デフォルト値は 512K バイト (64K バイトの DAU 8 個分) ですが、これは一般に、大きなブロックの順次入出力に適しています。しかしこの例の場合、ファミリセットには、ストライプ化ファイル割り当ての md ディスクデバイスが 2 つ含まれています。ストライプ幅は 64K バイト (1 DAU) であり、2 つの md デバイスに 128K バイトが書き込まれることになります。md デバイスは 3+1 RAID 5 グループです。したがって、3 つのデータスピンドルのそれぞれに少なくとも 128K バイトを書き込む必要があるため、合計で 768K バイト (96 グループがそれぞれ 8K バイト) 以上の書き込みが必要になります。

    #File
    #Device    Device   Mount     System  fsck  Mount    Mount
    #to Mount  to fsck  Point     Type    Pass  at Boot  Options
    #--------  -------  --------  ------  ----  -------  --------------------
    /devices   -        /devices  devfs   -     no       -
    ...
    qfsma      -        /qfsma    samfs   -     yes      ...,writebehind=768
    :wq
    root@solaris:~# 
    
  5. ファイルシステムの入出力パフォーマンスをテストし、必要に応じて writebehind 設定を調整します。

  6. テキストエディタで /etc/vfstab ファイルを再度開きます。ファイルシステムの「Mount Options」フィールドに、readahead=n マウントオプションを追加します。ここで、n は 8K バイトの倍数です。マウントオプションを区切るにはコンマ (空白なし) を使用します。ファイルを保存して、エディタを閉じます。

    readahead オプションは、単一の物理読み取り時にキャッシュ内に読み取られるデータの量を決定します。アプリケーションが順次読み取りを実行していると考えられる場合、ファイルシステムは、物理読み取りのたびに、次に必要になるデータブロックをキャッシュします。このとき、一連のアプリケーション読み取り要求はキャッシュメモリーから処理でき、複数のアプリケーション読み取り要求が単一の物理入出力要求にまとめられます。

    デフォルト値は 1024K バイト (64K バイトの DAU 16 個分) ですが、これは一般に、大きなブロックの順次入出力に適しています。データベースやそれに類似したアプリケーションが独自に readahead を実行する場合、競合を避けるために、Oracle HSM readahead0 に設定します。それ以外の場合、readahead は一般に、単一の物理入出力で転送可能な最大のデータ量をキャッシュできるよう設定する必要があります。readahead の設定が、アプリケーションから通常要求されるデータ量や各デバイスから供給可能なデータ量よりも小さい場合、アプリケーションの入出力要求に対応するために、必要以上に多くの物理入出力が要求されます。ただし、readahead の設定値が高すぎると、メモリーの消費量が増大し、システム全体のパフォーマンスが低下する可能性があります。この例では、readahead736K バイト (64K バイトの DAU 36 個分) に設定します。

    #File
    #Device    Device   Mount     System  fsck  Mount    Mount
    #to Mount  to fsck  Point     Type    Pass  at Boot  Options
    #--------  -------  --------  ------  ----  -------  --------------------
    /devices   -        /devices  devfs   -     no       -
    /proc      -        /proc     proc    -     no       -
    ...
    qfsma      -        /qfsma    samfs   -     yes      ...,readahead=736
    :wq
    root@solaris:~# 
    
  7. ファイルシステムの入出力パフォーマンスをテストし、必要に応じて readahead 設定を調整します。

    readahead パラメータのサイズを増やすと、ある時点までは大容量ファイル転送のパフォーマンスが向上します。そのため、readahead サイズをリセットしたあと、システムのパフォーマンスをテストします。次に転送速度がそれ以上上がらないと思うところまで readahead サイズを上向きに調整します。

ページ入出力と直接入出力の切り替えの有効化

ページ入出力と直接入出力を切り替えたほうがアプリケーションの入出力動作に適合する場合、これを切り替えられるように Oracle HSM ファイルシステムを構成できます。直接入出力の利点を引き出す読み取り/書き込みの特性として、セクター整列と最小サイズを指定し、切り替えをトリガーする適格の読み取り/書き込み個数を設定します。次のように進めます。

  1. ファイルシステムホストに root としてログインします。

    root@solaris:~# 
    
  2. オペレーティングシステムの /etc/vfstab ファイルをバックアップします。

    root@solaris:~# cp /etc/vfstab /etc/vfstab.backup
    root@solaris:~# 
    
  3. テキストエディタで /etc/vfstab ファイルを開き、構成するファイルシステムの行を検索します。

    この例では、ファイルシステムの名前は qfsma です。

    root@solaris:~# vi /etc/vfstab
    #File     Device                      Mount
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- ------ ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   stripe=1
    
  4. 512 バイトセクター境界に適切に整列された読み取り要求に対して直接入出力を開始するしきい値サイズを設定するには、ファイルシステムの「Mount Options」フィールドに dio_rd_form_min=n マウントオプションを追加します。ここで、n は K バイト数です。マウントオプションを区切るにはコンマ (空白なし) を使用します。

    デフォルトは dio_rd_form_min=256K バイトです。この例では、アプリケーションが 512K バイト以上の読み取りを要求するまで、適切に整列された読み取りが継続的に生成されないことがわかっています。したがって、適切に整列された直接読み取りのしきい値サイズを、512 に変更します。

    #File     Device                      Mount
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- ------ ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   stripe=1,dio_rd_form_min=512
    
  5. 512 バイトセクター境界に適切に整列された書き込み要求に対して直接入出力を開始するしきい値サイズを設定するには、ファイルシステムの「Mount Options」フィールドに dio_wr_form_min=n マウントオプションを追加します。ここで、n は K バイト数です。マウントオプションを区切るにはコンマ (空白なし) を使用します。

    デフォルトは dio_wr_form_min=256K バイトです。この例では、アプリケーションが 1M バイト以上の書き込みを要求するまで、適切に整列された書き込みが継続的に生成されないことがわかっています。したがって、適切に整列された直接書き込みのしきい値サイズを、1024K バイトに変更します。

    #File     Device                      Moun
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- ------ ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   ...,dio_wr_form_min=1024
    
  6. 512 バイトセクター境界に適切に整列されていない読み取り要求に対して直接入出力を開始するしきい値サイズを設定するには、ファイルシステムの「Mount Options」フィールドに dio_rd_ill_min=n マウントオプションを追加します。ここで、n は K バイト数です。マウントオプションを区切るにはコンマ (空白なし) を使用します。

    デフォルトは dio_rd_ill_min=0K バイトであり、整列されていない読み取りでは直接入出力は使用されません。この例では、アプリケーションが一般に小さなデータ単位に対しては、整列されていない読み取り要求を行うことがわかっています。このデータの大部分はあとで再度読み取られます。したがって、これらの読み取りにはページキャッシュが適していると考えられます。直接入出力に切り替えると、不要な物理入出力が増加し、パフォーマンスが低下します。したがって、ここではデフォルトを受け入れ、vfstab ファイルに変更を加えません。

    #File     Device                      Mount
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- ------ ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   ...,dio_wr_form_min=1024
    
  7. 512 バイトセクター境界に適切に整列されていない書き込み要求に対して直接入出力を開始するしきい値サイズを設定するには、ファイルシステムの「Mount Options」フィールドに dio_wr_ill_min=n マウントオプションを追加します。ここで、n は K バイト数です。マウントオプションを区切るにはコンマ (空白なし) を使用します。

    デフォルトは dio_wr_ill_min=0K バイトであり、整列されていない書き込みでは直接入出力は使用されません。整列されていない書き込みでは、システムがセクターの読み取り、変更、書き込みを行う必要があるため、特にパフォーマンス上で高コストになることがあります。ただしこの例では、アプリケーションがセクター境界に位置しない単一の大規模な書き込み要求を行う場合があることがわかっています。読み取り/書き込み/変更操作は、連続するセクターで構成される大規模ブロックの先頭と末尾に限定されるため、直接入出力のメリットがページ入出力のメリットよりも大きくなります。したがって、ここでは dio_wr_ill_min=2048K バイトに設定します。

    この例では、整列されていないデータの書き込みで直接入出力を使用するしきい値のデフォルトを、2048K バイトに変更します。

    #File     Device                      Mount
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- ------ ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   ...,dio_wr_ill_min=2048
    
  8. 読み取りで直接入出力を有効にするには、「Mount Options」フィールドに dio_rd_consec=n マウントオプションを追加します。ここで n は、直接入出力への切り替えをトリガーするため、前述の指定のサイズと整列の要件を満たす必要のある連続する入出力転送の回数を示します。直接入出力の利点を引き出すアプリケーション操作のための値を選択します。マウントオプションを区切るにはコンマ (空白なし) を使用します。

    デフォルトは dio_rd_consec=0 であり、入出力の切り替えは無効になっています。この例では、アプリケーションがいったん dio_rd_form_min に指定された最小サイズ (512K バイト) 以上の適切に整列された 3 つの連続する読み取りを要求すると、直接入出力の実行が有益になるまでその動作を続行することがわかっています。dio_rd_form_min に指定された最小サイズはデフォルト値の 0 であるため、直接入出力を有効にしても、整列されていない読み取り要求には影響しません。したがって、dio_rd_consec=3 と設定します。

    #File     Device                      Mount 
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- ------ ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   ...,dio_rd_consec=3
    
  9. 書き込みで直接入出力を有効にするには、「Mount Options」フィールドに dio_wr_consec=n マウントオプションを追加します。ここで n は、直接入出力への切り替えをトリガーするため、前述の指定のサイズと整列の要件を満たす必要のある連続する入出力転送の回数を示します。直接入出力の利点を引き出すアプリケーション操作のための値を選択します。マウントオプションを区切るにはコンマ (空白なし) を使用します。

    デフォルトは dio_wr_consec=0 であり、入出力の切り替えが無効です。この例では、アプリケーションがいったん dio_wr_form_min に指定された最小サイズ (1024K バイト) 以上の適切に整列された 2 つの連続する書き込みを要求すると、直接入出力の実行が有益になるまでその動作を続行することがわかっています。また、整列されていない連続する 2 つの書き込みが dio_wr_form_min (2048K バイト) を超える場合は、十分サイズが大きいため、整列されていなくても比較的問題にならないこともわかっています。したがって、dio_wr_consec=2 と設定します。

    #File     Device                      Mount 
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- ------ ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   ...,dio_wr_consec=2
    
  10. vfstab ファイルを保存して、エディタを閉じます。

    #File     Device                      Mount 
    #Device   to     Mount    System fsck at    Mount
    #to Mount fsck   Point    Type   Pass Boot  Options
    #-------- ------ -------- -----  ---- ----- -----------------------------
    /devices  -      /devices devfs  -    no    -
    /proc     -      /proc    proc   -    no    -
    ...
    qfsma     -      /qfsma   samfs  -    yes   ...,dio_wr_consec=2
    :wq
    root@solaris:~# 
    
  11. 変更されたファイルシステムをマウントします。

    root@solaris:~# mount /qfsms
    root@solaris:~# 
    

直接入出力を排他的に使用するためのファイルシステムの構成

アプリケーションの入出力特性から直接入出力の排他的な使用が必要とされる場合、forcedirectio マウントオプションを使用してファイルシステム全体をマウントできます (個々のファイルやディレクトリに直接入出力を指定する方法については、Oracle HSM setfa のマニュアルページを参照)。

直接入出力を排他的に使用するようにファイルシステムをマウントするには、次の手順を実行します。

  1. ファイルシステムホストに root としてログインします。

    root@solaris:~# 
    
  2. オペレーティングシステムの /etc/vfstab ファイルをバックアップします。

    root@solaris:~# cp /etc/vfstab /etc/vfstab.backup
    root@solaris:~# 
    
  3. テキストエディタで /etc/vfstab ファイルを開き、直接入出力を使用するファイルシステムの行を検索します。

    この例では、ファイルシステムの名前は qfsma です。

    root@solaris:~# vi /etc/vfstab
    #File
    #Device    Device   Mount     System  fsck  Mount    Mount
    #to Mount  to fsck  Point     Type    Pass  at Boot  Options
    #--------  -------  --------  ------  ----  -------  --------------------
    /devices   -        /devices  devfs   -     no       -
    /proc      -        /proc     proc    -     no       -
    ...
    qfsma      -        /qfsma    samfs   -     yes      stripe=1
    
  4. ファイルシステムの「Mount Options」フィールドに forcedirectio マウントオプションを追加します。マウントオプションを区切るにはコンマ (空白なし) を使用します。ファイルを保存して、エディタを閉じます。

    #File
    #Device    Device   Mount     System  fsck  Mount    Mount
    #to Mount  to fsck  Point     Type    Pass  at Boot  Options
    #--------  -------  --------  ------  ----  -------  --------------------
    /devices   -        /devices  devfs   -     no       -
    /proc      -        /proc     proc    -     no       -
    ...
    qfsma      -        /qfsma    samfs   -     yes      stripe=1,forcedirectio
    :wq
    root@solaris:~# 
    
  5. 変更されたファイルシステムをマウントします。

    root@solaris:~# mount /qfsms 
    root@solaris:~# 
    

ディレクトリ名参照キャッシュのサイズの増加

共有ファイルシステムのクライアントが同時に多数のファイルを開く場合、メタデータサーバー上の Oracle Solaris ディレクトリ名参照キャッシュ (DNLC) のデフォルトサイズが不十分であることが判明することがあります。メタデータサーバーはすべてのクライアントに代わってファイル名を検索するため、このような条件下ではファイルシステムのパフォーマンスが低下することがあります。

この種の作業負荷が予想される場合は、ディレクトリ名参照キャッシュサイズパラメータ ncsize の値をデフォルトサイズの 2 倍か 3 倍に変更します。手順については、Oracle Solaris Information Library にある『Oracle Solaris チューニング可能パラメータリファレンスマニュアル』を参照してください (「はじめに」の入手可能ドキュメントセクションを参照してください)。