더 많은 스레드를 사용하는 것이 더 적은 스레드를 사용하는 것보다 느린 이유

더 많은 스레드를 사용하는 것이 더 적은 스레드를 사용하는 것보다 느린 이유

러너 X를 사용해 보세요스레드 8개모든 끝났어n분.
다음을 사용하여 동일한 프로그램을 실행해 보십시오.스레드 50개모든 끝났어n*10분.

이런 일이 발생하는 이유는 무엇이며 사용할 수 있는 최대 스레드 수를 얻으려면 어떻게 해야 합니까?

답변1

"왜 이런 일이 일어나는 걸까요?" 대답은 쉽습니다. 4명이 나란히 앉을 수 있는 복도가 있다고 상상해 보세요. 모든 쓰레기를 한쪽 끝에서 다른 쪽 끝으로 옮기고 싶습니다. 가장 효율적인 인원은 4명입니다.

1~3명이 있으면 복도 공간을 사용할 여유가 없습니다. 5명 이상이면 그 중 적어도 한 명은 기본적으로 다른 사람 뒤에 줄을 서서 기다리고 있습니다. 점점 더 많은 사람을 추가하면 복도가 막힐 뿐 활동 속도가 빨라지지 않습니다.

따라서 대기열을 유발하지 않고 가능한 한 많은 사람을 수용하기를 원합니다. 대기열(또는 병목 현상)이 있는지 여부는 slm 답변의 질문에 따라 다릅니다.

답변2

질문하신 내용은 복잡합니다. 스레드의 특성에 대해 더 많이 알지 못하면 말하기가 어렵습니다. 시스템 성능을 진단할 때 고려해야 할 사항은 다음과 같습니다.

프로세스/스레드입니다

  • CPU 제한(상당한 CPU 리소스 필요)
  • 메모리 제한(대량의 RAM 리소스 필요)
  • I/O 제한(네트워크 및/또는 하드 드라이브 리소스)

세 가지 리소스는 모두 제한되어 있으며 리소스 하나가 시스템 성능을 제한합니다. 특정 상황에서 어느 것이 소비되는지 알아야 합니다(아마도 2 또는 3).

ntop및 을 iostat사용 하여 vmstat무슨 일이 일어나고 있는지 진단할 수 있습니다.

답변3

일반적인 권장 사항은 n+1 스레드입니다. 여기서 n은 사용 가능한 CPU 코어 수입니다. 이렇게 하면 n개의 스레드가 CPU를 사용할 수 있고 1개의 스레드는 디스크 I/O를 기다리고 있습니다. 적은 수의 스레드는 CPU 리소스를 완전히 활용하지 못하며(어느 시점에서는 항상 I/O 대기가 있음) 스레드 수가 많으면 스레드가 CPU 리소스를 놓고 경쟁하게 됩니다.

스레드는 무료가 아니지만 컨텍스트 전환 및 스레드 간에 데이터를 교환해야 하는 경우(흔히 발생하는 경우) 다양한 잠금 메커니즘과 같은 오버헤드가 있습니다. 이는 실제로 코드를 실행하기 위한 전용 CPU 코어가 더 많은 경우에만 가치가 있습니다. 단일 코어 CPU에서는 단일 프로세스(별도의 스레드 없음)가 일반적으로 모든 스레드보다 빠르게 완료됩니다. 스레드는 마술처럼 CPU 실행 속도를 높이는 것이 아니라 추가 작업을 의미할 뿐입니다.

답변4

여기서 범인은 "컨텍스트 전환"이어야 합니다. 다른 스레드 실행을 시작하기 위해 현재 스레드의 상태를 저장하는 프로세스입니다. 여러 스레드에 동일한 우선순위가 부여되면 실행이 완료될 때까지 전환해야 합니다.

귀하의 예에서는 50개의 스레드가 있는 경우 10개의 스레드만 실행하는 것에 비해 많은 컨텍스트 전환이 발생합니다.

컨텍스트 전환으로 인한 시간 오버헤드로 인해 프로그램이 느리게 실행됩니다.

관련 정보