2011-10-14 3 views
5


새로운 요청에 대해 데이터베이스를 폴링하는 서버 프로그램이 있는데이 폴링을 1 분 간격으로 수행하기를 원합니다. Thread.sleep() while 루프.
문제는이 프로그램이 "잠자기"로되어있을 때마다 CPU 소비가 급격히 증가한다는 것입니다 (약 25 ~ 30 %).
역설적으로 프로그램이 휴면 상태가 아니고 요청을 처리하는 중일 때 CPU 사용량은 0.4 %로 떨어집니다.
온라인을 읽고 thread.sleep과 관련된 성능 관련 히트가 있음을 알았지 만 실용적인 대안을 찾을 수 없습니다 (Thread.wait는 객체에 대한 알림이 필요합니다. 내 시나리오에서는 쓸모가 없습니다)스레드가 Thread.sleep을 사용하여 잠자기 상태 일 때의 CPU 사용량

> 설문 조사
- -> 새로운 기록이

주요 루프 (새로운 요청이없는 경우) 여기에, 아무것도하지 않는 모든 그 골격이 CPU의 소비가 25 %

때 이루어지고있다?
-> Sleep
-> repeat

+0

얼마나 오래 자고 있습니까? 'while' 루프의 나머지 부분은 무엇을하고 있습니까? – EJP

+2

이상 하네. 당신이 묘사하는 것처럼 행동하는 작은 프로그램으로 축소하여 여기에 게시 할 수 있습니까? 최소한, sleep 코드 루프의 뼈대를 보여주십시오 (실제 코드를 사용하십시오). – NPE

+0

실제 잠을자는 곳의 코드 섹션을 제공해주십시오. –

답변

6

개별 CPU 코어의 CPU 소비량을 확인하십시오. 4 코어 머신을 사용하고 있다면, 한 스레드가 불량으로 가고 코어 (25 %)를 한 번 먹어 버리는 것일 수도 있습니다. 스레드가 좁은 루프에있을 때 일반적으로 발생합니다.

Thread.wait (실제로는 Timer 클래스)의 시간 제한을 사용할 수 있지만 내 차이는 없습니다. Thread.sleepThread.wait은 스레드의 상태를 not runnable으로 변경합니다. JVM 구현 등에 따라 다르지만 스레드는 그러한 상황에서 그만큼의 CPU를 소비하지 않아야합니다. 그래서 내 일은 직장에 버그가 있다는 것입니다.

당신이 할 수있는 또 다른 일은 스레드 덤프를 가져 와서이 일이 발생했을 때 스레드가 무엇을하는지 봅니다. 리눅스 박스에서 kill -3을 사용하거나 윈도우를 사용한다면 자바 콘솔 윈도우에서 ctrl + break를 사용하십시오. 그런 다음 표준 출력으로 덤프 된 스레드 덤프를 검사하십시오. 그런 다음 스레드가 실제로 잠자고 있거나 다른 작업을하고 있는지 확인할 수 있습니다.

3

많은 사람들이 지적했듯이 Thread.sleep은 CPU 사용량을 대폭 줄여야합니다.
본인의 원래 질문과 관련이없는 것으로 판단하여 사실을 생략했습니다.
주 스레드는 제작자 였고 다른 스레드가 비동기 적으로 실행되어 소비자였습니다. 이 스레드의 "sleep"은 제대로 트리거되지 않은 이상한 상태였습니다. 그 스레드의 루프는 결코 자지 않았습니다.
수면이 없어지면 문제를 깨닫기 위해 자세히 분석했습니다.