우리 서버 중 하나가 응용 프로그램에 매우 높은 CPU로드를 경험하고 있습니다. 다양한 통계를 살펴보고 문제의 원인을 찾는 데 문제가 있습니다.높은 CPU, 컨텍스트 전환으로 인한 것일 수 있습니까?
현재 이론 중 하나는 너무 많은 스레드가 관련되어 있으며 동시에 실행중인 스레드의 수를 줄이려고한다는 것입니다. 3000 개의 쓰레드가있는 하나의 메인 쓰레드 풀과 그것으로 작업하는 WorkManager가 있습니다 (이것은 Java EE - Glassfish입니다). 임의의 주어진 순간에 병렬로 수행해야하는 약 620 개의 개별 네트워크 IO 작업이 있습니다 (java.NIO 사용은 옵션이 아님). 또한 IO가 포함되지 않은 병렬 처리가 약 100 개 수행됩니다.
이 구조는 효율적이지 않으며 실제로 손상을 일으키는 지보고 싶거나 단순히 나쁜 습관입니다. 어떤 변화가이 시스템에서 (인력면에서) 상당히 비싸다는 이유로 어떤 문제에 대한 증거가 필요합니다.
이제 우리는 필요한 동시 작업보다 훨씬 많은 스레드가있는 경우 스레드의 컨텍스트 전환이 원인인지 궁금해합니다. 로그를 보면 평균적으로 주어진 초에 14 개의 다른 스레드가 실행되는 것을 볼 수 있습니다. 우리가 두 개의 CPU (아래 참조)의 존재를 고려한다면, 그것은 CPU 당 7 개의 쓰레드입니다. 이것은 너무 많이 들리지는 않지만 우리는 이것을 검증하기를 원했습니다.
문맥 전환이나 너무 많은 스레드를 문제로 배제 할 수 있습니까?
일반 세부 :
- 자바 1.5 (예, 그것은 옛날의), CentOS는 5, 64 비트, 리눅스 커널에서 실행되는 2.6.18-128.el5
- 하나의 단일 자바 프로세스가 그 기계에는 아무것도 없다.
- 두 개의 CPU, VMware 기반.
- 8GB RAM
- 시스템에서 프로파일 러를 실행할 수있는 옵션이 없습니다.
- Java 또는 OS를 업그레이드 할 수있는 옵션이 없습니다. 아래의 조언, 우리는 평균 부하 (사용 가동 시간)과 CPU의 캡처를 수행 한 것처럼
UPDATE (vmstat를 사용하여 1 120) 다양한 부하와의 테스트 서버에서. 우리는 시스템이 새로운 부하 주위에 안정화되도록 각 부하 변화와 그 측정 사이 15 분 기다렸는데 부하 평균 번호는 업데이트됩니다 : 프로덕션 서버의 워크로드의
50 % : http://pastebin.com/GE2kGLkk
(34) 프로덕션 서버의 작업 부하 % http://pastebin.com/V2PWq8CG
프로덕션 서버의 워크로드의25 % : http://pastebin.com/0pxxK0Fu
CPU 사용량이 부하가 감소로 감소하지만 25~50%에서 매우 급격한 수준 (변화 것으로 보인다 %는 실제로 50 %가 아닙니다. CPU 사용량 감소). 로드 평균은 작업량과 관련이없는 것 같습니다.
우리의 테스트 서버가 VM이기 때문에 동일한 호스트에서 실행중인 다른 VM이 CPU 측정에 영향을 줄 수 있습니까?http://pastebin.com/DvNzkB5z
2 부 : http://pastebin.com/72sC00rc
파트 3 : http://pastebin.com/YTG9hgF5
그럼 스레드 풀의 스레드 수를 줄이고 도움이되는지 확인해보십시오. – Voo
CPU 사용률이 높을 수 있습니다. 즉, CPU 리소스 사용률이 최적이라는 의미입니다. 스레드가 I/O 또는 잠금을 기다리지 않고 뭔가를 계산하고 있습니다. 불필요하게 CPU를 소비하는 엄격한 루프가 아니라면 달성해야하는 높은 수준의 동시성에 만족해야합니다. – dasblinkenlight
@dasblinkenlight 컨텍스트 스위칭과 같은 낭비가 없다는 것을 증명할 수 있다면 사실입니다.우리가 그렇게 할 수 있다면 시스템 팀에게 더 많은 CPU를 추가하고 그 이유를 정당화 할 수 있습니다. 그러나 우선, 우리는 숙제를해야합니다. – Yon