jvm 최대 스레드 단순 테스트 지원

최근에 Openfire의 최대 병렬 수를 테스트하려면 클라이언트를 모의하기 위해 대량의 라인을 열어야 합니다.하나의 JVM 실례가 도대체 몇 개의 라인을 열 수 있는지에 대해 의심이 있기 때문에 실제 테스트를 통해 간단하게 구글을 테스트하고자 합니다. 라인의 수량에 영향을 주는 요소를 찾으려면 다음과 같습니다.
-Xms
intial java heap size
-Xmx
maximum java heap size
-Xss
the stack size for each thread
시스템 제한
시스템 최대 오픈 가능 스레드
테스트 프로그램은 다음과 같습니다. Java 코드:

import java.util.concurrent.atomic.AtomicInteger;  
  
public class TestThread extends Thread {  
  private static final AtomicInteger count = new AtomicInteger();  
  
  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 Kernel 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
생성된 스레드 수가 31842개에 달할 때 시스템에서 어떤 스레드도 만들 수 없습니다.
위의 테스트 결과를 통해 알 수 있듯이 메모리 증가(-Xms, -Xmx)는 생성 가능한 스레드 수량을 줄일 수 있고, 메모리 증가(-Xss, 32비트 시스템에서 이 매개 변수 값은 최소 60K)도 생성 가능한 스레드 수량을 줄일 수 있다.
Ø 결합 시스템 제한 사항
스레드 수량 31842의 제한은 시스템이 생성할 수 있는 최대 스레드 수량에 의해 결정됩니다./proc/sys/kernel/threads-max, 기본값은 32080입니다.10000:echo 10000 >/proc/sys/kernel/threads-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/pid_를 통해max는 수정을 합니다. (수정 방법은threads-max와 같습니다.) 그러나 32시스템에서 이 값은 작아질 수 있고 더 클 수 없습니다.threads-max 일정한 상황에서 pid_ 수정max에 대한 테스트 결과는 다음과 같습니다.
pid_max
-Xms
-Xmx
-Xss
결과

128m
128m
64k
582

128m
128m
64k
9507
Windows의 상황은 비슷해야 하지만 Linux보다 Windows에서 만들 수 있는 스레드 수가 더 적을 수 있습니다.스레드 모델을 기반으로 하는 서버는 항상 이 스레드 수량의 제한을 받아야 한다.
JVM에서 생성할 수 있는 최대 수량은 JVM의 더미 메모리 크기, Thread의 Stack 메모리 크기, 시스템이 생성할 수 있는 최대 스레드 수량(Java 스레드의 실현은 베이스 시스템의 스레드 메커니즘을 바탕으로 이루어지고 Windows에서 _beginthreadex, Linux에서 pthread_create) 세 가지 측면에 영향을 미친다.구체적인 수량은 자바 프로세스가 접근할 수 있는 최대 메모리(32비트 시스템의 일반 2G), 더미 메모리, Thread의 Stack 메모리에 따라 추산할 수 있다.
순서:
64비트 Linux 시스템(CentOS6, 3G 메모리)에서 테스트를 했는데 또 하나의 매개 변수는 라인 수량을 제한하는 것을 발견했습니다. maxuserprocess(ulimitCa를 통해 볼 수 있습니다. 기본값 1024,ulimitCu를 통해 이 값을 수정할 수 있습니다). 이 값은 위의 32비트 Ubuntu 테스트 환경에서 제한이 없습니다.
threads-max,pid_max, maxuserprocess, 이 세 가지 매개 변수 값은 모두 100000, -Xms, -Xmx는 가능한 한 작게(128m, 64m), -Xss는 가능한 한 작게(64비트에서 최소 104k, 취할 수 있는 값 128k)로 수정되었습니다.이러한 테스트 환경에서 스레드 수량은 테스트 환경의 메모리 크기(3G)에만 제한될 것이라고 미리 예측했지만 실제 테스트 결과는 스레드 수량이 32K(32768, 가장 많이 생성되었을 때 33000 정도) 정도에 이르렀을 때 JVM은 경고를 던졌다. Attempttoallocatestackguardpagesfailed, 그리고 Out Of Memory Error가 나타나면 로컬 스레드를 만들 수 없다.메모리를 보니 아직 여유가 많기 때문에 메모리 용량의 원인이 아닐 것이다.Google의 이 경고는 결과가 없으며, 당분간 어떤 이유인지 더 연구할 필요가 있습니다.
순서 2:
오늘 무의식중에 문장[7]을 발견하고 바로 시험해 보았습니다. 과연 이 요소는 스레드 생성 수량에 영향을 줄 수 있습니다. 글에서 설명한 바와 같이/proc/sys/vm/max_map_count의 수량이 배로 늘었습니다. 65536에서 131072로 바뀌었습니다. 생성된 스레드의 총 수량은 65000+에 달했습니다. 컴퓨터는 기본적으로 (3G 메모리)가 끊겨야 합니다... 이 파라미터의 작용을 간단히 조사했습니다. [8]에서 설명은 다음과 같습니다.
“Thisfilecontainsthemaximumnumberofmemorymapareasaprocessmayhave.Memorymapareasareusedasaside-effectofcallingmalloc,directlybymmapandmprotect,andalsowhenloadingsharedlibraries.
Whilemostapplicationsneedlessthanathousandmaps,certainprograms,particularlymallocdebuggers,mayconsumelotsofthem,e.g.,uptooneortwomapsperallocation.
Thedefaultvalueis65536.”
OK, 이 문제는 드디어 해결되었습니다. 마지막으로 Java 스레드 수량에 영향을 주는 요소를 요약합니다.
자바 가상 기기 자체: -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 지원 최대 스레드 수 단순 테스트에 관한 모든 내용입니다. 여러분께 도움이 되기를 바랍니다.관심 있는 친구는 본 사이트의 다른 관련 주제를 계속 참고할 수 있습니다. 부족한 점이 있으면 댓글로 지적해 주십시오.

좋은 웹페이지 즐겨찾기