'IOException'에 해당되는 글 2건

  1. 2008.11.05 Windows java nio를 이용한 file copy시 IOException문제 by 지영아빠
  2. 2008.10.23 Too many open files 에러 by 지영아빠
Windows에서 java nio를 이용하여 파일 복사시 아래와 같은 오류가 있었습니다.

Exception in thread "main" java.io.IOException: 사용 가능한 저장소가 부족하여 이 명령을 처리할 수 없습니다
    at sun.nio.ch.FileChannelImpl.map0(Native Method)
    at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:742)
    at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:448)
    at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:521)


기존 코드는 다음과 같았습니다.

 FileChannel in = new RandomAccessFile("1.dat", "r").getChannel();
FileChannel out = new RandomAccessFile("1.cpy", "rw").getChannel();

try {
  in.transferTo(0, in.size(), out);
}catch (Exception e) {
  e.printStackTrace();
}

이렇게 되어있었습니다.

자료를 찾아보니 Windows에서는 버퍼 제한이 있어서 다음과 같이 수정 하여아 합니다.

 FileChannel in = new RandomAccessFile("1.dat", "r").getChannel();
FileChannel out = new RandomAccessFile("1.cpy", "rw").getChannel();

try {
    int maxCount = 1024*1024*200;     // 시스템 상황에 따라 조정합니다.
    long size = in.size();
    long position = 0;
        System.out.println("size:"+size);
    while (position < size) {
       position += in.transferTo(position, maxCount, out);
    }
}catch (Exception e) {
  e.printStackTrace();
}

이렇게 수정하니 해결되었습니다.





신고
Posted by 지영아빠
다음과 같은 예외 메시지를 발생시킵니다. 소켓과 파일에서 이런 문제가 발생할 수 있습니다.

예외 1
java.net.SocketException: Too many open files

at java.net.PlainSocketImpl.accept(Compiled Code)
at java.net.ServerSocket.implAccept(Compiled Code)
at java.net.ServerSocket.accept(Compiled Code)
at weblogic.t3.srvr.ListenThread.run(Compiled Code)

예외 2

java.io.IOException: Too many open files

at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:551)
at java.lang.Runtime.exec(Runtime.java:477)
at java.lang.Runtime.exec(Runtime.java:443)
...

첫 번째 예외는 오류가 TCP 프로토콜에 영향을 주는 경우에 발생하며 두 번째 예외는 오류가 I/O 동작에 영향을 주는 경우 발생합니다.

두 경우 모두 서버 차단(blocking) 문제를 유발합니다. 아래에서 설명하는 방법으로 문제를 파악하여 해결할 수 있습니다.

Unix와 Linux에서는 스트림을 File로서 처리합니다. 이것은 OS에서 사용할 수 있는 파일디스크립터(fd)의 갯수를 지정하는데, 이것이 작을때 발생합니다.

우선, 엔진에 문제가 없는지 확인합니다. 파일(소켓)을 연 상태에서 닫은게 없는지 확인하고 이상이 없다면, 시스템의 fd의 설정을 확인합니다.

저희는 Unix와 Linux를 주로 사용하기에 이 경우에는 ulimit명령으로 간단히 확인할 수 있습니다. ulimit -a 하면 모든 설정이 나오게 됩니다.

 core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 48743
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 48743
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


Unix 및 Linux에 모두 파일 디스크립터가 있습니다.  주요한 차이점은 hard limit의 설정, 디폴트값 및 파일 디스크립터의 구성 절차에 있습니다.

Solaris
/usr/bin/ulimit유틸리티를 사용하여 단일 프로세스에 할당하는 파일 디스크립터의 개수를 정의합니다.  최대값은 rlim_fd_max로 정의되며 기본적으로 65,536으로 설정됩니다.  루트 사용자만이 이 커널 값을 수정할 수 있습니다.

Linux

관리자는 다음 예와 같이 etc/security/limits.conf 구성 파일에 파일 디스크립터 제한을 설정할 수 있습니다.
soft nofile 1024
hard nofile 4096

다음 세 행을 /etc/rc.d/rc.local 시작 스크립트에 추가하여 시스템 전체의 파일 디스크립터 제한을 설정할 수도 있습니다.

# Increase system-wide file descriptor limit.
echo 4096 > /proc/sys/fs/file-max
echo 16384 > /proc/sys/fs/inode-max

Windows
파일 디스크립터는 Windows OS에서는 파일 핸들이라고 합니다.  Windows 2000 서버의 경우 열린 파일 핸들 제한은 16,384로 설정되어 있습니다.  이 값은 작업 관리자 성능 요약에서 확인할 수 있습니다.

HP-UX
nfile 을 사용하여 열린 파일의 최대 개수를 정의할 수 있습니다.  이 값은 대개 다음 공식으로 결정됩니다. ((NPROC*2)+1000) 여기서 NPROC는 대개 ((MAXUSERS*5)+64)입니다.  MAXUSERS가 400인 경우 계산 결과는 5128입니다.  대개 이 값을 더 높게 설정합니다.  maxfiles는 프로세스별 소프트 파일 제한이고 maxfiles_lim은 프로세스별 하드 파일 제한입니다.

AIX
파일 디스크립터 제한은 /etc/security/limits파일에 설정되어 있으며 기본값은 2000입니다.  이 제한은 ulimit명령 또는 setrlimit 함수로 변경할 수 있습니다.  최대 크기는 OPEN_MAX 상수로 정의합니다.



*참고*
Too many open files - BEA

신고
Posted by 지영아빠

티스토리 툴바