최근 elasticsearch, mongodb를 설치하고 사용하면서 발생한 장애를 파악하는 과정에서
ulimit를 확인해야 된다는 조언이나 권장 설정값에 대한 안내를 몇번 보고 지나갔어서 해당 내용을 정리해보고자 한다.
ulimit란?
ulimit 명령어는 리눅스에서 사용자의 프로세스당 리소스 제한을 설정하거나 조회할수 있는 기능이다.
OS를 운영하는 관점에서 특정 프로세스가 과도하게 리소스를 많이 사용해 서버 전체에 악영향을 미칠수도 있기 때문에 해당 기능을 통해 단일 애플리케이션당 할당받을 수 있는 리소스의 최댓값이 지정되게 된다.
현재 OS의 ulimit 설정값을 조회하기 위해서는 ulimit -a 명령어를 입력하면 된다.
그럼 이 설정값들은 각각 무엇을 의미할까?
위 값들은 다음과 같다.
- core file size [core] (-c) : 생성할 수 있는 코어 파일 개수
- data seg size [data] (-d) : process`s data segment의 최댓값
- scheduling priority [nice] (-e) : 스케줄링 우선순위 최댓값
- file size [fsize] (-f) : 셸에 의해 만들어질 수 있는 파일의 최대 크기
- pending signals [sigpending] (-i) : 생성할 수 있는 pending signals의 개수
- max locked memory [memlock] (-l) : 스와핑을 최소화하도록 memory lock 설정이 가능한 최댓값
- max memory size [rss] (-m) : 설정 가능한 resident set 크기
- open files [nofile] (-n) : 최대 열 수 있는 파일 개수
- pipe size (-p) : 512바이트 블록의 파이프 크기
- POSIX message queues [msgqueue] (-q) : POSIX 메시지 큐의 최대 바이트 수
- real-item priority [rtprio] (-r) : 실시간 스케줄링 우선순위 최댓값
- stack size [stack] (-s) : 스택이 가질 수 있는 최댓값
- cpu time [cpu] (-t) :초당 CPU 시간의 최댓값
- max user processes [nproc] (-u) : 한 사용자가 생성할 수 있는 프로세스의 개수
- virtual memory (-v) : 생성할 수 있는 가상 메모리 최댓값
- file locks [locks] (-x) : 파일 접근을 제한하는 file lock 설정이 가능한 최댓값
해당 ulimit를 변경하기 위해서는 ulimit -옵션 변경할값 과 같이 입력하면 된다.
예시) 한 사용자가 생성할 수 있는 프로세스 개수를 2048개로 설정 : ulimit -u 2048
ulimit의 소프트 설정과 하드 설정
ulimit는 내부적으로 소프트(soft) 설정과 하드(hard) 설정을 가지고 있다.
소프트 설정은 프로세스가 실행될 때 최초로 할당받는 값이고 하드 설정은 운영 중에 리소스의 한계에 도달할 경우 추가적으로 할당받을 수 있는 값이다. 항상 리소스를 최댓값으로 할당받으면 많은 리소스가 낭비될 수 있기 때문에 존재한다.
설명에서 유추할 수 있듯이 소프트 설정은 항상 하드 설정보다 같거나 낮아야 한다.
소프트 설정 확인하기 : ulimit -Sa
하드 설정 확인하기 : ulimit -Ha
소프트, 하드 설정을 변경하기 위해서는 ulimit -(H 또는 S)(변경할옵션) 변경할값와 같이 입력하면 된다.
ulimit 영구 설정
앞에서 설정한 내용들은 시스템이 리부팅되면 모두 초기화된다. 시스템을 운영하다보면 시스템이 비정상적으로 종료되는 경우가 종종 있기 때문에 이렇게 휘발성으로 값을 관리하는것은 바람직하지 않다.
그래서 리부팅이 되더라도 ulimit 설정 내역이 유지되도록 영구적으로 저장하기 위한 용도로 리눅스에서는 /etc/security/limits.conf 파일을 제공한다.
limits.conf 파일의 형식은 다음과 같다.
[사용자 계정] [soft|hard] [옵션] [값]
사용자 계정을 직접 입력하거나, 전체 유저에 적용하고 싶은 경우 *를 사용하면 된다.
옵션은 위 ulimit의 옵션 설명의 대괄호에 있는 값과 동일하다.
소프트웨어별 ulimit Recommendation
1. elasticsearch
elasticsearch 공식 문서에서는 ulimit 옵션을 다음과 같이 추천하고 있다.
- ulimit -l unlimited
- ulimit -n 65536 이상
- ulimit -u 4096
2. mongodb
mongodb 공식 문서에서는 ulimit 옵션을 다음과 같이 추천하고 있다.
- -f (file size): unlimited
- -t (cpu time): unlimited
- -v (virtual memory): unlimited
- -l (locked-in-memory size): unlimited
- -n (open files): 64000
- -m (memory size): unlimited
- -u (processes/threads): 64000
3. java application
open files의 옵션은 프로세스가 가질 수 있는 소켓 포함 파일 개수이다.
그리고 리눅스 OS 환경에서는 JDK 실행시 soft 값을 무시하고 hard 옵션까지 open files 옵션을 자동으로 늘려버린다.
자바 프로세스에서 열린 파일 개수를 초과하거나 스레드를 더 생성할 수 없다는 로그가 발생한 경우 hard 옵션이나 limits.conf 파일을의 hard 옵션으로 조절하면 될 것 같다.
참고자료
Java, max user processes, open files (우아한형제들 기술 블로그)
엘라스틱서치 실무 가이드 책