스레드가 너무 많습니까?


312

서버를 작성 중이며 요청을 받으면 각 작업을 별도의 스레드로 보냅니다. 거의 모든 요청이 데이터베이스 쿼리를 작성하기 때문에이 작업을 수행합니다. 스레드 풀 라이브러리를 사용하여 스레드 구성 / 파괴를 줄입니다.

내 질문은 이것과 같은 I / O 스레드에 대한 좋은 차단 점은 무엇입니까? 나는 그것이 대략적인 추정 일 것이라는 것을 알고 있지만 우리는 수백 가지를 말하고 있습니까? 수천?

이 컷오프가 무엇인지 파악하려면 어떻게해야합니까?


편집하다:

귀하의 응답에 감사드립니다. 실 수를 계산하기 위해 테스트해야 할 것 같습니다. 문제는 그래요. 내가 그 천장을 쳤다는 것을 어떻게 알 수 있습니까? 정확히 무엇을 측정해야합니까?


1
@ryeguy : 여기서 중요한 점은 성능 문제가없는 경우 스레드 풀에서 최대 값을 설정하지 않아야한다는 것입니다. 스레드 풀을 ~ 100 스레드로 제한하는 대부분의 조언은 말도 안됩니다. 대부분의 스레드 풀에는 그보다 / way / 더 많은 스레드가 있으며 문제가 없습니다.
GEOCHET

ryeguy, 무엇을 측정해야하는지 아래의 답변에 덧붙여보십시오.
paxdiablo 2018 년

파이썬은 본질적으로 멀티 스레드 친화적이지 않다는 것을 잊지 마십시오. 언제든지 단일 바이트 코드 opcode가 실행되고 있습니다. 파이썬은 Global Interpreter Lock을 사용하기 때문입니다.
ASk

1
@Jay D : 한도에 도달 한 순간이 퍼포먼스가 떨어지기 시작할 때라고 말하고 싶습니다.
ninjalj

6
@GEOCHET "여기서 요점은 스레드 풀에서 최대 값을 설정하지 않아야한다는 것입니다." 음 ... 무엇입니까? 고정 크기 스레드 풀은 적절한 성능 저하 및 확장 성의 이점이 있습니다. 예를 들어 네트워크 설정에서 클라이언트 연결을 기반으로 새 스레드를 생성하는 경우 고정 풀 크기가 없으면 서버가 처리 할 수있는 스레드 수와 연결된 모든 단일 클라이언트에 대한 실제 학습 위험 ( 어려운 방법 ) 을 실행합니다 고통받을 것이다. 고정 크기 풀은 서버가 씹을 수있는 것보다 더 많이 물지 않도록 파이프 밸브처럼 작동합니다.
b1nary.atr0phy 4

답변:


206

어떤 사람들은 두 개의 스레드가 너무 많다고 말할 것입니다 -나는 그 캠프에 있지 않습니다 :-)

내 조언은 다음과 같습니다. 측정, 추측하지 마십시오. 한 가지 제안은 구성 가능하게하고 처음에는 100으로 설정 한 다음 소프트웨어를 공개적으로 배포하고 발생하는 상황을 모니터링하는 것입니다.

스레드 사용량이 3으로 정점에 도달하면 100이 너무 큽니다. 하루 종일 100으로 유지되면 최대 200까지 충돌하여 어떻게되는지 확인하십시오.

당신은 할 수 실제로 자체 사용을 모니터링하고 시작하지만 아마 잔인한 다음에 대한 구성을 조정하여 코드가 있습니다.


설명과 정교함 :

나는 자신의 스레드 풀링 하위 시스템을 롤링하는 것을 옹호하지 않습니다. 그러나 스레드에 대한 적절한 컷오프 지점을 요청했기 때문에 스레드 풀 구현에 생성 된 최대 스레드 수를 제한 할 수 있다고 가정합니다 (좋은 것입니다).

스레드 및 데이터베이스 연결 풀링 코드를 작성했으며 다음과 같은 기능이 있습니다 (성능에 필수적이라고 생각합니다).

  • 최소 활성 스레드 수
  • 최대 스레드 수
  • 한동안 사용되지 않은 스레드를 종료합니다.

첫 번째는 스레드 풀 클라이언트 측면에서 최소 성능에 대한 기준을 설정합니다 (이 스레드 수는 항상 사용 가능합니다). 두 번째는 활성 스레드의 자원 사용에 대한 제한을 설정합니다. 세 번째는 리소스 사용을 최소화하기 위해 조용한 시간에 기준선으로 돌아갑니다.

