대리자

대리자

Fedora 30(12GB RAM) 및 Ubuntu 16 Linux 시스템(16GB RAM)에 10,000개가 넘는 스레드를 할당하려고 합니다.

약 10,000개의 스레드에서 다음 오류가 발생합니다.

  • Java: 새 기본 스레드를 생성할 수 없습니다.
  • C: 리소스를 일시적으로 사용할 수 없습니다.

Fedora 시스템에 대한 일부 설정을 따르십시오.

$ uname -a

Linux lab21.xxxxx.ix 5.1.11-300.fc30.x86_64 #1 SMP Mon Jun 17 19:33:15 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ ulimit -a

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 47765
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) 47765
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

$ cat /proc/sys/kernel/pid_max
32768
$ cat /proc/sys/kernel/threads-max
95530
**$ cat /proc/meminfo (before the stress test)**

MemTotal:       12257732 kB
MemFree:        11424808 kB
MemAvailable:   11772784 kB
Buffers:           74556 kB
Cached:           487680 kB
SwapCached:            0 kB
Active:           424696 kB
Inactive:         224036 kB
Active(anon):      87056 kB
Inactive(anon):      592 kB
Active(file):     337640 kB
Inactive(file):   223444 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       6003828 kB
SwapFree:        6003828 kB
Dirty:              1576 kB
Writeback:             0 kB
AnonPages:         86496 kB
Mapped:           112124 kB
Shmem:              1152 kB
KReclaimable:      45044 kB
Slab:             100440 kB
SReclaimable:      45044 kB
SUnreclaim:        55396 kB
KernelStack:        3600 kB
PageTables:         3784 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    12132692 kB
Committed_AS:     732436 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             7680 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      121280 kB
DirectMap2M:    12427264 kB

**After the stress test**

MemTotal:       12257732 kB
MemFree:        11014248 kB
MemAvailable:   11363328 kB
Buffers:           75096 kB
Cached:           487988 kB
SwapCached:            0 kB
Active:           517840 kB
Inactive:         221644 kB
Active(anon):     176960 kB
Inactive(anon):      600 kB
Active(file):     340880 kB
Inactive(file):   221044 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       6003828 kB
SwapFree:        6003828 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        176428 kB
Mapped:           112408 kB
Shmem:              1160 kB
KReclaimable:      45576 kB
Slab:             208928 kB
SReclaimable:      45576 kB
SUnreclaim:       163352 kB
KernelStack:      171744 kB
PageTables:        46040 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    12132692 kB
Committed_AS:   86824336 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             7872 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      123328 kB
DirectMap2M:    12425216 kB

Fedore 시스템보다 RAM이 4GB 더 많은 Ubuntu 시스템에서는 13K 이하를 할당할 수 있습니다. 이 차이는 Ubuntu 시스템의 더 큰 메모리와 관련이 있을 수 있습니다.

어떤 팁이 있나요?

답변1

문제는systemd cgroup 제한 사항...

"/sys/fs/cgroup/pids/user.slice/user-$UID.slice/pids.max"를 확인했는데 10.813입니다. 15000으로 늘리고 스레드를 할당합니다.

따라서 Systemd는 cgroup을 사용하여 리소스와 스레드를 제한합니다.

이 글은 진실로 가는 길입니다!

https://askubuntu.com/questions/845380/bash-fork-retry-resource-temporarily-unavailable/883677#883677

답변2

특정 시스템의 리소스 제한을 이해하는 것이 도움이 되지만, 너무 많은 네이티브 스레드를 생성하려고 할 때 이것만으로는 오류의 근본 원인을 파악하는 데 충분하지 않습니다. e 더 흥미로운 점은 반환되는 오류가 pthread_create()리소스 제한이 초과되었음을 알려준다는 것입니다. 알려주지 않는 중요한 정보는 어떤 리소스 제한이 초과되었는지입니다.

이가온- 다른 스레드를 생성하기에는 리소스가 부족하거나 스레드 수에 대한 시스템 제한이 발생했습니다. 후자의 상황은 두 가지 방식으로 발생할 수 있습니다. 즉, 실제 사용자 ID에 대한 프로세스 수를 제한하는 RLIMIT_NPROC 소프트 자원 제한(setrlimit(2)을 통해 설정)에 도달하거나 커널의 스레드 수에 대한 시스템 전체 제한이 발생합니다. /proc/sys가 /kernel/threads-max에 도달했습니다. 원천:https://linux.die.net/man/3/pthread_create

불행하게도 이는 어떤 리소스 제약이 문제를 일으키는지 알아내기 위해 지루한 수동 디버깅을 수행해야 함을 의미합니다.

참고 사항: Java는 ThreadLinux의 POSIX 스레드(pthread)인 운영 체제 기본 스레드를 통해 구현됩니다. C와 동일하므로 증상도 유사합니다.

대리자

귀하에게 효과가 있고 시간을 더 잘 활용할 수 있는 또 다른 대안은 경량 스레드(녹색 스레드라고도 함)를 사용하는 것입니다. 비교하면선제공격Linux 커널이 스레드와 경량 스레드 간의 전환을 담당하는 기본 스레드(예: pthread)에 대한 스레딩 모델은 다음과 같습니다.협력적인이는 경량 스레드가 멀티스레드 실행 느낌을 유지하기 위해 주기적으로 메인 스레드에 양보해야 함을 의미합니다.

표면적으로 이것은 열악한 모델처럼 보일 수 있지만 경량 스레딩의 가장 큰 이점 중 하나는 사용 가능한 리소스에 최소한의 영향을 미치면서 일반적으로 약 100,000개의 스레드를 실행할 수 있다는 것입니다. 분명히 각 경량 스레드에서 파일을 열면 시작한 곳으로 돌아가게 되지만, 경량 스레드를 자세히 살펴보고 이것이 실행 가능한 솔루션인지 확인하는 것이 좋습니다.

관련 정보