문제

Java 1.6 x64에서 대기 상태에 있는 많은 스레드를 갖는 것이 얼마나 비용이 많이 드는지 궁금합니다.

좀 더 구체적으로 말하자면, 저는 여러 컴퓨터에서 실행되고 컴퓨터 간에 데이터를 보내고 받는 응용 프로그램을 작성하고 있습니다.1) 데이터 전송, 2) 데이터 수신, 3) 연결이 끊어졌을 때 연결 재설정과 같이 연결된 각 컴퓨터 및 작업에 대해 별도의 스레드를 갖는 것이 더 편합니다.따라서 클러스터에 N개의 노드가 있는 경우 각 머신은 N-1개의 이웃 각각에 대해 3개의 스레드를 갖게 됩니다.일반적으로 12개의 시스템이 있으며 이는 33개의 통신 스레드에 해당합니다.

대부분의 스레드는 대부분의 시간 동안 휴면 상태이므로 최적화 목적으로 스레드 수를 줄이고 각 스레드에 더 많은 작업을 제공할 수 있습니다.예를 들어요.연결을 다시 설정하는 것은 스레드를 수신하는 책임입니다.또는 연결된 모든 시스템으로의 전송은 단일 스레드로 수행됩니다.

그렇다면 잠자는 스레드가 많으면 성능에 상당한 영향이 있습니까?

도움이 되었습니까?

해결책

대부분의 경우 휴면 스레드가 소비하는 리소스는 스택 공간입니다.귀하가 설명하는 것과 유사하다고 생각되는 연결당 2개의 스레드 모델을 사용하는 것은 연결 수가 증가할 때 바로 이러한 이유로 큰 확장성 문제를 일으키는 것으로 알려져 있습니다.

나 자신도 이런 상황에 처해 있었고, 연결 수가 500개(약 1,000개의 스레드) 이상으로 증가하면 스레드 스택 공간 사용량이 최대 용량을 초과하므로 OutOfMemoryError가 발생하는 경우가 많이 발생하는 경향이 있습니다. 단일 프로세스에 대한 메모리입니다.적어도 우리의 경우에는 32비트 Windows 세계의 Java에 있었습니다.조정하고 조금 더 발전할 수는 있겠지만 결국에는 많은 메모리를 낭비하기 때문에 확장성이 별로 좋지 않습니다.

많은 수의 연결이 필요한 경우 Java NIO(새 IO 등)를 사용하면 동일한 스레드에서 많은 연결을 처리할 수 있습니다.

그렇긴 하지만, 여전히 리소스 낭비일지라도 합리적으로 현대적인 서버에서 스레드가 100개 미만인 경우에는 큰 문제가 발생해서는 안 됩니다.

다른 팁

NIO로 전환하기 전에도 거의 같은 문제가 있었기 때문에 Liedman의 추천에 따라 해당 프레임워크를 사용하겠습니다.튜토리얼을 찾을 수 있어야 하지만, 자세한 내용을 원하시면 추천해 드릴 수 있습니다. 자바 NIO 론 히친스 지음.

NIO로 전환하면 처리할 수 있는 연결 수가 많이 늘어났는데, 이는 우리에게 정말 중요했습니다.

이것은 잘 확장되지 않습니다.스레드 수가 많다는 것은 VM이 컨텍스트 전환에 더 많은 시간을 소비해야 한다는 것을 의미하며, 각 스레드에는 자체 스택 공간이 필요하기 때문에 메모리 사용량도 더 높아집니다.파이프라인 방식으로 처리하는 스레드 수를 줄이거나 비동기 기술로 스레드 풀을 사용하는 것이 더 나을 것입니다.

많은 스레드는 많은 스택 공간과 동일하며 메모리를 소모하게 됩니다. -Xss 설정에서 얼마나 많은지 확인한 다음 계산해 보십시오.

그리고 어떤 이유로든 informAll()을 수행해야 한다면 당연히 많은 추가 스레드를 깨우게 됩니다. 하지만 제안된 아키텍처에서는 그렇게 할 필요가 없을 수도 있습니다.

이 모델에서 청취 소켓당 하나의 스레드를 갖는 것을 쉽게 피할 수 있을지 확신할 수 없습니다(비록 NIO에 대해 아는 바가 거의 없지만 이 문제도 해결할 수 있음). java.util.concurrent.Executor 너무 많은 추가 스레드가 맴돌지 않도록 적절한 방법으로 인터페이스와 구현 클래스를 제공합니다.실제로, ThreadPoolExecutor 청취 스레드를 관리하는 좋은 방법일 수도 있으므로 불필요하게 스레드를 생성하고 삭제하는 데 너무 많은 시간을 소비하지 않아도 됩니다.

C, Lua 및 Python에서 수행한 테스트를 통해 매우 적은 코드 줄로 간단한 경량 루프를 만들 수 있는 자체 절전 또는 대기 기능을 만들 수 있습니다.도달하려는 미래의 시간과 함께 지역 변수를 사용한 다음 while 루프에서 현재 타임스탬프를 테스트합니다.fps로 작업하는 범위에 있는 경우 대기 기능이 프레임당 한 번씩 실행되도록 하여 리소스를 절약하세요.더 높은 정밀도가 필요할수록 타임스탬프가 초 단위로 제한되므로 타임스탬프 대신 시계를 사용하는 것이 좋습니다.대기 함수에 더 많은 코드 라인을 추가할수록 정확성이 떨어지고 더 많은 리소스를 소비하게 됩니다. 단, 10라인 미만이면 충분합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top