ulimit 확인 및 설정 방법

3 분 소요

ulimit 이란?

프로세스가 사용하는 자원에 대한 제어(user limit)를 관리할 수 있게 도와줍니다. OutOfMemoryError 가 발생했는데 쓰레드를 더 이상 생성할 수 없다는 메시지가 나온다면 이 설정을 의심해 볼 필요가 있습니다.

ulimit에서 자주 설정하게 되는 값은 open filemax 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 에서 설정할 수 있는 타입에는 두 가지가 있습니다. 바로 softhard 설정입니다.

소프트 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 별로 관리하시길 추천합니다.

참고한 글

업데이트:

댓글남기기