문제

로드 밸런서가있는 클러스터 모드에서 웹 응용 프로그램이 실행 중입니다. 하나의 DB 만 해결하는 2 개의 Tomcats (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 ()에 나타납니다.

힌트가 있습니까?

루이스

도움이 되었습니까?

해결책 3

마침내 나는 그 이유를 찾았다. 먼저 나는 항상이 예외가 같은 시점에 있다는 것을 알았습니다.

때때로 java.io.ioexception : java.io.fileoutputstream.close0 (avileoutputstream.close0)의 잘못된 인수는 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 파일 시스템 인 기본 파일 시스템 유형.

작은 파일을 작성하는 경우 노드를 가로 질러 쓰기 위해 쉘에서 테스트하는 것이 작동합니다. 즉:

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)을 사용하는 것입니다.

다른 팁

이 줄을 설정합니다 .profile 문제를 해결했습니다.

ulimit –n 2048

DataFilelist와 Filenamelist는 얼마나 큰가요? 파일 디스크립터가 부족할 수 있습니다. 그러나 Close ()에서 발생하는 것은 이상합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top