2012-01-06 3 views
2

나는 멀티 쓰레딩을 사용하여 루프에서 어떤 일을하는 "데몬"과 같은 소프트웨어를 코딩한다. (어딘가에 로그인하고, 일을하고, 로그 아웃한다.) 내 응용 프로그램이 약 1000-2000 개의 스레드를 실행하며이 스레드는 작업을 수행합니다. 그래서 여기에 처음으로 10 ~ 분 내 htop 로그입니다 : 그래서 당신은 스레드의 일부 수 (녹색 R 상태로 주문)를 실행 위의 스크린 샷리눅스에서 자바 쓰레드가 자고있다

에서 볼 그러나 잠시 후 수 Before

이 발생합니다 : After

위에서 볼 수 있듯이 3 개의 스레드가 주기적으로 실행되고 있습니다 (시스템이 느려지거나 잠자는 것처럼 보입니다). 소규모 작업 (약 10 초 ~ 1 분) 동안 응용 프로그램을 실행하고 스레드가 죽은 후에 고정 스레드 풀 실행 프로그램이 동일한 작업을 수행 할 새 스레드를 만듭니다. 그래서 나는 항상 스레드 실행의 속도가 같아야한다는 것을 이해합니다. 하지만 10-20 분 후에 속도가 느려집니다. 일반적으로 ~ 500-200-300-100 스레드까지 htop에서 스레드를 실행하고 매번 ~ 3-30-60 스레드까지 실행합니다. 그러나이 10-20 분 후에 스레드 만 실행됩니다. 그래서 당신은 나에게 어떤 일이 일어나고 어떻게 해결할 수 있는지 말해 줄 수 있습니까?

+2

교착 상태 일 가능성이 있습니까? 또한 - 2000 개의 스레드를 사용하는 경우 디자인 문제가 발생합니다. 정말로 스레드 풀이나 생산자/소비자 모델을 사용해야합니다. –

+0

@Chris "스레드 풀 또는 프로듀서/소비자 모델"은 무엇을 의미합니까? 지금 스레드 풀을 사용하고 있습니다. – purple

+2

아마도 그들은 모두 기다리고 있습니다. 이것은 상당히 합리적입니다. 모든 스레드 스택을 덤프 해봤습니까? JVM에 모든 스레드의 스택을 덤프하는 신호를 보내는 방법이 있습니다 (나는 그것이 무엇인지 모릅니다). – MarkR

답변

1

스레드가 mysql에 액세스하고 있습니까? 100 %에서 실행되는 것을 볼 수 있습니다 ... 스레드가 I/O를 기다리는 경우 커널은 데이터 준비가 완료 될 때까지 잠자기 상태로 만듭니다. 디스크에서 대기중인 경우 부하 평균에 반영된 것으로 보일 수 있으므로 네트워크 데이터를 기다리고있을 수 있습니다 (소켓 등이 제대로 닫히고 있습니까? 원격으로 연결하는 서버가 무엇이든 차단되어 있습니까? 원격 서비스 매달리기?) 또는 mysql 데이터 (연결 풀이 너무 작습니까? mysql이 부하를 처리 할 수 ​​없습니까?).

+0

mysql을 한 번만 사용합니다 (스레드를로드하기 전에). MySQL은 1 분 동안 그리고 그 이후에 원격 서버 대기 응답에 연결되는 고부하 및 스레드에 대해 설정됩니다. – purple

관련 문제