Linux에서 프로세스로 작성할 수있는 최대 스레드 수는 얼마입니까?
이 값을 어떻게 (가능하다면) 수정할 수 있습니까?
답변
Linux에는 프로세스 당 별도의 스레드가 없으며 시스템의 총 프로세스 수에 대한 제한 (스레드는 기본적으로 Linux의 공유 주소 공간이있는 프로세스)으로 다음과 같이 볼 수 있습니다.
cat /proc/sys/kernel/threads-max
기본값은 메모리 페이지 수 / 4입니다. 이것을 다음과 같이 늘릴 수 있습니다.
echo 100000 > /proc/sys/kernel/threads-max
단일 사용자가 만들 수있는 프로세스 수 (따라서 스레드)에도 ulimit/getrlimit
제한이 있습니다. 이러한 제한에 대한 자세한 내용을 참조하십시오 .
답변
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/
답변
실제적으로 한계는 일반적으로 스택 공간에 의해 결정됩니다. 각 스레드가 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 = 스레드 수
답변
스레드 수 제한 :
$ 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 스레드 만 감당할 수 있습니까?