Linux에서 프로세스로 작성할 수있는 최대 스레드 수는 얼마입니까?
이 값을 어떻게 (가능하다면) 수정할 수 있습니까?
Linux에서 프로세스로 작성할 수있는 최대 스레드 수는 얼마입니까?
이 값을 어떻게 (가능하다면) 수정할 수 있습니까?
답변:
Linux에는 프로세스 당 별도의 스레드가 없으며 시스템의 총 프로세스 수에 대한 제한 (스레드는 기본적으로 Linux의 공유 주소 공간이있는 프로세스)으로 다음과 같이 볼 수 있습니다.
cat /proc/sys/kernel/threads-max
기본값은 메모리 페이지 수 / 4입니다. 이것을 다음과 같이 늘릴 수 있습니다.
echo 100000 > /proc/sys/kernel/threads-max
단일 사용자가 만들 수있는 프로세스 수 (따라서 스레드)에도 ulimit/getrlimit
제한이 있습니다. 이러한 제한에 대한 자세한 내용을 참조하십시오 .
E667: Fsync failed
를 저장하려고하면 얻을 수 있습니다.
LINUX에 프로세스 제한 당 별도의 스레드가 없다고 말하는 것은 잘못된 것입니다.
리눅스는 프로세스 당 최대 스레드 수를 간접적으로 구현합니다 !!
number of threads = total virtual memory / (stack size*1024*1024)
따라서 전체 가상 메모리를 늘리거나 스택 크기를 줄이면 프로세스 당 스레드 수를 늘릴 수 있습니다. 그러나 스택 크기를 너무 줄이면 스택 오버플로로 인해 코드 오류가 발생할 수 있으며 최대 가상 메모리는 스왑 메모리와 같습니다.
기계 점검 :
총 가상 메모리 : ulimit -v
(기본값은 무제한이므로이를 늘리려면 스왑 메모리를 늘려야합니다)
총 스택 크기 : ulimit -s
(기본값은 8Mb)
이 값을 늘리는 명령 :
ulimit -s newvalue
ulimit -v newvalue
* 새 값을 한계로 설정하려는 값으로 바꾸십시오.
참고 문헌 :
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
ulimit -s
. 가능한 스레드 ID가있는 한 많은 스레드를 작성하는 것이 가능합니다. 64 비트 리눅스에서는 스레드 ID보다 더 많은 스레드를 생성하는 것이 "가능하다"(물론 불가능하지만 스택이 진행되는 한). 3. 스택 예약, 커밋 및 VM은 OC와는 다른 것입니다.
실제적으로 한계는 일반적으로 스택 공간에 의해 결정됩니다. 각 스레드가 1MB 스택을 얻는다면 (Linux에서 기본값인지 기억할 수 없습니다), 3000 비트 후에 32 비트 시스템의 주소 공간이 부족합니다 (마지막 gb가 커널에 예약되어 있다고 가정) .
그러나 수십 개 이상의 스레드를 사용하면 성능이 크게 저하 될 수 있습니다. 조만간 너무 많은 컨텍스트 전환 오버 헤드, 스케줄러의 오버 헤드 등이 발생합니다. (많은 스레드를 생성하는 것은 많은 메모리를 소비하는 것 이상은 아닙니다. 그러나 실제 작업 을 수행 하는 많은 스레드 는 사용 가능한 CPU 시간 동안 싸우면서 속도가 느려집니다)
이 한도와 관련하여 무엇을하고 있습니까?
리눅스에서 적절한 100k 스레드 :
ulimit -s 256
ulimit -i 120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max
./100k-pthread-create-app
시스템 시스템에서 @Thomas의 2018 업데이트 :
/etc/systemd/logind.conf: UserTasksMax=100000
@dragosrsupercool
Linux는 가상 메모리를 사용하여 최대 스레드 수를 계산하지 않지만 시스템에 설치된 실제 램
max_threads = totalram_pages / (8 * 8192 / 4096);
http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/
커널 / 포크
/* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
따라서 설치된 램의 크기가 다를 수 있기 때문에 스레드 최대는 모든 시스템마다 다릅니다 .Linux는 가상 메모리를 늘릴 필요가 없다는 것을 알고 있습니다 .32 비트에서는 사용자 공간에 3GB, 커널에 1GB가 있으므로 64 비트에서 128TB의 가상 메모리를 얻었습니다. Solaris에서 발생합니다. 가상 메모리를 늘리려면 스왑 공간을 추가해야합니다.
검색하려면 다음을 수행하십시오.
cat /proc/sys/kernel/threads-max
설정하려면
echo 123456789 > /proc/sys/kernel/threads-max
123456789 = 스레드 수
>
) 부분이 손실 됨 sudo
: tryecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
스레드 수 제한 :
$ cat /proc/sys/kernel/threads-max
계산 방법 :
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
x86_64 페이지 크기 (PAGE_SIZE)는 4K입니다. 다른 모든 아키텍처와 마찬가지로 x86_64에는 모든 활성 스레드에 대한 커널 스택이 있습니다. 이 스레드 스택은 THREAD_SIZE (2 * PAGE_SIZE)입니다.
mempages의 경우 :
cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';
실제로 숫자는 스레드 메모리 스택 크기 제한과 관련이 없습니다.ulimit -s
)의 .
추신 : 스레드 메모리 스택 제한은 rhel VM에서 10M이며 1.5G 메모리의 경우이 VM은 150 스레드 만 감당할 수 있습니까?
내 경우 Redhat Linux 2.6에서 ulimit를 사용하여 스레드 당 스택 크기를 확인하십시오.
ulimit -a
...
stack size (kbytes, -s) 10240
각 스레드는 스택에 할당 된이 메모리 양 (10MB)을 가져옵니다. 32 비트 프로그램과 최대 주소 공간 4GB를 사용하면 최대 4096MB / 10MB = 409 스레드입니다 !!! 마이너스 프로그램 코드, 마이너스 힙 공간은 아마도 최대 값으로 이어질 것입니다. 300 개의 스레드.
64 비트에서 컴파일 및 실행하거나 ulimit -s 8192 또는 ulimit -s 4096을 설정하여이 값을 올릴 수 있어야합니다. 그러나 이것이 바람직하다면 다른 토론입니다 ...
예, 스레드 수를 늘리려면 가상 메모리를 늘리거나 스택 크기를 줄여야합니다. Raspberry Pi에서는 스택 크기를 기본 8MB에서 1MB로 줄이면 가상 메모리를 늘리는 방법을 찾지 못했습니다. 프로세스 당 1000 개가 넘는 스레드를 얻을 수 있지만“ulimit -s”명령으로 스택 크기를 줄일 수 있습니다 모든 스레드에 대해이 작업을 수행하십시오. 따라서 pthread_t를 사용하여 각 스레드 당 스택 크기를 설정할 수 있기 때문에 내 솔루션은 "pthread_t"인스턴스 "thread class"를 사용했습니다. 마지막으로, 프로세스 당 1000 개 이상의 스레드를 Raspberry Pi에서 각각 1MB의 스택으로 보관할 수 있습니다.