3

ロードバランサーを使用してクラスターモードで実行しているWebアプリケーションがあります。これは、1つのDBのみをアドレス指定する2つのtomcat(T1およびT2)で構成されています。T2はT1にマウントされたnfsです。これは、両方のノード間の唯一の違いです。

いくつかのファイルを生成するJavaメソッドがあります。リクエストがT1で実行されている場合は問題ありませんが、リクエストがノード2で実行されている場合は、次のような例外が発生します。

java.io.IOException: Invalid argument
        at java.io.FileOutputStream.close0(Native Method)
        at java.io.FileOutputStream.close(FileOutputStream.java:279)

対応するコードは次のとおりです。

for (int i = 0; i < dataFileList.size(); i++) {
    outputFileName = outputFolder + fileNameList.get(i);
    FileOutputStream fileOut = new FileOutputStream(outputFileName);                        
    fileOut.write(dataFileList.get(i), 0, dataFileList.get(i).length);
    fileOut.flush();
    fileOut.close();
}

例外はfileOut.close()に表示されます

ヒントはありますか?

ルイス

4

3 に答える 3

3

この行をに設定すると.profile、問題が解決しました。

ulimit –n 2048
于 2010-06-07T19:07:11.533 に答える
1

dataFileListとfileNameListはどのくらいの大きさになりますか?ファイル記述子が不足している可能性があります。ただし、close()で発生するのは奇妙です。

于 2009-04-23T18:36:36.690 に答える
1

ついにその理由を見つけました。最初に、この例外が常に同じ時点で発生するとは限らないことに気付きました。

時々java.io.IOException:java.io.FileOutputStream.close(FileOutputStream.java:279)のjava.io.FileOutputStream.close0(ネイティブメソッド)で無効な引数^^^^^

そして時々だった

java.io.IOException: Invalid argument
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:260)

したがって、問題はJavaの問題ではありません。NFSの問題すらありません。問題、DRBDファイルシステムである基になるファイルシステムタイプです。

小さなファイルを書き込んでいる場合は、シェルでテストしてノード間で書き込むことができます。すなわち:

nfsマウントノードで

cd /tmp
date > /shared/path-to-some-not-mounted-dir/today

will work

しかし

cat myBigFile > /shared/path-to-some-not-mounted-dir/today

次のエラーが発生します

cat: write error: Invalid argument

したがって、解決策は、他のタイプのファイルシステム、たとえばgfsを使用することです。

于 2009-04-24T10:53:09.617 に答える