사용하지 않는 스레드 (A)의 리소스 사용량과 작업을 수행하기에 충분한 스레드가없는 리소스 사용량 (B)의 균형을 유지해야합니다.

(A)는 일반적으로 메모리 사용량 (스택 등)입니다. 작업을 수행하지 않는 스레드는 많은 CPU를 사용하지 않기 때문입니다. (B)는 일반적으로 스레드가 사용 가능할 때까지 기다려야 요청이 도착할 때 처리가 지연됩니다.

당신이 측정하는 이유입니다. 당신이 말한대로, 대다수의 스레드는 데이터베이스에서 응답을 기다리고 있으므로 실행되지 않습니다. 허용해야하는 스레드 수에 영향을주는 두 가지 요소가 있습니다.

첫 번째는 사용 가능한 DB 연결 수입니다. DBMS에서 증가시킬 수 없다면 이는 어려운 한계 일 수 있습니다. DBMS가이 경우 무제한 연결을 취할 수 있다고 가정합니다 (이상적으로 측정해야 함).

그런 다음 스레드 수는 과거 사용에 따라 다릅니다. 달리는 최소값은 달리 한 최소값 + A %입니다 (예 : A와 같이 구성 가능). 5.

최대 스레드 수는 이전 최대 + B % 여야합니다.

또한 동작 변경을 모니터링해야합니다. 어떤 이유로 든 사용량이 상당한 시간 동안 100 % 사용 가능하게되어 (클라이언트 성능에 영향을 줄 수있는 경우) 다시 한번 B % 더 높아질 때까지 허용 된 최대 값을 늘려야합니다.


"무엇을 정확하게 측정해야합니까?" 질문:

구체적으로 측정해야하는 것은로드 상태에서 동시에 사용하는 최대 스레드 수입니다 (예 : DB 호출에서 리턴 대기 중). 그런 다음 들어 안전율 10 %를 추가하십시오 (다른 포스터는 내 권장 사항을 예로 들었으므로 강조했습니다).

또한 이는 프로덕션 환경에서 조정을 위해 수행해야합니다. 미리 견적을 받아도 괜찮지 만 어떤 프로덕션이 방해가 될지 모릅니다 (이러한 모든 것들이 런타임에 구성 가능해야하는 이유). 이는 예기치 않은 클라이언트 호출 배가와 같은 상황을 포착하기위한 것입니다.


들어오는 요청에 스레드가 생성되면 스레드 사용은 서비스되지 않은 요청 수를 미러링합니다. 이로부터 "최적의"수치를 결정할 수있는 방법은 없습니다. 실제로 더 많은 스레드가 더 많은 리소스 경합을 유발하므로 활성 스레드 수가 증가합니다.
Andrew Grant

@Andrew, 스레드 생성에는 시간이 걸리며 기록 데이터 [+ N %]를 기반으로 최적의 수를 결정할 수 있습니다 (따라서 측정하지 마십시오). 또한 더 많은 스레드는 신호 / 세마포어를 기다리지 않고 작업을 수행 할 때 리소스 경합 만 유발합니다.
paxdiablo 2018 년

스레드 풀을 사용할 때 '스레드 작성'에 대한이 데이터는 어디에 성능 문제를 발생 시키는가? 좋은 스레드 풀은 작업 사이에 스레드를 작성하고 파괴하지 않습니다.
GEOCHET

@Pax 모든 스레드가 동일한 세마포어에서 DB 쿼리를 실행하기를 기다리는 경우 이는 경쟁의 정의입니다. 스레드가 세마포어를 기다리는 경우 비용이 들지 않는다고 말하는 것도 사실이 아닙니다.
Andrew Grant

1
@Andrew, DB 쿼리를 세마포어 차단 한 이유를 알 수 없으며, 괜찮은 DB는 동시 액세스를 허용하며 많은 스레드가 응답을 기다리고 있습니다. 또한 스레드는 세마포어가 차단되는 동안 실행 시간이 들지 않아야하며, 세마포어가 해제 될 때까지 차단 된 대기열에 앉아 있어야합니다.
paxdiablo 2018 년

36

