코어 당 최적 스레드 수
4 코어 CPU가 있고 최소 시간 내에 일부 프로세스를 실행하려고한다고 가정하겠습니다. 프로세스는 이상적으로 병렬화 가능하므로 무한한 수의 스레드에서 청크를 실행할 수 있으며 각 스레드는 동일한 시간이 걸립니다.
코어가 4 개이므로 단일 코어는 주어진 순간에 단일 스레드 만 실행할 수 있기 때문에 코어보다 더 많은 스레드를 실행해도 속도가 향상되지 않을 것으로 예상됩니다. 나는 하드웨어에 대해 많이 모른다. 그래서 이것은 단지 추측 일 뿐이다.
코어보다 많은 스레드에서 병렬화 가능 프로세스를 실행하면 이점이 있습니까? 즉, 4 개의 스레드가 아닌 4000 개의 스레드를 사용하여 프로세스를 실행하면 프로세스가 더 빠르거나 느리거나 거의 같은 시간 내에 완료됩니까?
스레드가 I / O, 동기화 등을 수행하지 않고 실행중인 다른 것이 없으면 코어 당 1 개의 스레드가 최상의 성능을 제공합니다. 그러나 그렇지 않을 가능성이 높습니다. 더 많은 스레드를 추가하면 도움이되지만 어느 정도 후에 성능이 저하 될 수 있습니다.
얼마 전, 꽤 괜찮은 부하로 Mono에서 ASP.NET 응용 프로그램을 실행하는 2 쿼드 코어 컴퓨터에서 성능 테스트를 수행했습니다. 우리는 최소 및 최대 스레드 수로 작업했으며 결국 특정 구성의 특정 응용 프로그램에 대한 최상의 처리량은 36 ~ 40 스레드 사이라는 것을 알았습니다. 그 경계 밖의 모든 것은 더 나빠졌습니다. 수업을 배웠습니까? 내가 당신이라면, 당신이 당신의 어플리케이션에 맞는 숫자를 찾을 때까지 다른 수의 스레드로 테스트 할 것입니다.
한 가지 확실한 점 : 4k 스레드가 더 오래 걸립니다. 그것은 많은 상황 전환입니다.
@ Gonzalo의 답변에 동의합니다. I / O를 수행하지 않는 프로세스가 있으며 여기에 내가 찾은 것이 있습니다.
모든 스레드는 하나의 배열에서 작동하지만 다른 범위 (두 스레드는 동일한 인덱스에 액세스하지 않음)에서 작동하므로 다른 배열에서 작업 한 경우 결과가 다를 수 있습니다.
1.86 시스템은 SSD가 장착 된 Macbook Air입니다. 다른 Mac은 일반 HDD가 장착 된 iMac입니다 (7200rpm이라고 생각합니다). 윈도우 머신에는 7200 rpm HDD도 있습니다.
이 테스트에서 최적의 수는 머신의 코어 수와 동일했습니다.
나는이 질문이 다소 오래되었다는 것을 알고 있지만, 2009 년 이후 상황이 발전했다.
이제 고려해야 할 두 가지가 있습니다 : 코어 수와 각 코어 내에서 실행할 수있는 스레드 수.
Intel 프로세서의 경우 스레드 수는 하이퍼 스레딩에 의해 정의되며 2 (사용 가능한 경우)입니다. 그러나 하이퍼 스레딩은 2 개의 스레드를 사용하지 않는 경우에도 실행 시간을 2로 줄입니다. (즉, 두 프로세스간에 공유되는 1 개의 파이프 라인-프로세스가 많을수록 좋습니다. 그렇지 않은 경우에는 더 좋습니다. 더 많은 코어가 결정적으로 더 좋습니다!)
다른 프로세서에는 2, 4 또는 8 개의 스레드가있을 수 있습니다. 따라서 각각 8 개의 스레드를 지원하는 8 개의 코어가있는 경우 컨텍스트 전환없이 64 개의 프로세스를 병렬로 실행할 수 있습니다.
표준 운영 체제로 실행하는 경우 "컨텍스트 전환 없음"은 사실이 아닙니다. 그러나 이것이 주요 아이디어입니다. 일부 OS에서는 프로세서를 할당 할 수 있으므로 응용 프로그램 만 해당 프로세서에 액세스 / 사용할 수 있습니다!
내 경험상 I / O가 많으면 여러 스레드가 좋습니다. 메모리를 많이 사용하는 작업 (소스 1 읽기, 소스 2 읽기, 빠른 계산, 쓰기)이 많은 경우 더 많은 스레드가 도움이되지 않습니다. 다시 말하지만, 이는 동시에 읽고 쓰는 데이터의 양에 달려 있습니다 (즉, SSE 4.2를 사용하고 256 비트 값을 읽는 경우 해당 단계에서 모든 스레드를 중지합니다. 즉, 1 스레드는 구현하기가 훨씬 쉬울 것입니다. 프로세스 및 메모리 아키텍처에 따라 달라지며, 일부 고급 서버는 별도의 코어에 대해 별도의 메모리 범위를 관리하므로 데이터가 올바르게 제출되었다고 가정하면 별도의 스레드가 더 빨라집니다. 아키텍처에서는 4 개의 프로세스가 4 개의 스레드로 1 개의 프로세스보다 빠르게 실행됩니다.)
실제 성능은 각 스레드가 자발적으로 생성하는 양에 따라 다릅니다. 예를 들어, 스레드가 전혀 I / O를 수행하지 않고 시스템 서비스를 사용하지 않는 경우 (즉, 100 % CPU 바인딩) 코어 당 1 개의 스레드가 최적입니다. 스레드가 대기해야하는 작업을 수행하는 경우 최적의 스레드 수를 결정하기 위해 실험해야합니다. 4000 개의 스레드는 상당한 스케줄링 오버 헤드를 발생 시키므로 아마 최적이 아닙니다.
답은 프로그램에서 사용되는 알고리즘의 복잡성에 달려 있습니다. 임의의 수의 스레드 'n'과 'm'에 대해 처리 시간 Tn과 Tm을 두 번 측정하여 최적의 스레드 수를 계산하는 방법을 생각해 냈습니다. 선형 알고리즘의 경우 최적 스레드 수는 N = sqrt ((m n (Tm * (n-1) – Tn * (m-1))) / (n Tn-m Tm)입니다.
다양한 알고리즘에 대한 최적의 수 계산에 관한 내 기사를 읽으십시오 : pavelkazenin.wordpress.com
여기에 다른 관점을 추가 할 것이라고 생각했습니다. 대답은 질문이 약한 스케일링인지 강한 스케일링인지를 가정합니다.
에서 위키 백과 :
약한 스케일링 : 솔루션 시간이 프로세서 당 고정 된 문제 크기에 대한 프로세서 수에 따라 어떻게 달라지는 지.
강력한 확장 : 해결 된 총 문제 크기에 대한 솔루션 수는 프로세서 수에 따라 어떻게 달라집니다.
질문이 약한 스케일링을 가정하면 @Gonzalo의 대답으로 충분합니다. 그러나 질문에 강력한 확장이 있다고 가정하면 추가해야 할 것이 있습니다. 강력한 확장에서는 고정 워크로드 크기를 가정하므로 스레드 수를 늘리면 각 스레드에서 작동해야하는 데이터 크기가 줄어 듭니다. 최신 CPU에서는 메모리 액세스가 비싸므로 데이터를 캐시에 보관하여 로컬 성을 유지하는 것이 좋습니다. 따라서 각 스레드의 데이터 세트가 각 코어의 캐시에 맞는 경우 최적의 스레드 수를 찾을 수 있습니다 (시스템의 L1 / L2 / L3 캐시인지 여부에 대해서는 자세히 설명하지 않습니다).
스레드 수가 코어 수를 초과하더라도 마찬가지입니다. 예를 들어, 4 개의 코어 머신에서 실행될 프로그램에 8 개의 임의의 작업 단위 (또는 AU)가 있다고 가정하십시오.
사례 1 : 각 스레드가 2AU를 완료 해야하는 4 개의 스레드로 실행하십시오. 각 스레드는 완료하는 데 10 초가 걸립니다 ( 많은 캐시 누락 ). 코어가 4 개인 경우 총 시간은 10 초 (10s * 4 스레드 / 4 코어)입니다.
사례 2 : 각 스레드가 1AU를 완료해야하는 8 개의 스레드로 실행합니다. 각 스레드는 캐시 누락 이 줄어들어 5 초 대신 2 초만 걸립니다 . 코어가 4 개인 경우 총 시간은 4 초 (2 * 8 스레드 / 4 코어)입니다.
문제를 단순화하고 다른 답변 (예 : 컨텍스트 스위치)에서 언급 된 오버 헤드를 무시했지만 데이터 크기에 따라 사용 가능한 코어 수보다 많은 수의 스레드를 갖는 것이 유리 할 수 있기를 바랍니다. 다시 처리합니다.
한 번에 4000 스레드가 꽤 높습니다.
대답은 '예'입니다. 각 스레드에서 많은 I / O 차단을 수행하는 경우 논리 코어 당 최대 3 개 또는 4 개의 스레드로 상당한 속도 향상을 보일 수 있습니다.
그러나 많은 차단 작업을 수행하지 않으면 스레딩의 추가 오버 헤드로 인해 속도가 느려집니다. 프로파일 러를 사용하여 병목 현상이 평행 한 부분을 확인하십시오. 무거운 계산을 수행하는 경우 CPU 당 1 개 이상의 스레드가 도움이되지 않습니다. 많은 메모리 전송을 수행하는 경우 도움이되지 않습니다. 디스크 액세스 또는 인터넷 액세스와 같은 많은 I / O를 수행하는 경우 여러 스레드가 어느 정도 도움이되거나 최소한 응용 프로그램의 응답 성을 향상시킵니다.
기준.
1부터 시작하여 응용 프로그램의 스레드 수를 늘리고 100과 같은 것으로 이동하여 각 스레드 수에 대해 3 ~ 5 회 시험을 실행하고 작업 속도와 스레드 수에 대한 그래프를 작성합니다. .
4 개의 스레드 케이스가 최적이어야하며 그 후에 런타임이 약간 증가하지만 그렇지 않을 수도 있습니다. 응용 프로그램의 대역폭이 제한적일 수 있습니다. 즉, 메모리에로드하는 데이터 세트가 크거나, 캐시 누락이 많이 발생하여 2 개의 스레드가 최적 일 수 있습니다.
테스트하기 전에는 알 수 없습니다.
머신에서 프로세스 수를 리턴하는 htop 또는 ps 명령을 실행하여 머신에서 실행할 수있는 스레드 수를 찾을 수 있습니다.
'ps'명령에 대한 매뉴얼 페이지를 사용할 수 있습니다.
man ps
모든 사용자 프로세스 수를 계산하려면 다음 명령 중 하나를 사용할 수 있습니다.
ps -aux| wc -l
ps -eLf | wc -l
사용자 프로세스 수 계산 :
ps --User root | wc -l
또한 "htop" [참조]를 사용할 수 있습니다 .
우분투 또는 데비안에 설치하기 :
sudo apt-get install htop
Redhat 또는 CentOS에 설치 :
yum install htop
dnf install htop [On Fedora 22+ releases]
소스 코드에서 htop을 컴파일하려면 여기에서 찾을 수 있습니다 .
스레드가 차단되지 않는 한 코어 당 1 개의 스레드가 이상적입니다.
이것이 사실이 아닌 경우 : 코어에서 실행중인 다른 스레드가 있으며,이 경우 더 많은 스레드가 프로그램에 더 큰 실행 시간을 제공 할 수 있습니다.
많은 스레드 ( "스레드 풀") 대 코어 당 하나의 예는 Linux 또는 Windows에서 웹 서버를 구현하는 것입니다.
소켓은 Linux에서 폴링되기 때문에 많은 스레드가 적절한 시간에 올바른 소켓을 폴링 할 가능성을 증가시킬 수 있지만 전체 처리 비용은 매우 높습니다.
Windows에서 서버는 I / O 완료 포트 (IOCP)를 사용하여 구현되어 응용 프로그램 이벤트를 구동합니다. I / O가 완료되면 OS가 대기 스레드를 시작하여 처리합니다. 처리가 완료되면 (일반적으로 요청-응답 쌍에서와 같이 다른 I / O 작업으로) 스레드는 IOCP 포트 (큐)로 돌아가 다음 완료를 기다립니다.
I / O가 완료되지 않은 경우 수행 할 처리가없고 스레드가 시작되지 않습니다.
실제로 Microsoft는 IOCP 구현에서 코어 당 하나 이상의 스레드를 권장합니다. 모든 I / O는 IOCP 메커니즘에 연결될 수 있습니다. 필요한 경우 응용 프로그램에서 IOC를 게시 할 수도 있습니다.
계산 및 메모리 바운드 관점 (과학 컴퓨팅) 4000 스레드에서 말하면 응용 프로그램이 실제로 느리게 실행됩니다. 문제의 일부는 컨텍스트 전환의 오버 헤드가 매우 높고 메모리 위치가 매우 낮다는 것입니다.
그러나 또한 아키텍처에 따라 다릅니다. 나이아가라 프로세서는 일종의 고급 파이프 라이닝 기술을 사용하여 단일 코어에서 여러 스레드를 처리 할 수 있다고 들었습니다. 그러나 나는 그 프로세서들에 대한 경험이 없다.
CPU 및 메모리 사용률을 확인하고 일부 임계 값을 지정하십시오. 임계 값이 초과되면 새 스레드를 만들 수 없습니다.
참고 URL : https://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core
'Programing' 카테고리의 다른 글
Mercurial 프로젝트를 Git으로 변환 (0) | 2020.03.31 |
---|---|
교차 ()의 반대 (0) | 2020.03.31 |
cURL을 사용하여 CORS 요청을 어떻게 디버깅 할 수 있습니까? (0) | 2020.03.31 |
유효하지 않은 데이터에 대한 REST 응답 코드 (0) | 2020.03.31 |
RuntimeWarning : DateTimeField가 순진한 datetime을 받았습니다 (0) | 2020.03.31 |