1

2 つのフローを持つ Spring バッチ アプリケーションを開発しました。1. 前方 2. 後方。ファイルの読み取り/書き込みのみを使用しており、DB は関与していません。

  1. Forward Scenario : 入力ファイルには、22 個のフィールドを持つレコードが含まれます。シーケンス番号の生成やいくつかのフィラー フィールドの追加などの操作を実行して、22 個のフィールドを 32 個のフィールドに変換します。国コードに基づいて、出力は最大 3 つに分割されます。各チャンクには 250K のレコードが含まれます。(レコードが 100 万単位の場合、同じ国に対して複数のファイルが生成されます)。

    8 Million は 36 分かかることを記録しています。

    800 万件のレコードが 1 つのファイルになります。

    使用しているスプリング バッチ スレッド 1000 スレッドを使用しています。

  2. Backward Flow : 入力ファイルには、各レコードに 82 個のフィールドがあります。これらの 82 フィールドは 86 レコードに変換されます。間に 2 つのフィールドが追加され、Forward フロー入力ファイルから取得されます。他のフィールドは単にコピーして貼り付けます。エラー記録もエラーファイルに書き込まれます。エラーレコードは、Forward フローのために実際に入力されたレコードに他なりません。追跡するために、ファイル内のシーケンス番号と実際のレコードを永続化しています。これはフォワード フロー自体で行われます。バックワード フローで永続ファイルを取得し、欠落しているものがあればシーケンス番号を比較し、キーと値のペアを介してエラー レコードに書き込みます。このプロセスは、逆流の完了後に行われます。

    入力ファイルの最大サイズは 250K です。

    8 Million は 1 時間 8 分を記録していますが、これは残念です。このフローでは、入力用に 32 個のファイル (各 250K) があります。逆に使用されるスレッドはありません。スレッドの使用方法はわかりません。試しましたが、プロセスがハングしました。

サーバー構成:

  • 12 CPU & 64 GB Linux サーバー。

    12 CPU/64GB RAM を使用しているため、パフォーマンスを改善するためにこの点で助けていただけますか。

4

1 に答える 1

0

すでに 1000 スレッドを使用していますが、これは非常に高い数値です。私はスプリング バッチ ジョブを微調整しましたが、これが私が行ったことです。可能なすべての情報を一度に取得して、スレッドの存続期間中メモリに保存できますか? データの保存と取得に org.apache.commons.collections.map.MultiKeyMap を使用しています。たとえば、あなたの場合、シーケンス番号の比較が必要です。そのため、プロセスを開始する前に、すべてのシーケンス番号を 1 つのマップにまとめてください。ステップ実行コンテキストに ID (多すぎない場合) を格納できます。

  1. 書く頻度を減らす - 書く必要のあるすべての情報をしばらく保存しておき、最後に書きます。

  2. プロセスの最後に未使用のオブジェクトを null に設定して、GC を促進します

  3. VisualVm または Jconsole で GC 頻度を確認します。プロセスの実行中に頻繁に GC が発生するはずです。これは、オブジェクトが作成され、ガベージ コレクションが行われていることを意味します。メモリ グラフが増加し続ける場合は、何か問題があります。

于 2012-09-12T14:07:34.240 に答える