이 질문은 매우 철저하게 논의되었으며 모든 답변을 읽을 기회가 없었습니다. 그러나 주어진 시스템에서 평화롭게 공존 할 수있는 동시 스레드 수의 상한을 살펴보면서 고려해야 할 몇 가지 사항이 있습니다.

  1. 스레드 스택 크기 : Linux에서 기본 스레드 스택 크기는 8MB입니다 (ulimit -a를 사용하여 찾을 수 있음).
  2. 주어진 OS 변형이 지원하는 최대 가상 메모리. Linux Kernel 2.4는 2GB의 메모리 주소 공간을 지원합니다. Kernel 2.6에서는 조금 더 큽니다 (3GB)
  3. [1]은 지정된 최대 VM 지원 당 최대 스레드 수에 대한 계산을 보여줍니다. 2.4의 경우 약 255 개의 스레드입니다. 2.6의 경우 숫자가 약간 큽니다.
  4. 어떤 종류의 커널 스케줄러가 있습니까? Linux 2.4 커널 스케줄러와 2.6을 비교하면 나중에 시스템에 존재하는 작업 수에 의존하지 않고 O (1) 스케줄링을 제공하지만 첫 번째 작업은 O (n) 이상입니다. 따라서 커널 스케줄의 SMP 기능도 시스템의 최대 지속 가능한 스레드 수에서 중요한 역할을합니다.

이제 더 많은 스레드를 통합하도록 스택 크기를 조정할 수 있지만 스레드 관리의 오버 헤드 (생성 / 파괴 및 스케줄링)를 고려해야합니다. 주어진 프로세스뿐만 아니라 주어진 스레드에 CPU 선호도를 적용하여 특정 CPU에 묶어 CPU 간 스레드 마이그레이션 오버 헤드를 피하고 콜드 캐쉬 문제를 방지 할 수 있습니다.

원하는대로 수천 개의 스레드를 만들 수 있지만 Linux에서 VM이 부족하면 프로세스 (임의의 스레드)를 임의로 시작합니다. 이것은 유틸리티 프로파일이 최대 값을 유지하지 못하게하기위한 것입니다. (유틸리티 기능은 주어진 양의 리소스에 대한 시스템 전체의 유틸리티에 대해 알려줍니다.이 경우 CPU 리소스 및 메모리가 일정한 리소스를 사용하면 유틸리티 곡선이 점점 더 많은 작업으로 평평 해집니다).

Windows 커널 스케줄러도 리소스를 과도하게 사용하기 위해 이러한 종류의 작업을 수행한다고 확신합니다.

[1] http://adywicaksono.wordpress.com/2007/07/10/i-can-not-create-more-than-255-threads-on-linux-what-is-the-solutions/


17

스레드가 어떤 종류의 리소스 집약적 작업 (CPU / 디스크)을 수행하는 경우 한두 가지 이상의 이점을 거의 볼 수 없으며 너무 많으면 성능이 매우 빠르게 저하됩니다.

'최상의 경우'는 첫 번째 스레드가 완료되는 동안 나중 스레드가 중단되거나 일부는 경합이 적은 리소스에 오버 헤드가 낮은 블록이 있다는 것입니다. 최악의 경우는 캐시 / 디스크 / 네트워크를 스 래싱하기 시작하고 전체 처리량이 바닥에서 떨어집니다.

좋은 해결책은 요청을 풀에 배치 한 다음 스레드 풀에서 작업자 스레드로 디스패치하는 것입니다 (예, 지속적인 스레드 작성 / 파괴를 피하는 것이 첫 번째 단계 임).

그런 다음이 풀의 활성 스레드 수는 프로파일 링 결과, 실행중인 하드웨어 및 시스템에서 발생할 수있는 기타 사항에 따라 조정 및 확장 될 수 있습니다.


예, 대기열 또는 요청 풀과 함께 사용해야합니다.
Andrew Grant

2
@ 앤드류 : 왜? 요청을받을 때마다 스레드 풀에 작업을 추가해야합니다. 사용 가능한 작업이있는 경우 작업에 스레드를 할당하는 것은 스레드 풀에 달려 있습니다.
GEOCHET

따라서 수백 개의 요청이 들어오고 스레드가 없을 때 어떻게해야합니까? 더 만드시겠습니까? 블록? 오류를 반환 하시겠습니까? 요청을 필요한만큼 큰 풀에 배치 한 다음 스레드가 해제되면 대기중인 요청을 스레드 풀에 공급하십시오.
Andrew Grant

"대기열에 정리 된 많은 작업을 수행하기 위해 여러 스레드가 작성됩니다. 일반적으로 스레드보다 많은 작업이 있습니다. 스레드가 작업을 완료하자마자 대기열에서 다음 작업을 요청합니다. 모든 작업이 완료 될 때까지 "
GEOCHET

