728x90
반응형
ulimit 란?

- 프로세스들에 대한 시스템 자원사용을 제한

- Apache와 같은 웹 서비스를 운영 시 동시 접속자가 많은 경우 구동되는 Apache 프로세스 수와 해당 프로세스가 처리하게되는 파일 수 또한 증가하게 되는데 이에 따라 시스템에서도 해당 설정을 조정하는 방법이 필요로 하기에 사용

- 프로세스의 자원 한도를 설정하는 방법에는 soft와 hard가 있음

- ulimit 명령어를 사용하면 커널의 성능과 기능에 영향을 주게 되므로 사용시에 주의해서 사용 

- sysvinit 환경과 systemd 환경에서 설정하는 방법이 달라짐


한도

soft 
  • 새로운 프로그램을 생성하면 기본적으로 적용되는 한도 

hard 
  • 소프트한도에서 최대로 늘릴 수 있는 한도


설정 목록

nofile 
  • 해당 도메인 (사용자, 그룹)이 오픈할 수 있는 최대 파일 개수
  • 오픈할수 있는 파일기술자(FD: file descriptor)의 최대 개수 제한

nproc 
  • 해당 도메인 (사용자, 그룹)의 최대 프로세스 개수
  • 한 사용자에게 허용 가능한 프로세스(user processes)의 최대 개수 제한

core 
  • Core 파일 크기를 제한
  • 코어(core) 파일 생성시 최대 크기 제한

data
  • 데이터 최대 크기
  • 프로세스 데이터세그먼트(process data segment)의 최대 크기 제한

fsize 
  • 파일 최대 크기
  • 쉘에 의해 만들어질 수 있는 파일의 최대크기 제한

memlock 
  • 최대 잠겨진 메모리 주소 공간 
  • 쉘에 허용 가능한 가상메모리(virtual memory)의 최대량 제한

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

stack 
  • 스택 최대 크기 
  • 스택크기(stack size)의 최대크기 제한

cpu 
  • 최대 CPU 시간 
  • 초(second)당 사용 가능한 CPU의 최대 허용 시간(cpu time) 제한

as 
  • 주소 공간 제한
  • 512byte 블록단위로 파이프크기(pipe size)설정

maxlogins 
  • 이 사용자의 최대 로그인 수

maxsyslogins 
  • 시스템의 최대 로그인 수

priority 
  • 사용자 프로세스를 실행하는 우선 순위

locks 
  • 사용자가 보유할 수 있는 최대 파일 잠금 수

sigpending 
  • 보류 중인 최대 신호 수

msgqueue 
  • POSIX 메시지 큐에서 사용하는 최대 메모리

nice 
  • 값으로 올릴 수 있는 최대 nice 순위 [-20 ~ 19]

rtprio 
  • 최대 실시간 우선 순위

chroot 
  • 루트를 디렉토리로 변경 (데비안 특정)


옵션

-a : 모든 제한 값 출력

-b : 최대 소켓 버퍼 크기 제한

-d : 프로세스의 데이터 세그먼트 최대 크기 제한

-e : 최대 우선 예약 순위

-f : 쉘에 의해 생성된 파일의 최대 크기 제한

-i : 보류중인 신호의 최대 수 제한

-l : 메모리에 잠길 수 있는 최대 크기 제한

-s : stack 최대 크기 제한

-t : CPU의 초당 사용시간 제한

-m : 메모리에 상주 가능한 최대 크기 제한

-c : core파일이 생성될때의 최대 크기 제한

-u : 특정 사용자의 사용가능한 프로세스의 최대갯수 제한

-v : 쉘이 사용할 수 있는 가상 메모리의 최대 크기 제한

-p : 512 byte 블록으로 파이프 크기를 설정

-q : POSIX 메시지 대기 행렬의 최대 byte 수 제한

-r : 최대 실시간 스케줄링 우선 순위

-n : 오픈가능한 FD의 갯수 제한 (too many open file 등의 Error가 발생하는 경우 해당 값을 수정하여 해결 가능)

-x : 최대 파일 잠금 수 제한

-S : 주어진 자원에 대한 소프트 한도 설정

-H : 주어진 자원에 대한 하드 한계 설정

-T : 최대 스레드 수 제한


값 확인

- core file size : 코어파일의 최대 크기 (-c 옵션)

- data seg size : 프로세스의 데이터 세그먼트 최대 크기 (-d 옵션)

- scheduling priority : 쉘에서 생성되는 파일의 최대 크기 (-e 옵션)

- file size : 파일의 최대 크기 (-f 옵션)

- pending signals : 보류중인 신호 제한 (-i 옵션)

- max locked memory : 메모리에 잠길 수 있는 최대 크기 (-l 옵션)

- max memory size : resident set size의 최대 크기 (메모리 최대크기로 -m 옵션)

- open files : 한 프로세스에서 열 수 있는 open file descriptor의 최대 수 (열수 있는 최대 파일 수로 -n 옵션)

- pipe size : 512 byte 블록의 파이프 크기 (-p 옵션)

- POSIX message queues : POSIX 메시지 대기 행렬의 최대 byte 수 (-q 옵션)

- real-time priority : 최대 실시간 스케줄링 우선 순위 (-r 옵션)

- stack size :  stack 최대 크기 (-s 옵션)

- cpu time : 총 누적된 CPU 시간[초] (-t 옵션)

- max user processes : 단일 유저가 사용가능한 프로세스의 최대 갯수 (-u 옵션)

