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
.png)
2.3) limit 확인
# cat /proc/[PID]/limits
3. Service Daemon File에서 설정
Service Daemon 별로 limits 설정값을 다르게 설정할 수 있다. 이 이유는 systemd는 작은 구성 파일과 완전히 병렬로 서비스 시작을 지원하는 새로운 init 시스템이기 때문이다.
systemctl status [Service] 명령으로 서비스의 실행 파일 위치를 찾는다.
.png)
서비스 실행 파일을 찾았다면 vi를 통해 해당 파일 내에서 limits에 대한 부분을 수정할 수 있다.
# vim /lib/systemd/system/nginx.service
.png)
[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 |