@Andrew : OP가 어떤 파이썬 스레드 풀을 사용하고 있는지 잘 모르겠지만이 기능의 실제 예를 원한다면 다음과 같이 설명합니다. msdn.microsoft.com/en-us/library/…
GEOCHET

10

명심해야 할 것은 파이썬 (적어도 C 기반 버전)은 멀티 코어 머신의 성능에 큰 영향을 줄 수 있는 전역 인터프리터 잠금을 사용 한다는 것입니다.

멀티 스레드 파이썬을 최대한 활용 해야하는 경우 Jython 또는 다른 것을 사용하는 것이 좋습니다.


4
이것을 읽은 후 세 개의 스레드에서 Eratosthenes 작업 체를 실행하려고했습니다. 물론 단일 스레드에서 동일한 작업을 실행하는 것보다 실제로 50 % 느 렸습니다 . 고마워요 두 개의 CPU가 할당 된 가상 머신에서 Eclipse Pydev를 실행하고있었습니다. 다음으로, 일부 데이터베이스 호출과 관련된 시나리오를 시도해 보겠습니다.
돈 커크비

3
CPU 바운드 (예 : 이미지 처리) 및 I / O 바운드 (예 : 네트워크에서 다운로드)와 같은 두 가지 유형의 작업이 있습니다. 분명히 GIL "문제"는 I / O 바운드 작업에 큰 영향을 미치지 않습니다. 작업이 CPU에 바인딩 된 경우 멀티 스레딩 대신 멀티 프로세싱을 고려해야합니다.
iutinvg 2016 년

1
네, 네트워크 io가 많으면 파이썬 스레드가 향상되었습니다. 스레드로 변경하여 일반 코드보다 10 * 빠릅니다 ...
tyan

8

Pax가 올바르게 말했듯이, 측정하지 마십시오 . 내가 DNSwitness를 위해 한 일과 결과는 놀랍 습니다. 이상적인 스레드 수는 내가 생각했던 것보다 훨씬 많았습니다. 15,000 스레드는 가장 빠른 결과를 얻었습니다.

물론 그것은 많은 것들에 달려 있기 때문에 스스로 측정해야합니다.

Combien de fils d' exécution? 에서 완전한 조치 (프랑스어 만) ? .


1
15,000? 그것은 내가 예상했던 것보다 조금 더 높습니다. 그래도 그것이 당신이 가진 것이라면, 그것이 당신이 가진 것이라면, 나는 그것에 대해 논쟁 할 수 없습니다.
paxdiablo

2
이 특정 응용 프로그램의 경우 대부분의 스레드는 DNS 서버에서 응답을 기다리고 있습니다. 따라서 병렬 처리가 많을수록 벽시계 시간이 더 좋습니다.
bortzmeyer

18
일부 외부 I / O에서 차단되는 15000 스레드가 있으면 더 나은 솔루션은 스레드가 적지 만 비동기 모델을 사용하는 것이 좋습니다. 나는 여기에서 경험에서 말합니다.
Steve

5

많은 다중 스레드 응용 프로그램을 작성했습니다. 일반적으로 구성 파일에서 잠재적 스레드 수를 지정할 수 있습니다. 특정 고객을 위해 조정했을 때 모든 CPU 코어의 사용률이 꽤 높았지만 메모리 문제가 발생하지 않을 정도로 숫자를 높게 설정했습니다 (이는 32 비트 운영 체제 시각).

다르게 말하면 CPU, 데이터베이스 처리량, 디스크 처리량 등과 같은 병목 현상에 도달하면 스레드를 추가해도 전반적인 성능이 향상되지 않습니다. 그러나 그 시점에 도달 할 때까지 더 많은 스레드를 추가하십시오!

이것은 문제의 시스템이 앱 전용이며 다른 앱을 멋지게 재생할 필요가 없다고 가정합니다.


1
스레드 수에 대해 본 숫자 중 일부를 언급 할 수 있습니까? 그것을 이해하는 것이 도움이 될 것입니다. 감사.
kovac

3

"큰 철"답변은 일반적으로 제한된 리소스 당 하나의 스레드 (프로세서 (CPU 바운드), 암 (I / O 바운드) 등)이지만 작업을 리소스의 올바른 스레드로 라우팅 할 수있는 경우에만 작동합니다. 액세스하십시오.