- virtual memory : 쉘에서 사용가능 한 가상 메모리의 최대 용량 (-v 옵션)

- file locks : 최대 잠금 파일 수 (-x 옵션)


설정방법 (/etc/security/limit.conf)

<Domain> <Type> <Item> <Value>

- Domain : 제한할 대상 작성 (*, User명, 그룹명) - 그룹에 적용할 경우 @가 붙음

- Type : 강하게 제한할 것인지 여유를 줄 것인지 결정 (Soft, Hard)

- Item : 제한할 항목으로 core, data, seg, file size 등 여러가지 존재 (stack, nproc, nofile 등등)

- Value : 제한하고자 하는 설정 값


Sysvinit ulimit 사용 예제

- 동시 접속자 수의 증가로 Apache 프로세스가 증가하여 max user process 또는 open files 수가 설정값을 초과해 동작할 시 Apache hang 현상이 발생될 수 있다.

# ulimit -u 2048
위의 명령으로 변경하는 방법이 있으나 실제 적용되진 않는다. 변경된 것처럼 보여지더라도 재로그인 또는 재부팅 시 기본 설정으로 다시 적용된다.

실제 적용 방법으로는

1. ulimit 명령을 통한 -n -u를 사용하여 max user process와 open files 개수를 수정한다.
    # ulimit -n 2048
    # ulimit -u 4096
    # ulimit -a

2. /etc/security/limits.conf 파일 수정
    - 프로세스 user 별로 설정을 지정할 수 있으며 이와 같이 적용시 특정 user만 해당 설정이 무분별하게 자원을 많이 사용하게 되는 부분에 대한 보안이 가능
    # vim /etc/security/limits.conf
        daemon    soft    nproc    4096
        daemon    hard    nproc    4096
    - daemon : user
    - soft 또는 hard : 한도 지정 
    - nproc 4096 : 한도 숫자 지정

3. /etc/profile 수정
    # ulimit setting
    ulimit -u 8192 -> max number of process 수정
    ulimit -n 2048 -> open files 값 수정
    # source /etc/profile
    # ulimit -a


설정 적용 안될 시

daemon     soft    nproc    83728

- 해당 설정에도 가끔 쓰레드가 부족하여 서비스가 구동되지 않는 증상 발생 

- 값의 최대치는 65535 이지만 메모리가 많은 경우 이 이상으로 설정 가능 (값에 unlimit 로 제한을 두지 않기도함), limit.conf의 soft 부분을 주석처리하고 limits.d/90-nproc.conf 파일의 내용을 수정해야함


참고 URL




systemd에서 ulimit 설정

systemd에서는 /etc/security/limits*를 완전히 무시한다. 그러므로 systemd에서 limits 설정은 기존 방법과 다르게 설정하여야 한다.

적용 순위는 Service Daemon -> Global


1. 전역 (Global) 으로 설정

파일 경로
System : /etc/systemd/system.conf
User : /etc/systemd/user.conf


해당 파일 내에서 값을 변경하는 것이다. 이 파일은 systmed의 일부로 systemd의 값을 설정하는 파일이다. 기본 시스템 작업을 제어하기 위한 옵션 세트가 포함되어 있다.

참고 URL



2. Systemd 내에서 서비스별 설정

2.1) 디렉토리 생성
# mkdir /etc/systemd/system/rabbitmq-server.service.d

2.2) limit 파일 생성 및 설정
# vim /etc/systemd/system/rabbitmq-server.service.d/limits.conf
[Service]
LimitNOFILE=64000


2.3) limit 확인
# cat /proc/[PID]/limits


3. Service Daemon File에서 설정

Service Daemon 별로 limits 설정값을 다르게 설정할 수 있다. 이 이유는 systemd는 작은 구성 파일과 완전히 병렬로 서비스 시작을 지원하는 새로운 init 시스템이기 때문이다.

systemctl status [Service] 명령으로 서비스의 실행 파일 위치를 찾는다.


서비스 실행 파일을 찾았다면 vi를 통해 해당 파일 내에서 limits에 대한 부분을 수정할 수 있다.

# vim /lib/systemd/system/nginx.service


[Service] 항목안에 설정되어야 하며 이 파일안에서 설정할 수 있는 옵션 리스트는 아래와 같다.

Options

Directive    
ulimit equivalent
Unit
LimitCPU=
ulimit -t
Seconds
LimitFSIZE=
ulimit -f
Bytes
LimitDATA=
ulimit -d
Bytes
LimitSTACK=
ulimit -s
Bytes
LimitCORE=
ulimit -c
Bytes
LimitRSS=
ulimit -m
Bytes
LimitNOFILE=
ulimit -n
Number of File Descriptors
LimitAS=
ulimit -v
Bytes
LimitNPROC=
ulimit -u
Number of Processes
LimitMEMLOCK=
ulimit -l
Bytes
LimitLOCKS=
ulimit -x
Number of Locks
LimitSIGPENDING=
ulimit -i
Number of Queued Signals
LimitMSGQUEUE=
ulimit -q
Bytes
LimitNICE=
ulimit -e
Nice Level
LimitRTPRIO=
ulimit -r
Realtime Priority
LimitRTTIME=
No equivalent
Microseconds


참고 URL





반응형

'Linux' 카테고리의 다른 글

nf_conntrack_max  (1) 2020.10.25
Linux ReadLink  (0) 2020.10.25
Linux Namespace  (0) 2018.12.17
Linux Service 만들기 (CentOS7)  (0) 2018.11.14
lvm의 기본 개념  (0) 2018.10.12

+ Recent posts