お手軽バッチ・パフォーマンス改善⑥更新版

【2010/08/12 original author KAMII】

データセットのI/O効率を上げる(続き)

VSAMデータセットのCIバッファーを増やす(シーケンシャル・アクセス)

VSAMでも大量のレコードが格納されたデータセットを順次アクセスするプログラムの場合、バッファー数を増やすことでデータセットのI/O処理の効率を上げることができます。VSAMデータセットの場合、CIをアクセスするバッファーを増やすことで一度にまとめて複数のCIをアクセスでき、順次データセット同様にデバイスへのI/O回数を減らすことができます。特に、ESDSやKSDSのシーケンシャル処理では、順次データセット同様にその効果は大きいです。

VSAM/ESDSデータセットBUFND別1,000,000レコード読み込み処理時間とメモリー使用量(実測機IBM z14(3906-785) z/VM Guest z/OS V2R4)

グラフは、バッファー数と実行時間および発行されたI/O回数と使用されたリージョン内メモリーサイズを示しています。実行時間は、VSAMがデフォルトで設定するCIサイズ(18432バイト)でデフォルトのバッファー数の実行時間を1とした場合の相対数値です。CIサイズを4KBに縮めるとそれだけで実行時間は3倍強、I/O回数は4倍強に増えます。バッファー数を10個に増やせばやっと追いつく感じです。
VSAMもQSAM同様に、バッファー数を単に多くすればよいというわけではなく、ある程度のところで効果は頭打ちになります。VSAMではDATAコンポーネント・アクセスのデフォルト・バッファー数は2個です。(グラフ中ではBUFND値=0をVSAMデフォルト値と示しているが、BUFND=0はバッファー数0個ではなくデフォルト値となる)CIサイズの大きなデータセットでは20から40個程度。CIサイズが小さい場合で40から80個程度。過去に試した結果では、それ以上増やしてもメモリー使用量の増加に見合うだけの実行時間短縮は望めませんでした。

デフォルトでも最小限のバッファリング制御がされていますが、性能に大きく寄与するほどではありません。しかし、小さなCIサイズのデータセットほどバッファーを増やす効果は大きいので、機会があれば試してみるといいでしょう。KSDSの場合で、主にキーによるランダム・アクセスをするが、たまにシーケンシャル・アクセスでの処理も行う、といったデータセットで小さめのCIサイズを選択しているような場合は、シーケンシャル・アクセス時にはバッファー数を増やすことで大きなCIサイズ並のパフォーマンスを得られます。

DATAコンポーネントのバッファー数の変更は、JCLのDDステートメントにAMPパラメーターでBUFNDを追加することで行うことができます。

AMSのREPROやICEGENERでは、プログラム自身で最適なI/Oを行うのでJCLでのバッファー数指定は効果がありません。VSAMとPSデータセット間のロードやアンロードであればAMSのREPROではなくICEGENERユーティリティーでコピーした方がパフォーマンスは格段にいいです。従来からあるIEBGENERユーティリティーではなくDFSORTによって提供されるICEGENERです。PSとVSAM間の相互コピーも簡単なJCLで行うことができます。

【2010/08/12 original author KAMII】