3. OS이야기/ 01. Administration

[LINUX] ulimit

알 수 없는 사용자 2014. 5. 20. 11:11

Linux 에서의 ulimit 에 대해서 글 올립니다.

 

ulimit 이란, shell과 shell이 실행한 프로세스에 대하여 시스템 상의 사용 자원을 제한할 수 있도록 해주는 명령어입니다.

 

예제를 보시면 다음과 같습니다.


# ulimit -a          // 현재 로그인한 user가 사용 가능한 모든 자원의 limit 값

core file size                          (blocks, -c) 0

data seg size                       (kbytes, -d) unlimited

scheduling priority                            (-e) 0

file size                                  (blocks, -f) unlimited

pending signals                                 (-i) 127461

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) 10240

cpu time                             (seconds, -t) unlimited

max user processes                         (-u) 127461

virtual memory                     (kbytes, -v) unlimited

file locks                                           (-x) unlimited                            


* 1 block = 512 bytes


위 예제의 '-a' 옵션은 해당 시스템의 모든 자원에 대한 limit 값을 보여주는 옵션입니다.

반면, 각각의 ulimit 값을 보려면 ulimit -a 명령의 결과로 보여지는 괄호 안의 옵션을 사용합니다.


ex.

# ulimit -c                // core file size

# ulimit -d               // data seg size



또한, 각 옵션 뒤에 값을 지정하면 limit 값을 변경 가능하며, unlimit(무제한) 값을 주고자 한다면 특정 정수값 대신 'unlimited' 를 지정해 주면 됩니다.


ex.

# ulimit -c unlimited

# ulimit -d 4194303



하지만, 위와 같이 값을 변경하게 되면 현재 로그인한 user의 현재 세션에서만 적용될 뿐, 다른 user에는 적용되지 않고 OS 재부팅 시에는 초기값으로 돌아가게 됩니다.

 

그러므로 재부팅 후에도 현재 설정값을 유지하려거나 user 별로 설정하려면 Linux 의 경우  /etc/security/limits.conf 파일, AIX 의 경우 /etc/security/limits 파일 등을 수정해야 합니다.


# /etc/security/limits.conf

#

#Each line describes a limit for a user in the form:

#

#<domain>        <type>  <item>  <value>

#

#Where:

#<domain> can be:

#        - an 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 files

#        - 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



limit에는 soft와 hard limit이 있는데, soft limit은 새로운 프로세스가 생성되면 default로 적용되는 한도이고,


hard limit은 soft limit에서 최대 늘릴 수 있는 한도로, 슈퍼유저에 의해서만 조정이 가능하며 무한히 늘릴 수는 없습니다.(soft limit 값 <= hard limit 값)


soft limit과 hard limit 값을 확인하려면 다음의 명령을 사용합니다.


ex.

# ulimit -Sa            // 모든 ulimit 값에 대한 soft limit

# ulimit -Hc            // core file size 값에 대한 hard limit



<ulimit 각 항목에 대한 설명>


 Item

Description 

core file size

core 파일 생성 시 최대 크기 제한. 이 값이 0 이면 core 파일이 생성되지 않도록 함

data seg size

프로세스 데이터 세그먼트의 최대 크기 제한. 프로세스가 heap에 할당할 수 있는 최대 메모리량

scheduling priority

the maximum scheduling priorty ("nice")

- nice는 Unix와 Linux 같은 Unix 계통의 OS에서 찾을 수 있는 명령어

- nice는 같은 이름의 커널 콜에 직접 맵핑되어 있음

- 주어진 프로세스의 우선권은 nice가 커널 스케줄러 안에서 변경

- -20의 niceness는 가장 높은 우선권이고, 19는 가장 낮은 우선 순위

- 기본 niceness는 부모 프로세스에서 물려받으며 보통 0

- renice 명령어도 있음. 이것은 프로세스가 실행중일 때 우선순위를 바꾸는데 사용

file size

shell에 의해 만들어질 수 있는 파일의 최대 크기 제한. 소켓 포함

pending signals

* Signal: 시스템이 어떤 조건에 의해 event가 발생했음을 알리기 위해 프로세스에게 전달되는 software interrupt. Signal을 통해 프로세스 간 event를 전달하여 통신수단으로 이용 가능. 프로세스는 동시에 하나의 Signal만을 처리 가능

* Pending Signal: 생성은 되었으나 아직 전달되지 않은 Signal. 프로세스가 특정 Signal을 block 시키면 Signal은 pending 되며, block된 Signal은 프로세스가 그 Signal을 unblock 할 때까지 혹은 해당 Signal에 대한 처리를 ignore로 변경할 때까지 pending 됨

max locked memory

- the maximum number of bytes of memory that may be locked into RAM

- this parameter limits the maximum amount of memory that can be "locked down" to a specific address in physical memory by a given process.

- If the physical memory used for the database is locked, the operating system's virtual memory subsystem cannot borrow that memory for other uses. No part of the database is ever paged out but this could lead to memory shortages in a system that is under configured with RAM. While memory locking can improve database load performance, it may impede other applications on the same computer.

max memory size

메모리에 상주할 수 있는 최대 크기(resident set size) 제한 

this parameter limits the amount of memory that can be "swapped in" to physical RAM on behalf of any one process.

open files

오픈할 수 있는 file descriptor의 최대 개수 제한. 소켓 포함. sysctl 에 정의된 fs.file-max 값보다 작아야 함

pipe size

512 bytes 블록 단위로 파이프 크기 설정

when two Unix processes communicate via a pipe of FIFO(first in first out) buffer, as in the simple case of paging through a directory listing with the command "ls | more", the output of the first command is buffered before transmission to the second. The size of this buffer, in bytes, is the pipe size.

POSIX message queues

POSIX message queues 에 의해 사용되는 최대 메모리 제한

POSIX message queues allow processes to exchange data in the form of messages.

real-time priority

the maximum real-time scheduling priority

stack size

스택의 최대 크기 제한. 프로세스가 stack에 할당할 수 있는 최대 메모리량, stops runaway recursive function

 cpu time

초당 사용 가능한 CPU의 최대 허용 시간 제한

max user processes

한 사용자에게 허용 가능한 프로세스의 최대 개수 제한

virtual memory

shell에 허용 가능한 가상 메모리의 최대량 제한. stack, heap 등을 모두 포함. 이 수치를 넘어가는 메모리 할당이 생길 경우 OOM(Out Of Memory) 발생

file locks

the maximum number of file locks the user can hold

(※ 영문 설명은 해외 사이트에서 찾은 것을 오역의 소지가 없게 하기 위해 그대로 옮겼습니다.)


이상입니다.