빅데이터·컨테이너 플랫폼의 사전 요구사항에 자주 나오는 두 값이다.
echo 2000000 > /proc/sys/kernel/threads-max
echo 8000000 > /proc/sys/vm/max_map_count
| 값 | 의미 |
|---|---|
kernel.threads-max |
시스템 전체가 만들 수 있는 스레드(태스크)의 최대 개수 |
vm.max_map_count |
프로세스 하나가 가질 수 있는 메모리 매핑 영역의 최대 개수 |
vm.max_map_count 는 자주 오해되는데 용량 제한이 아니다. 단위는 MB 가 아니라 "매핑 영역의 개수" 다. 기본값 65530 은 65530 개의 mmap 영역을 뜻하고, 영역 하나의 크기는 제각각이라 이 값으로 메모리 총량을 환산할 수 없다.
Elasticsearch · OpenSearch 가 기동 시 이 값을 요구하고, JVM 이 많은 힙 영역과 파일 매핑을 쓰는 경우에도 부족해진다. 부족하면 대개 이런 형태로 실패한다.
java.lang.OutOfMemoryError: Map failed
mmap: Cannot allocate memory
sysctl kernel.threads-max vm.max_map_count kernel.pid_max
cat /proc/sys/kernel/threads-max
# 전체 스레드 수
ps -eLf | wc -l
# 또는
cat /proc/loadavg # 네 번째 필드가 실행중/전체 태스크
# 프로세스 수
ps -e --no-headers | wc -l
wc -l < /proc/<pid>/maps
ps -eo pid,comm,rss --sort=-rss | head -11
rss 단위는 KB 다.
/proc/sys 에 직접 쓴 값은 재부팅하면 사라진다.
# /etc/sysctl.d/90-platform.conf
kernel.threads-max = 2000000
vm.max_map_count = 8000000
sysctl --system
sysctl kernel.threads-max vm.max_map_count
kernel.threads-max 는 kernel.pid_max 와 함께 봐야 한다. PID 공간이 좁으면 스레드 상한을 올려도 그만큼 만들 수 없다.
위 두 값은 커널 전역 설정이다. 사용자·서비스 단위 제한은 따로 있다.
ulimit -a
cat /proc/<pid>/limits
systemd 로 뜨는 서비스는 ulimit 이나 /etc/security/limits.conf 가 아니라 유닛의 LimitNOFILE · LimitNPROC 을 본다.
[Service]
LimitNOFILE=131072
LimitNPROC=65536