1. ulimit 개요
- ulimit은 리눅스와 유닉스 계열 운영체제에서 프로세스가 사용할 수 있는 시스템 리소스의 제한을 설정하는 도구입니다.
- 이러한 제한은 시스템의 안정성, 보안 및 성능에 직접적인 영향을 미칩니다.
- ulimit은 크게 두 가지 유형의 제한을 다룹니다:
- 소프트 제한(soft limit): 프로세스가 기본적으로 따르는 제한이지만, 필요에 따라 프로세스 자체가 제한을 하드 제한까지 늘릴 수 있습니다.
- 하드 제한(hard limit): 소프트 제한의 상한선으로, 루트 권한 없이는 변경할 수 없습니다.
1.1 ulimit의 중요성
- 시스템 보호: 특정 프로세스가 시스템 리소스를 독점하여 시스템 전체가 불안정해지는 것을 방지합니다.
- 자원 분배: 여러 사용자와 프로세스 간에 시스템 리소스를 공정하게 분배할 수 있습니다.
- 애플리케이션 안정성: 애플리케이션이 사용할 수 있는 리소스에 명확한 경계를 설정하여 예측 가능한 동작을 보장합니다.
- 성능 최적화: 특정 워크로드에 맞게 제한을 조정하여 시스템과 애플리케이션의 성능을 최적화할 수 있습니다.
2. ulimit 기본 사용법
2.1 현재 제한 확인하기
현재 쉘 세션에 설정된 ulimit 값을 확인하는 방법은 다음과 같습니다:
# 모든 제한 확인
ulimit -a
# 특정 제한 확인 (예: 최대 오픈 파일 수)
ulimit -n
일반적인 ulimit 출력 예시:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7595
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) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
2.2 제한 설정하기
ulimit 값을 변경하는 기본 문법은 다음과 같습니다:
# 소프트 제한 설정
ulimit -S -n 4096
# 하드 제한 설정
ulimit -H -n 8192
# 소프트 및 하드 제한을 동시에 설정
ulimit -n 4096
주의사항
일반 사용자는 하드 제한을 초과하여 소프트 제한을 늘릴 수 없으며, 소프트 제한을 낮출 수는 있지만 다시 높일 수는 없습니다. 루트 사용자만 하드 제한을 변경할 수 있습니다.
2.3 주요 ulimit 옵션
옵션 | 설명 | 단위 |
---|---|---|
-c | 최대 코어 파일 크기 | 블록 |
-d | 프로세스 데이터 세그먼트 최대 크기 | KB |
-f | 쉘에서 생성 가능한 파일의 최대 크기 | 블록 |
-l | 프로세스가 잠글 수 있는 최대 메모리 크기 | KB |
-m | 최대 상주 메모리 크기 | KB |
-n | 최대 오픈 파일 수(파일 디스크립터) | 개수 |
-s | 최대 스택 크기 | KB |
-t | 최대 CPU 시간 | 초 |
-u | 사용자당 최대 프로세스 수 | 개수 |
-v | 최대 가상 메모리 크기 | KB |
3. 영구적인 ulimit 설정
3.1 /etc/security/limits.conf 파일
- ulimit 설정을 영구적으로 적용하려면
/etc/security/limits.conf
파일을 편집해야 합니다
sudo vi /etc/security/limits.conf
기본 형식은 다음과 같습니다:
<domain> <type> <item> <value>
<domain>
: 설정이 적용될 사용자, 그룹 또는 와일드카드<type>
: 'soft'(소프트 제한) 또는 'hard'(하드 제한)<item>
: 제한할 리소스 유형<value>
: 제한 값
예시:
# 모든 사용자에게 최대 오픈 파일 수 설정
* soft nofile 4096
* hard nofile 8192
# 특정 사용자에게 최대 프로세스 수 설정
webuser soft nproc 2048
webuser hard nproc 4096
# 특정 그룹에게 최대 메모리 잠금 설정
@dbadmin soft memlock unlimited
@dbadmin hard memlock unlimited
3.2 /etc/security/limits.d/ 디렉토리
최신 리눅스 배포판에서는 /etc/security/limits.d/
디렉토리 아래에 개별 설정 파일을 생성하는 방식을 권장합니다:
sudo vi /etc/security/limits.d/90-nproc.conf
형식은 limits.conf와 동일합니다:
# 사용자 'nginx'의 프로세스 및 파일 제한 설정
nginx soft nproc 2048
nginx hard nproc 4096
nginx soft nofile 30000
nginx hard nofile 40000
3.3 systemd 서비스 제한 설정
systemd에서 관리하는 서비스의 경우, 서비스 단위 파일에서 직접 제한을 설정할 수 있습니다:
sudo systemctl edit nginx.service
그리고 다음과 같이 설정을 추가합니다:
[Service]
LimitNOFILE=65536
LimitNPROC=4096
변경 후 서비스를 재시작해야 합니다:
sudo systemctl daemon-reload
sudo systemctl restart nginx.service
4. 일반적인 ulimit 이슈와 해결 방법
4.1 "Too many open files" 오류
가장 흔한 ulimit 관련 오류 중 하나로, 최대 오픈 파일 수(nofile) 제한에 도달했을 때 발생합니다.
문제 진단
# 현재 프로세스의 오픈 파일 수 확인
lsof -p $(pgrep -f process_name) | wc -l
# 시스템 전체에서 가장 많은 파일을 열고 있는 프로세스 확인
lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head -10
해결 방법
# limits.conf 파일 수정
sudo vi /etc/security/limits.conf
# 다음 라인 추가
* soft nofile 65536
* hard nofile 65536
# 변경 사항 적용을 위해 재로그인 필요
4.2 "Cannot allocate memory" 또는 "Out of memory" 오류
이 오류는 일반적으로 메모리 관련 제한에 도달했을 때 발생합니다.
문제 진단
# 현재 메모리 사용량 확인
free -h
# 특정 프로세스의 메모리 사용량 확인
ps -o pid,user,%mem,rss,command -p $(pgrep -f process_name)
해결 방법
# 가상 메모리 제한 확인
ulimit -v
# limits.conf에서 가상 메모리 제한 변경
sudo vi /etc/security/limits.conf
# 다음 라인 추가
* soft as unlimited
* hard as unlimited
4.3 스택 크기 제한 문제
재귀적인 함수 호출이 많은 애플리케이션에서 "Segmentation fault" 오류가 발생할 수 있습니다.
문제 진단
# 현재 스택 크기 제한 확인
ulimit -s
해결 방법
# 임시로 스택 크기 제한 늘리기
ulimit -s 16384
# 영구적으로 스택 크기 제한 변경
sudo vi /etc/security/limits.conf
# 다음 라인 추가
* soft stack 16384
* hard stack 16384