ulimit 은 셸과 그 셸이 띄운 프로세스가 쓸 수 있는 자원의 상한이다. 값은 프로세스마다 따로 있고, 로그인할 때 PAM 모듈 pam_limits 가 /etc/security/limits.conf 와 /etc/security/limits.d/*.conf 를 읽어 세션에 적용한다. systemd 가 직접 띄우는 서비스는 PAM 을 거치지 않으므로 유닛 파일에서 따로 준다.
| 항목 | 뜻 | 기본값 (대개) |
|---|---|---|
nofile |
프로세스가 동시에 열 수 있는 파일 서술자 수 | soft 1024 · hard 524288 (RHEL 8+), 4096 (RHEL 7 hard) |
nproc |
사용자가 띄울 수 있는 프로세스(스레드) 수 | 메모리에 비례해 자동 계산 |
memlock |
잠글 수 있는 메모리 | 64 KiB |
core |
코어 덤프 파일 크기 | 0 |
soft 는 실제 적용되는 값이고 사용자가 hard 까지 올릴 수 있다. hard 는 root 만 올릴 수 있다. Trino · Kafka · Elasticsearch · Hadoop 계열은 nofile 65536 이상을 요구한다.
ulimit -n # nofile soft
ulimit -Hn # nofile hard
ulimit -u # nproc soft
ulimit -Hu # nproc hard
ulimit -a # 전부
이미 떠 있는 프로세스의 값은 /proc 에서 본다.
cat /proc/$(pgrep -o java)/limits | grep -E "open files|processes"
/etc/security/limits.conf 를 직접 고치기보다 /etc/security/limits.d/ 아래에 파일을 두는 편이 패키지 업데이트에 안전하다. 형식은 <도메인> <종류> <항목> <값> 이다.
sudo vi /etc/security/limits.d/90-nofile.conf
# 도메인 종류 항목 값
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
* 는 root 에 적용되지 않는다. root 에도 주려면 root 줄을 따로 쓴다.* 대신 계정 이름, 그룹이면 @그룹 을 쓴다./etc/security/limits.d/20-nproc.conf 가 nproc 을 4096 으로 덮으므로 그 파일을 고치거나 더 큰 번호의 파일에서 다시 준다.sudo su - 계정 으로 전환할 때는 pam_limits 가 다시 돌므로 그 계정의 값이 적용된다.systemctl 로 시작하는 서비스는 limits.conf 를 보지 않는다. 유닛에 LimitNOFILE · LimitNPROC 을 준다.
sudo systemctl edit trino.service
[Service]
LimitNOFILE=131072
LimitNPROC=65536
sudo systemctl daemon-reload
sudo systemctl restart trino.service
모든 서비스의 기본값을 올리려면 /etc/systemd/system.conf 의 DefaultLimitNOFILE= 을 쓰고 재부팅한다.
nofile 의 hard 값은 커널 상한 fs.nr_open (기본 1048576) 을 넘을 수 없다. 그 이상이 필요하면 sysctl 을 먼저 올린다.
sudo sysctl -w fs.nr_open=2097152
sudo sysctl -w fs.file-max=2097152
새 셸에서 ulimit -n · ulimit -u 가 바뀐 값인지, 서비스는 /proc/<pid>/limits 로 본다. Max open files 가 설정값이면 된다.