3

我有一个使用负载均衡器以集群模式运行的 Web 应用程序。它包含两个只寻址一个 DB 的 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: Invalid argument at java.io.FileOutputStream.close0(Native Method) at java.io.FileOutputStream.close(FileOutputStream.java:279) ^^^^^

有时是

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

因此问题不是 java 问题。甚至不是 NFS 问题。问题底层文件系统类型,它是一个 DRBD 文件系统。

如果一个人正在编写一个小文件,那么在 shell 上进行跨节点写入的测试是可行的。IE:

在 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 回答