어떤 CPU가 어떤 인터럽트를 처리하는지 결정하기 위한 Linux 커널의 전략은 무엇입니까?

어떤 CPU가 어떤 인터럽트를 처리하는지 결정하기 위한 Linux 커널의 전략은 무엇입니까?

제가 읽었 Linux Kernel Development는데 확실하지 않은 한 가지가 있습니다. 하드웨어가 인터럽트를 트리거할 때 어떤 CPU가 인터럽트 처리 논리를 실행하는지 결정하는 기준은 무엇입니까?

IO 요청을 하는 CPU는 항상 동일해야 한다고 상상할 수 있지만 현재 스레드는 모든 목적을 위해 절전 모드이므로 이는 의미가 없습니다.

반면에 시간 제한 인터럽트(예: 스케줄러의 경우)를 발생시켜야 할 수도 있습니다. SMP 시스템에서는 항상 동일한 코어(예: #0)에서 레이즈합니까, 아니면 항상 임의의 코어에서 레이즈합니까?

실제로 어떻게 작동하나요?

감사해요

답변1

다중 프로세서/다중 코어 시스템에서 다음을 찾을 수 있습니다.이름이 지정된 데몬irqbalance. 그 임무는 프로세서 간의 하드웨어 인터럽트 배포를 조정하는 것입니다.

부팅 시 펌웨어가 시스템 제어를 코어에 넘겨주면 처음에는 하나의 CPU 코어만 실행됩니다. 첫 번째 코어(일반적으로 코어 #0, "모나크 CPU/코어"라고도 함)는 처음에 펌웨어의 모든 인터럽트 처리 책임을 맡은 다음 시스템을 초기화하고 다른 CPU 코어를 시작합니다. 따라서 로드를 분산하기 위해 아무 작업도 수행되지 않으면 처음에 시스템을 부팅하는 코어가 모든 인터럽트 처리 책임을 맡게 됩니다.

https://www.kernel.org/doc/Documentation/IRQ-affinity.txt최신 코어에서는 기본적으로 모든 CPU 코어가 IRQ를 동일하게 처리하도록 허용하는 것이 좋습니다. 그러나 이는 CPU 캐시 라인을 비효율적으로 사용하고 IRQ 소스를 자주 사용하게 되므로 최선의 솔루션이 아닐 수 있습니다. irqbalance이 문제를 해결하는 것이 우리의 임무입니다.

irqbalance/usr/sbin/irqbalance커널 프로세스가 아닙니다. 일회용 모드(예: 부팅 프로세스의 일부로 인터럽트 할당을 조정한 다음 종료) 또는 데몬 프로세스로 실행될 수 있는 독립 실행형 바이너리입니다 . 다양한 Linux 배포판에서는 이를 다양한 방식으로 사용하거나 완전히 생략할 수 있습니다. IRQ를 프로세서에 할당하기 위해 사용자 공간 바이너리를 간단히 업데이트함으로써 임의로 복잡한 전략을 쉽게 테스트하고 구현할 수 있습니다.

각 CPU가 처리할 수 있는 IRQ를 제어하기 위해 IRQ별 /proc/irq/%i/smp_affinity파일을 사용하여 작동합니다. 자세한 내용이 궁금하시다면,소스코드 확인irqbalance:IRQ 설정의 실제 할당은 다음에서 발생합니다.activate.c.

관련 정보