我有一个使用负载均衡器在群集模式下运行的Web应用程序。 它由两个tomcats(T1和T2)组成,只能处理一个DB。 T2是nfs安装到T1。这是两个节点之间唯一的差异。
我有一个生成一些文件的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()
任何提示?
路易斯
答案 0 :(得分:3)
在.profile
中设置此行解决了问题:
ulimit –n 2048
答案 1 :(得分:1)
dataFileList和fileNameList有多大?你可能会用完文件描述符。但它很奇怪它发生在close()上。
答案 2 :(得分:1)
最后我找到了原因。 首先我注意到并非总是出现这种异常 在同一点上。
有时是一个 java.io.IOException:参数无效 at java.io.FileOutputStream.close0(Native Method) 在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上进行测试以跨越节点进行编写(如果正在编写一个小节点) 文件。即:
在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。