불가능한 경우, CPU (Fungable Resource)와 Fungable 리소스 (arm)가 있다고 가정하십시오. CPU의 경우 각 캐시를 특정 CPU에 할당하는 것은 중요하지 않지만 (캐시 관리에 도움이되지만) 암의 경우 스레드를 암에 할당 할 수없는 경우 큐 이론을 시작하고 암을 유지하기위한 최적의 수는 무엇입니까 바쁜. 일반적으로 사용 된 팔을 기반으로 요청을 라우팅 할 수 없다면 팔 당 2-3 개의 스레드를 갖는 것이 적절하다고 생각합니다.

스레드로 전달 된 작업 단위가 합리적으로 원자적인 작업 단위를 실행하지 않는 경우 문제가 발생합니다. 예를 들어 한 지점에서 스레드가 디스크에 액세스하고 다른 지점에서 네트워크를 대기하게 할 수 있습니다. 이렇게하면 추가 스레드가 들어와 유용한 작업을 수행 할 수있는 "크랙"수가 증가하지만 추가 스레드가 서로의 캐시 등을 오염시키고 시스템을 중단시킬 수있는 기회도 늘어납니다.

물론,이 모든 것을 실의 "무게"와 비교해야합니다. 불행히도 대부분의 시스템에는 매우 무거운 스레드가 있으며 "가벼운 스레드"라고하는 스레드는 전혀 스레드가 아니므로 낮은 수준에서 오류를 범하는 것이 좋습니다.

실제로 본 것은 매우 미묘한 차이로 인해 최적의 스레드 수에 엄청난 차이가 생길 수 있다는 것입니다. 특히 캐시 문제와 잠금 충돌로 인해 실제 동시성 양이 크게 제한 될 수 있습니다.


2

한 가지 고려해야 할 것은 코드를 실행할 머신에 몇 개의 코어가 있는지입니다. 그것은 주어진 시간에 얼마나 많은 스레드가 진행될 수 있는지에 대한 하드 한계를 나타냅니다. 그러나 사용자의 경우와 같이 스레드가 데이터베이스에서 쿼리를 실행하기를 자주 기다리는 경우 데이터베이스에서 처리 할 수있는 동시 쿼리 수를 기반으로 스레드를 조정하려고 할 수 있습니다.


2
음 .. 아니야. (멀티 코어와 다중 프로세서가 널리 보급되기 전에) 전체 스레드 지점은 하나의 시스템에 여러 프로세서가있는 것을 모방 할 수 있어야했습니다. 이것이 바로 메인 스레드와 보조 스레드 인 반응 형 사용자 인터페이스를 얻는 방법입니다.
mmr

1
@ mmr : 음. 스레드 개념은 I / O 및 기타 작업을 차단할 수 있도록하는 것입니다.
GEOCHET

4
내가 한 말은 컴퓨터의 코어 수가 주어진 시간에 작업을 수행 할 수있는 스레드 수에 대한 하드 제한을 나타냅니다. 사실입니다. 물론 다른 스레드가 I / O 작업이 완료되기를 기다리고있을 수 있으며,이 질문이 중요한 고려 사항입니다.
newdayrising

1
어쨌든-파이썬에는 GIL이있어 스레드를 이론적으로 평행하게 만듭니다. 하나의 스레드 만 동시에 실행할 수 없으므로 응답 성과 차단 작업 만 중요합니다.
Abgan

2
+1 컴퓨터 작동 방식을 실제로 이해합니다. @ mmr : 여러 프로세서가있는 것으로 보이고 여러 프로세서가있는 것의 차이점을 이해해야합니다. @Rich B : 스레드 풀은 스레드 모음을 처리하는 여러 가지 방법 중 하나 일뿐입니다. 좋은 것이지만 확실히 유일한 것은 아닙니다.
슬픔

2

나는 이것이 당신의 질문에 약간의 회피라고 생각하지만 왜 프로세스에 포크하지 않습니까? 네트워킹에 대한 나의 이해 (흐릿한 시절부터 네트워크를 전혀 코딩하지는 않음)는 들어오는 각 연결을 별도의 프로세스로 처리 할 수있었습니다. 전체 프로그램을 핵 공격하십시오.


1
파이썬의 경우 여러 프로세스가 병렬로 실행될 수 있지만 여러 스레드는 그렇지 않기 때문에 특히 그렇습니다. 그러나 비용은 상당히 높습니다. 매번 새로운 Python 인터프리터를 시작하고 각 프로세스마다 DB에 연결해야합니다 (또는 일부 파이프 리디렉션을 사용하지만 가격도 있습니다).
Abgan

