데비안 설치 시 `threads-max`가 낮음

데비안 설치 시 `threads-max`가 낮음

저는 4코어/8GB RAM(A와 B로 이름 지정)을 사용하는 두 개의 서로 다른 Debian 10 설치를 가지고 있습니다.

그러나 의 가치는 /proc/sys/kernel/threads-max매우 다릅니다.A=63388 및 B=7055.

thread-max 값은 total virtual memory / stack size[1]. 스택 크기와 가상 메모리의 값은 두 설치에서 동일하며( ulimit -s=8192, ulimit -v=무제한) 두 시스템 모두에서 스왑이 꺼져 있습니다. 또한 다른 sysctl 관련 구성은 두 VM에서 유사합니다.

그렇다면 threads-max두 시스템의 차이점이 나타나는 이유는 무엇입니까?

PS1: 값은 cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}'A=2359295 및 B=6029273입니다.

PS2: 커널 부팅 플래그이며 /etc/initramfs-tools/modulesA/B에서도 동일합니다. A는 vmware를 사용하여 프로비저닝되고 B는 proxmox를 사용하여 프로비저닝됩니다.

dmesg | grep Memory:PS3: 두 VM에서 다른 점 을 발견했습니다 . (https://github.com/torvalds/linux/blob/v4.19/mm/page_alloc.c#L7060)

A| Memory: 8113684K/8388020K available (10252K kernel code, 1241K rwdata, 3320K rodata, 1592K init, 2272K bss, 274336K reserved, 0K cma-reserved)
B| Memory: 903068K/1048032K available (10252K kernel code, 1242K rwdata, 3328K rodata, 1600K init, 2260K bss, 144964K reserved, 0K cma-reserved)

그리고 8113684 / 903068 = 63388 / 7055!!

답변1

4.19.170 소스에서 Documentation/sysctl/kernel.txt 파일에:

스레드 최대

이 값은 fork()를 사용하여 생성할 수 있는 최대 스레드 수를 제어합니다.

초기화 중에 커널은 최대 스레드 수가 생성되더라도 스레드 구조가 사용 가능한 RAM 페이지의 일부(1/8)만 차지하도록 이 값을 설정합니다.

thread-max에 쓸 수 있는 최소값은 20입니다. thread-max에 쓸 수 있는 최대값은 FUTEX_TID_MASK(0x3fffffff) 상수로 지정됩니다. 이 범위를 벗어나는 값이 thread-max에 기록되면 오류 EINVAL이 발생합니다.

기록된 값은 사용 가능한 RAM 페이지와 비교하여 확인됩니다. 스레드 구조가 사용 가능한 RAM 페이지의 1/8 이상을 너무 많이 차지하면 그에 따라 thread-max가 줄어듭니다.

이는 이 매개변수를 직접 또는 다음을 사용하여 설정할 수 있음을 의미합니다.

# sysctl kernel.threads-max=255353

두 시스템의 커널 버전이 다르거나 부트스트래핑 프로세스가 다르거나 시스템 구성이 다르기 때문에 이 값은 두 시스템에서 다릅니다. 또한 명시된 대로 값은 다른 두 개의 구성 가능한 매개변수에 따라 달라지며 시스템이 동일하지 않기 때문에 서로 다른 값을 가져야 합니다.

관련 정보