FIX::OutOfMemoryError: unable to create new native thread

OutOfMemoryError: unable to create new native thread 원인

OutOfMemoryError 문구만 봐서는 해당 에러가 메모리와 관련된 오류일 것이라고 생각하기 쉽다. 하지만 Java 1.6과 1.7에서 OS가 Thread를 생성해 주지 못할 때 OutOfMemoryError: unable to create new native thread 에러가 표시될 수 있다.
. 참고 : http://java.dzone.com/articles/outofmemoryerror-unable-create

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) 62341
max locked memory       (kbytes, -l) 64
max memory size          (kbytes, -m) unlimited
open files                    (-n) 10240    
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) 1024    
virtual memory             (kbytes, -v) unlimited
file locks                      (-x) unlimited

프로세스 생성과 관련된 값은 "max user processes"이다.

해당값만 보고 싶다면
>ulimit -u
1024

Hard 설정 값을 보고 싶다면
>ulimit -Hu
2048

Java 프로세스가 자식 프로세스 모두 합쳐서 해당 값보다 많은 수의 Thread를 생성하려고 한다면 OutOfMemoryError: unable to create new native thread에러가 발생하게 된다.

max user processes 값 변경 방법

>ulimit -Hu 65535
>ulimit -Su 65535

위와 같이 할 경우 재부팅 되거나 세션이 새로 열리면 변경된 값이 적용되지 않는다.
재부팅이나 새 세션에도 해당값을 유지하려면 /etc/security/limits.conf 파일을 편집한 후 재부팅해야 한다.

>vi /etc/security/limits.conf
대략적으로 주석을 보면 어떻게 하는지 알 수 있다.

파일 제일 끝에 아래와 같이 추가한다. 이미 비슷한 라인이 있으면 편집한다.
*    hard    nproc    65535
*    soft    nproc    65535

특정 유저만 해당값을 설정하고 싶으면 '*'대신에 ID를 넣어준다.

hadoop    hard    nproc    65535
hadoop    soft    nproc    65535

hard는 최대로 생성할 수 있는 프로세스 수가 아니라 최대로 설정 가능한 제한값으로 root유저만 변경 가능하다. soft 값이 생성할 수 있는 최대 프로세스 수이며 root를 포함한 모든 유저는 hard값이하로만 설정 가능하다. (hard가 1024면 soft는 1024보다 클 수 없다.)
. 참고 : http://unix.stackexchange.com/questions/29577/ulimit-difference-between-hard-and-soft-limits

추가
. 파일 편집을 마친 후 재부팅 해야 해당 값이 적용된 다는 것을 잊지 말자.
. 해당 값을 너무 작게 설정하면 OS가 먹통이 될 수 있다. 복구하려면 rescue 나 single-user mode에서 /etc/security/limits.conf 파일을 편집해야 한다.
. max user processes의 최대값은 4,194,303이나 "sysctl kernel.pid_max"값에 따른다. CentOS 6.5의 kernel.pid_max 값은 32,768이다. 즉 ulimit에서 65,535로 변경해도 32,768이다.
(참고 : http://unix.stackexchange.com/questions/124040/how-to-determine-the-max-user-process-value)

참고
http://stackoverflow.com/questions/9361816/maximum-number-of-processes-in-linux

댓글

이 블로그의 인기 게시물

FIX::장치가 더 이상 응답하지않거나 연결이 끊어졌습니다.

mysql DATETIME형의 기본값으로 현재시간 설정

FIX :: LACP bonding 구성시 트래픽이 한쪽 포트로 몰리는 현상