2009-04-10 7 views
13

Azul Systems에는 수천 개의 캐시 일관성 CPU를 지원하는 어플라이언스가 있습니다. 동시에 실행되는 수천 개의 스레드를 예약하기 위해 운영 체제에서 변경해야 할 사항에 대한 통찰력이 필요합니다.1024 CPU 용 커널 스케줄링

답변

6

OS 변경 사항을 묻는 중입니다. 따라서이 작업에 중요한 엔지니어링 팀이 있다고 가정합니다.

IPC (프로세스 간 통신) 당신은 얼마나 필요합니까 : 문제의 매개 변수를 정의 도움이 될 정보를 clarififying의 몇 가지도 있습니다

?
그들은 실제로 스레드가되어야합니까, 아니면 프로세스가 될 수 있습니까?
프로세스라면 공유 메모리를 사용하지 않고 소켓을 통해 서로 대화해야만할까요?
메모리 아키텍처 란 무엇입니까? 1024 코어의 직선 SMP입니까? 아니면 여기에 다른 NUMA (Non-Uniform Memory Architecture) 또는 MMP가 있습니까? 귀하의 페이지 테이블은 어떻습니까?

Azul 시스템에 대한 정보가 매우 작다는 것을 알고 있다면, IPC가 거의없고 단순한 "코어 당 하나의 커널 실행"모델이 실제로 정상적으로 작동 할 것입니다. 프로세스가 서로 대화 할 필요가 있다면 소켓을 생성하고 그런 식으로 데이터를 전송할 수 있습니다. 하드웨어가이 모델을 지원합니까? (코어 당 하나의 IP 주소가 필요하고, 1024 개의 IP 주소를 필요로하게 될 것입니다. NAT가 모두 가능할 수도 있지만, 그렇게 큰 문제는 아닙니다.) 물론이 모델은 여분의 페이지 테이블과 약간의 RAM 오버 헤드와 같은 비효율을 초래할 수 있으며 하드웨어 시스템에서 지원하지 않을 수도 있습니다.

"코어 당 커널 1 개"가 작동하지 않더라도 1024/8 커널을 실행할 수 있으며 각 커널이 8 개의 실제 CPU를 제어하도록 할 수 있습니다.

그렇다면 1024 개의 코어 (그리고 소수의 물리적 CPU 만 사용)가있는 기존의 SMP 시스템에서 코어 당 스레드 1 개를 실행하려면 구식 O (1) 스케줄러를 사용하면됩니다. 필요. CPU [0]이 커널에서 거의 100 % 종료되고 인터럽트 처리를 수행 할 가능성이 있지만 작업 부하를 처리하는 데 1 개 이상의 코어가 필요하지 않는 한이 사용 사례에서는 문제가 없습니다.

15

수천 개의 스레드를 예약하는 것은 그리 중요하지 않지만 수백 개의 CPU에서이를 예약하는 것은 중요합니다. 맨 먼저 필요한 것은 매우 세분화 된 잠금 또는 잠금 해제 된 데이터 구조 및 알고리즘입니다. 하나의 CPU가 중요한 섹션을 실행하는 동안 200 개의 CPU를 기다리게 할 수는 없습니다.

5

제 생각에 무언가는 프로세서가 유휴 상태 일 때 프로세서 당 실행 대기열과 작업 도용 알고리즘이 있다는 것입니다. 이 작업은 CPU 당 하나의 프로세스가 있고 작업 항목으로 경량 프로세스가있는 M : N 모델에서 작동하는 것을 볼 수 있습니다. 그러면 Java-7의 fork-join 라이브러리와 같은 작업 도용 스레드 풀과 비슷하게 느껴질 것입니다.

정말로 알고 싶다면 Solaris Internals를 선택하거나 Solaris 커널 코드를 확인하십시오. 아직 읽었습니다. Design & FreeBSD의 Impl, Solaris Internals가 내 목록에 다음과 같이 나와 있기 때문에 내가 할 수있는 일은 난폭 한 추측을하는 것입니다.

1

우리는 ccNUMA가 작동하는 SGI Altix가 캐시 일관성을 위해 특별한 하드웨어를 사용한다는 것을 확신합니다.

코어 당 4MB 캐시를 유지하기 위해 연결되는 거대한 오버 헤드가 있습니다. 소프트웨어에서만 발생하는 것은 아닙니다.

256cpus의 배열에서 캐시 무효화 비트를 보유하기 위해 768MB의 RAM이 필요합니다. 12MB 캐시/캐시 라인 당 128 바이트 * 256² 코어.

