ulimit 확인 및 설정 방법
ulimit 이란?
프로세스가 사용하는 자원에 대한 제어(user limit)를 관리할 수 있게 도와줍니다.
OutOfMemoryError
가 발생했는데 쓰레드를 더 이상 생성할 수 없다는 메시지가 나온다면 이 설정을 의심해 볼 필요가 있습니다.
ulimit에서 자주 설정하게 되는 값은 open file
과 max user process
설정입니다.
이 값에 따라 프로그램에서 소켓 커넥션 수, 혹은 생성 가능한 쓰레드 수가 제한됩니다.
Java를 사용하신다면 우아한형제들 블로그의 ‘Java, max user processes, open files’ 글을 읽어보시기 바랍니다.
- Java에서 동시에 생성 가능한 쓰레드 수는 max user processes를 따라간다.
- Java에서 소켓 통신(HTTP API, JDBC 커넥션 등)은 open file 옵션을 따라간다.
- 단, JDK 내부 코드상에서 hard limit 값이 soft limit에 update된다.
- 파이썬의 경우는 soft limit 값 따라간다.
ulimit 확인 방법
다음과 같은 명령어를 통해 ulimit을 확인하실 수 있습니다.
# 하드 설정 확인
$ ulimit -a -H
# 소프트 설정 확인
$ ulimit -a -S
example output:
$ 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) 63195
max locked memory (kbytes, -l) 64
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) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
소프트 설정과 하드 설정
ulimit 에서 설정할 수 있는 타입에는 두 가지가 있습니다. 바로 soft
와 hard
설정입니다.
소프트 limit 역시 리소스를 제한하는 최대값 입니다. 어떤 유저가 할당된 제한 값 이상의 리소스를 사용할 수는 없습니다.
소프트 값은 0과 하드 limit 사이의 값을 가질 수 있습니다. (0 <= soft limit <= hard limit)
즉, 하드 limit은 소프트 limit들의 최대값 역할을 합니다.
하드 limit 은 root 사용자만 값을 증가시킬 수 있습니다.
ulimit 설정 방법
ulimit 설정에는 명령어를 이용할 수도 있고, 설정 파일을 변경할 수도 있습니다. 명령어를 이용할 경우 세션이 끊어지면 설정이 초기화되므로 선호하지 않습니다.
명령어
위에서 ulimit -a
명령어 output 결과를 보시면 옵션들이 괄호 안에 있습니다.
ulimit 명령어에 옵션과 값을 주시면 해당 값이 변합니다.
다음은 max user process(-u) 값을 2048로 바꾸는 예제입니다.
$ ulimit -u 2048
설정파일
기본 파일은 /etc/security/limits.conf
입니다.
다음과 같이 생겼습니다.
# /etc/security/limits.conf
#
...
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open file descriptors
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit (KB)
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19]
# - rtprio - max realtime priority
#
#<domain> <type> <item> <value>
#
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
# End of file
살짝만 읽어보시면 친절하게 설정 방법을 알려줍니다. 한 row 에 domain, type, item, value 를 적어주시면 됩니다.
또한 주의해서 살펴보아야 할 파일은 /etc/security/limits.d/
아래에 있는 .conf
파일들입니다.
제가 위 파일의 주석에서 생략한 부분에는 limits.d
아래에 있는 .conf
파일들을 알파벳 순서로 읽으며, 기존 값이 있을 경우 override 합니다.
관리하게 편하게끔 /etc/security/limits.d/
아래에 role 별로 관리하시길 추천합니다.
댓글남기기