최근에, 개방형 최대 동시에 동시에 테스트하려면 클라이언트를 시뮬레이션하기 위해 많은 수의 스레드를 열어야합니다. JVM 인스턴스가 열 수있는 스레드 수에 대해 항상 당황 했으므로 테스트하고 스레드 수에 영향을 미치는 다음 요소를 찾을 계획입니다.
-xms | 과장된 자바 힙 크기 |
-xmx | 최대 자바 힙 크기 |
-xss | 각 스레드의 스택 크기 |
시스템 제한 | 시스템에서 열 수있는 최대 스레드 수 |
테스트 프로그램은 다음과 같습니다. Java 코드 :
import java.util.concurrent.atomic.atomicinteger; public class testthread는 스레드를 확장합니다. public static void main (String [] args) {while (true) (new testthread ()). start (); } @override public void run () {system.out.println (count.incrementandget ()); while (true) try {thread.sleep (integer.max_value); } catch (InterruptedException e) {break; }}} 테스트 환경 : 시스템 : Ubuntu 10.04 Linux 커널 2.6 (32 비트)
메모리 : 2G
JDK : 1.7
테스트 결과 :
Ø 시스템 제한이 고려되지 않습니다
-xms | -xmx | -xss | 결과 |
1024m | 1024m | 1024K | 1737 |
1024m | 1024m | 64K | 26077 |
512m | 512m | 64K | 31842 |
256m | 256m | 64K | 31842 |
생성 된 스레드 수가 31,842에 도달하면 시스템에서 스레드를 만들 수 없습니다.
위의 테스트 결과에서 힙 메모리 (-xms, -xmx)를 증가시킬 수있는 스레드의 수를 줄이고 스레드 스택 메모리 (-xss, 32 비트 시스템 에서이 매개 변수의 최소값도 60k)를 생성 할 수있는 스레드 수를 줄일 수 있음을 알 수 있습니다.
Ø 시스템 제한과 결합
스레드 수 31842의 한계는 시스템이 생성 할 수있는 최대 스레드 수에 의해 결정되지만 :/proc/sys/kernel/strook-max이지만 기본값은 32080입니다. 값을 10000 : echo 10000>/proc/sys/kernel/stroods-max로 수정하고 수정 된 결과는 다음과 같습니다.
-xms | -xmx | -xss | 결과 |
256m | 256m | 64K | 9761 |
이 경우 가능한 많은 스레드를 구성 할 수 있다는 것을 의미합니까? 다른 수정 : echo 1000000>/proc/sys/kernel/threads-max, 수정 된 테스트 결과는 다음과 같습니다.
-xms | -xmx | -xss | 결과 |
256m | 256m | 64K | 32279 |
128m | 128m | 64K | 32279 |
32279에 도달 한 후에는 스레드의 수가 더 이상 증가하지 않는 것으로 나타났습니다. 확인 후 32 비트 Linux 시스템으로 생성 할 수있는 최대 PID 수는 32678입니다.이 값은/Proc/Sys/Kernel/Kernel/PID_MAX를 통해 수정할 수 있습니다 (수정 방법은 스레드 MAX와 동일). 스레드 -max가 확실하다면 PID_MAX를 수정하기위한 테스트 결과는 다음과 같습니다.
pid_max | -xms | -xmx | -xss | 결과 |
1000 | 128m | 128m | 64K | 582 |
10000 | 128m | 128m | 64K | 9507 |
Windows의 상황은 비슷해야하지만 Windows에서 생성 할 수있는 스레드 수는 Linux보다 작을 수 있습니다. 스레드 모델을 기반으로 한 서버는 항상 스레드 수로 제한됩니다.
JVM에서 생성 될 수있는 최대 숫자는 JVM의 힙 메모리 크기, 스레드의 스택 메모리 크기 및 시스템이 생성 할 수있는 최대 스레드 수 (Java 스레드의 구현은 Wind 특정 금액은 Java 프로세스가 액세스 할 수있는 최대 메모리 (일반적으로 32 비트 시스템에서 2G), 힙 메모리 및 스레드의 스택 메모리를 기반으로 추정 할 수 있습니다.
순서:
64 비트 Linux 시스템 (CentOS6, 3G Memory)에서 테스트 된 스레드 수를 제한하는 또 다른 매개 변수가 있음을 발견했습니다. MaxuserProcess (Ulimita를 통해 볼 수 있고 기본값은 1024 이며이 값은 Ulimitu를 통해 수정할 수 있음)를 발견했습니다. 이 값은 위의 32 비트 우분투 테스트 환경에서 제한되지 않습니다.
스레드 -max, pid_max, maxuserprocess, 3 개의 매개 변수를 모두 100000, -xms, -xmx를 최대한 작게 (128m, 64m), -xss를 최대한 작게 수정하십시오 (64 비트에서 104k, 값은 128k 일 수 있음). 이 테스트 환경에서 미리 예측 된 스레드 수는 테스트 환경의 메모리 크기 (3G)로만 제한됩니다. 그러나 실제 테스트 결과는 스레드 수가 32k (32768, 생성 된 최대 수는 약 33,000)에 도달하면 JVM이 경고를 던진다는 것입니다. 시도 toAllocatesTestACKGUARDPAGES가 실패한 다음 OutOfMemoryError가 로컬 스레드를 생성 할 수 없다는 것입니다. 메모리를 확인한 후에는 여전히 자유 시간이 많으므로 메모리 용량으로 인한 것이 아닙니다. 구글의 경고는 결실이 없다. 이유를 모르고 추가 연구가 필요합니다.
Step 2:
나는 실수로 오늘 기사를 발견하고 즉시 시도했다. 물론,이 요소는 실 크레오 션의 수에 영향을 미칩니다. 기사의 설명에 따르면,/Proc/Sys/Vm/Max_Map_count의 수는 65536에서 131072로 두 배가됩니다. 생성 된 총 스레드 수는 65000+에 도달했습니다. 컴퓨터는 기본적으로 고정되어야합니다 (3G 메모리) ...이 매개 변수의 기능을 간단히 확인했으며 [8]의 설명은 다음과 같습니다.
“이 파일에는 공유 라이브러리를로드 할 때 MembermapareAreaseussasidaSidaSide-effect Callloc의 최대 메모리 메모 류 프로세스 메스 메이드-효과가 포함되어 있습니다.
대부분의 응용 프로그램은지도보다 적은 응용 프로그램이 필요하지만 특정 프로그램, 특히 Mallocdebuggers는 ASS를 소비 할 수 있습니다.
thedefaultValueis65536. "
좋아,이 문제는 마침내 완전히 해결되었습니다. 마지막으로 Java 스레드의 수에 영향을 미치는 요인이 요약됩니다.
Java Virtual Machine 자체 : -xms, -xmx, -xss;
시스템 제한 :
/proc/sys/kernel/pid_max,
/Proc/Sys/Kernel/Thread-Max,
max_user_process (ulimit-u),
/proc/sys/vm/max_map_count.
요약
위의 모든 것은 최대 스레드 수를 지원하는 JVM의 간단한 테스트에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오.