+0

예, Altix 시스템에는 소위 "분산 디렉토리"CC가 있습니다. – janneb

1

OS 수정은 변경되지 않은 응용 프로그램 코드를 사용하는 것이 하드웨어 낭비입니다. 하드웨어에 따라 약간의 한계를 넘을 때, 범용 코드를 실행하기 위해 일관성과 동기화를 유지하려는 노력은 너무 많습니다. 당신은 할 수는 있지만 매우 비쌉니다. OS 쪽에서는 복잡한 친 화성 모델이 필요합니다. 즉, 사용자의 작업량이 많아서 CPU를 뛰어 넘지 않아야합니다. 하드웨어 토폴로지를 기반으로 스레드 예약 - 페널티를 최소화하기 위해 "닫기"상태 인 CPU의 협력 스레드. 간단한 작업 도용은 좋은 해결책이 아니므로 토폴로지를 고려해야합니다. 한 가지 해결책은 계층 적 작업 도용입니다. 거리 별 작업을 도용하고 토폴로지를 부문으로 나누고 가장 가까운 곳에서 도용하려고합니다. 자물쇠 문제를 약간 만집니다. 당신은 여전히 ​​스핀 락을 사용할 것이지만 완전히 다른 구현을 사용합니다. 요즘 CS 분야에서 가장 많은 특허를 얻은 분야 일 것입니다. 그러나, 다시 말하지만, 당신은 그런 대규모 규모를 위해 특별히 프로그램해야합니다. 아니면 단순히 사용하지 않을 것입니다. 자동 "병렬 기가"당신을 위해 그것을 할 수 없습니다.

6

Linux 스케일을 만드는 것은 길고 지속적인 프로젝트였습니다. 첫 번째 다중 프로세서 지원 Linux 커널은 전체 커널 (Big Kernel Lock, BKL)을 보호하는 단일 잠금 장치를 보유하고 있었지만 단순하지만 제한된 확장 성이있었습니다.

다음으로 잠금이 더 세분화되어 있습니다. 즉, 많은 데이터가 잠긴 많은 잠금 (1000?)이 있습니다. 그러나 세밀한 잠금이 복잡 해지는 경향이 있으므로 잠금 오버 헤드가 성능상의 이점을 먹기 시작합니다. 특히 대부분의 다중 CPU Linux 시스템의 CPU 수가 상대적으로 적기 때문에 이러한 이점을 충분히 활용할 수있는 한계가 있습니다.

또 다른 것은 가능한 한 커널이 CPU 당 데이터 구조를 사용한다는 것입니다. 이것은 공유 데이터에 대한 캐시 일관성 성능 문제를 피하기 때문에 매우 중요합니다. 물론 잠금 오버 헤드가 없습니다. 예 : 모든 CPU는 자체 프로세스 스케줄러를 실행하므로 가끔씩 글로벌 동기화 만 필요합니다.

또한 일부 알고리즘은 확장 성을 염두에두고 선택됩니다. 예 : 일부 읽기 대부분의 데이터는 전통적인 뮤텍스 대신 RCU (Read-Copy-Update)로 보호됩니다. 이를 통해 동시 갱신 중에 독자가 진행할 수 있습니다.

메모리의 경우 Linux는 프로세스가 실행되는 곳과 동일한 NUMA 노드에서 메모리를 할당하려고합니다. 이를 통해 응용 프로그램의 메모리 대역폭과 대기 시간이 향상됩니다.

+0

수십만 개의 잠금 장치가 있습니다. inode 및 dnode 데이터 구조에는 각각 별도의 잠금이 포함되어 있습니다. 괜찮아. 잠금 해제 또는 잠금 및 대기 잠금은 몇 바이트의 RAM 만 사용하며 다른 리소스는 사용하지 않습니다. – Joshua

1

가장 쉬운 방법은 각 프로세스/스레드를 몇 개의 CPUS에 바인드하는 것입니다. 그런 다음 해당 CPU 만 해당 스레드의 잠금을 위해 경쟁해야합니다. 로드를 균일하게하기 위해 스레드를 이동시키는 방법이 필요하지만 NUMA 아키텍처에서는 가능한 한 최소화해야합니다.

0

듀얼 코어 인텔 ® 시스템에서도 리눅스는 이미 네이티브 posix 스레드로 수천 개의 스레드를 처리 할 수 ​​있습니다.

(Glibc와 커널 모두이를 지원하도록 구성해야하지만 요즘에는 대부분의 시스템에 기본적으로 설치되어 있습니다.)