ファイル同期のパフォーマンスのチューニング
ファイル同期化を拡張するには、幾つかの方法があります。
JFS ファイルの順次でない入出力は、次に示す一定の条件が成立するまでメモリーに累積されます。
- フリー・リストが minfree まで減少し、ページ置換が必要である。
- syncd デーモンが、定期的にスケジュールされた間隔でページをフラッシュする。
- sync コマンドが出される。
- ランダム遅延書き込みが、ランダム遅延書き込みのしきい値に達した後に、ダーティー・ページをフラッシュする。
上記のいずれかの条件が発生する前に多くのページが累積された場合は、syncd デーモンによってページがフラッシュされるときに、i ノード・ロックが取得され、すべてのダーティー・ページがディスクに書き出されるまで保持されます。 この間、そのファイルにアクセスしようとしているスレッドは、i ノード・ロックが使用不可であるためブロックされます。 fuser コマンドもファイルに対してブロックされます。これは、fuser では必要な情報を提供するために i ノード・ロックが必要であるからです。syncd デーモンは現在、ファイルのダーティー・ページをすべてフラッシュしますが、 一時に 1 ファイルであることを覚えておいてください。 大量のメモリーを搭載していて多数のページが変更されているシステムでは、 入出力のピークは、syncd デーモンがページをフラッシュするときに発生する可能性があります。
AIX® には、sync_release_ilock と呼ばれるチューニング・オプションがあります。 -o sync_release_ilock=1 オプション付きの ioo コマンドは、そのファイルのダーティー・ページのフラッシュ中に i ノード・ロックを解放できます。 この結果、sync() コール中にこのファイルをアクセスしている時の応答時間が良くなる場合があります。
このようなブロッキングの影響は、syncd デーモンでの同期の頻度を増やすことによって最小化することもできます。 syncd デーモンを開始する /sbin/rc.boot を変更します。 その後、システムをリブートして変更を有効にします。 現行システムの場合、syncd デーモンを kill し、新しい秒数値で再始動します。
この動作をチューニングする第三の方法は、ioo コマンドを使用してランダム遅延書き込みをオンにすることです (順次およびランダム遅延書き込みのパフォーマンスのチューニングを参照)。
JFS2 同期チューナブル
j2_syncPageCount: 1 つのファイルに対して 1 回の sync で書き込まれる予定の変更ページ数を制限します。 このチューナブルが設定されている場合、ファイルシステムは指定された数のページを書き込み、ファイルの残りの部分への入出力はブロックしません。 sync コールは、すべての変更ページが書き込まれるまで書き込み操作を繰り返します。j2_syncPageLimit: しきい値に達したときに、j2_syncPageCountパラメーターをオーバーライドします。 このパラメーターを使用すると、ファイルに対する sync 操作が確実に完了するようになります。 これらのチューナブルは、標準の方法で保持されます。
チューナブルを操作するには、ioo コマンドを使用します。
j2_syncPageCount チューナブルと j2_syncPageLimit チューナブルは、ioo コマンドにより制御される値のリストに追加されます。
–o フラグを使用し、ヘルプ・オプションを表示するには –h フラグを使用します。 # ioo –h j2_syncPageCountsync システム・コールで 1 回の操作によりディスクに書き込まれる、1 つのファイルの変更ページの最大数を設定します。 値: デフォルト: 0 範囲: 0-65536
タイプ: 動的
単位: 4 KB ページ
チューニング: ファイルシステム・キャッシングを使用し、ランダムな書き込みを頻繁に行うアプリケーションを実行する場合は、同期操作中に起こる長時間のアプリケーション遅延を回避するようにこの設定を調整する必要があります。 この値は 256 から 1024 の範囲内でなければなりません。 デフォルト値はゼロです。この場合、1 回の呼び出しですべてのダーティー・ページが書き込まれる通常の同期動作が行われます。 チューナブルに小さい値が設定されている場合は、同期にかかる時間がより長くなり、アプリケーションの応答時間の遅延がより短くなります。 大きい値が設定されている場合は、応答時間の遅延がより長くなり、同期にかかる時間がより短くなります。
# ioo –h j2_syncPageLimitsync システム・コールが j2_syncPageCount を使用する最大回数を設定し、書き込まれるページを制限して同期操作のパフォーマンスを向上させます。 値: デフォルト: 256 範囲: 16-65536
タイプ: 動的
単位: 数字
チューニング: j2_syncPageCount が設定されていて、j2_syncPageCount の変更による効果が十分でない場合にこれを増やす必要があるときに設定されます。 許容値は 250 から 8000 の範囲内です。 j2_syncPageCount が 0 である場合は、j2_syncPageLimit による効果はありません。
j2_syncPageCount が設定されていて、これを増やす必要がある場合は、j2_syncPageCount の変更による影響でアプリケーションの応答時間が損なわれないように、このチューナブルを設定する必要があります。
これらの値は 1 から 8000 の範囲内でなければなりません。 これらのチューナブルに最適な値は、メモリー・サイズと入出力の帯域幅により異なります。 中立的な開始点は、これらの両方のチューナブルを 256 に設定することです。
JFS2 の同期期間と並行処理
ファイルシステムの同期は、sync デーモン (syncd) によって管理されます。JFS2 チューナブル・パラメーターを使用すると、syncd を使用せずにファイルシステムが同期を処理できます。
JFS2 同期ハンドラーは、すべてのキャッシュ・データが同時にディスクに書き込まれないように、sync プロセスを分散します。sync は、一度に 1 つのファイルシステム上で実行されます。それぞれのファイルシステムは、前の操作が終了した後に次の sync 操作を開始するように設定されています。複数のファイルシステムを処理する必要がある場合に、sync 操作を処理するスレッドの数を増やすこともできます。
JFS2 ファイルシステムの同期に関しては、次のチューナブル・パラメーターを使用します。
- j2_syncByVFS:
- JFS2 同期ハンドラーの使用を指定し、ファイルシステムごとの sync 操作の間隔を設定します。
- j2_syncConcurrency:
- ファイルシステムの同期を処理するスレッドの数を設定します。この値は、sync 操作を並行して実行する必要があるファイルシステムの数を指定します。個々のファイルシステムに対して、ただ 1 つの sync スレッドが sync 操作を実行します。
ioo コマンドは、入出力のチューナブル・パラメーターを管理します。詳しくは、ioo コマンドの資料を参照してください。
# ioo –h j2_syncByVFS
目的: JFS2 ファイルシステムを同期するためのシステム呼び出しを反復する間に待機する秒数を指定します。この値は、syncd コマンドによって指定された値を置き換えます。
値: デフォルト: 0、範囲: 0 から 86400。
タイプ: 動的。
単位: 秒。
チューニング: この値は、sync プロセスを反復する間隔の秒数を指定します。
JFS2 同期ハンドラーは、JFS2 ファイルシステムに対する syncvfs サブルーチンの呼び出しを開始する前に、j2_syncByVFS チューナブル・パラメーターによって指定された時間まで待機します。値 0 は、通常の syncd 処理を使用するように指定します。ゼロ以外の値を指定すると、syncd コマンドで指定された時間がオーバーライドされ、JFS2 固有のファイル同期ハンドラーが使用されるようになります。
# ioo –h j2_syncConcurrency
目的: JFS2 sync 操作に使用されるスレッドの数を設定します。
値: デフォルト: 1、範囲: 1 から 128。
タイプ: 動的。
単位: 数値。
チューニング: sync デーモンは、j2_syncConcurrency チューナブル・パラメーターによって設定された数のファイルシステムに対して、sync 操作を並行して開始します。この値が有効になるのは、j2_syncByVFS チューナブル・パラメーターがゼロ以外の値である場合だけです。