프로세스 간 전환은 스레드 간 전환 (일부 레지스터 대신 전체 컨텍스트 전환)보다 비용이 많이 듭니다. 결국 그것은 threading-lib에 크게 의존합니다. 질문이 스레딩과 관련되어 있으므로 프로세스에 이미 의문의 여지가 있다고 가정합니다.
Leonidas

그럴 수 있지. 사람들이 실제로 작동하는 다른 답변을 포함시키지 않고 스레드 전용 답변을보고 싶어하지 않는 한 왜 그런지 왜 점수에 -2 점수를 얻었는지 잘 모르겠습니다.
mmr

@ mmr : / thread / pools에 대한 질문을 고려하면 사람들이 스레드에 대한 답변을 기대해야한다고 생각합니다.
GEOCHET

프로세스 생성은 시작할 때 한 번만 수행 할 수 있습니다 (예 : 스레드 풀 대신 프로세스 풀). 신청 기간 동안 상각 되었으나 이는 작을 수 있습니다. 그들은 정보를 쉽게 공유 할 수는 없지만 다중 CPU에서 실행할 가능성을 사 므로이 답변이 유용합니다. +1.
paxdiablo 2018 년

1

ryeguy, 나는 현재 비슷한 응용 프로그램을 개발 중이며 내 스레드 번호는 15로 설정되어 있습니다. 불행히도 20으로 늘리면 충돌합니다. 따라서, 이것을 처리하는 가장 좋은 방법은 현재 구성이 X 이상의 스레드 수를 허용하는지 여부를 측정하는 것입니다.


5
스레드 수를 추가해도 앱이 임의로 중단되지 않아야합니다. 몇 가지 이유가 있습니다. 어떤 상황에서는 스레드 수를 줄이더라도 영향을 줄 수 있으므로 원인을 파악하는 것이 좋습니다.
Matthew Lund

-6

대부분의 경우 스레드 풀이이를 처리하도록 허용해야합니다. 일부 코드를 게시하거나 자세한 정보를 제공하면 스레드 풀의 기본 동작이 가장 좋지 않은 이유가 있는지 더 쉽게 확인할 수 있습니다.

작동 방식에 대한 자세한 정보는 http://en.wikipedia.org/wiki/Thread_pool_pattern 에서 확인할 수 있습니다 .


1
@Pax : 대다수의 사람들이 당면한 질문에 대답하고 싶지 않거나 이해하기를 원하지 않는 것은 이번이 처음이 아닙니다. 난 걱정하지 않는다.
GEOCHET

-10

CPU 코어만큼 많은 스레드가 제가 자주 들었습니다.


5
@ 리치, 적어도 이유를 설명하십시오 :-). 이 규칙은 모든 스레드가 CPU 바인딩 된 경우에만 적용됩니다. 그들은 각각 하나의 'CPU'를 얻습니다. 많은 스레드가 I / O 바운드 인 경우 일반적으로 'CPU'보다 많은 스레드를 갖는 것이 좋습니다 (CPU는 물리적 실행 스레드 (예 : 코어)에 적용되므로 인용됩니다).
paxdiablo 2018 년

1
@ Abgan, 나는 그것이 파이썬이 "실제"OS 스레드 (여러 CPU에서 실행 됨)를 만들 것이라고 생각하는지 확신하지 못했습니다. 당신이 말하는 것이 사실이라면 (의심 할 이유가 없습니다), CPU 수량에는 베어링이 없습니다-스레딩은 대부분의 스레드가 무언가를 기다리는 경우에만 유용합니다 (예 : DB I / O).
paxdiablo 2018 년

1
@Rich : (실제) 스레딩시 여러 개의 비대기 스레드를 실제로 동시에 실행할 수 있기 때문에 CPU 수는 DOES와 관련이 있습니다. 하나의 CPU에서는 하나만 실행되며 CPU 이외의 리소스를 기다리는 다른 많은 스레드가 있으면 이점이 발생합니다.
paxdiablo 2018 년

1
@ Pax : 스레드 풀의 개념을 이해하지 못하면 추측합니다.
GEOCHET

1
@Rich, 나는 스레드 풀을 잘 이해한다. 나 (그리고 여기의 다른 사람들)도 당신보다 하드웨어를 더 잘 이해하는 것 같습니다. 하나의 CPU를 사용하면 다른 CPU가 CPU를 기다리는 경우에도 하나의 실행 스레드 만 실행할 수 있습니다. 두 개의 CPU, 두 개의 CPU를 실행할 수 있습니다. 모든 스레드가 CPU를 기다리는 경우 이상적인 스레드 수는 다음과 같습니다.
paxdiablo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.