답변:
컴퓨터는 IRQ (인터럽트 요청)를 통해 연결된 장치와 통신합니다. 장치에서 인터럽트가 발생하면 운영 체제가 수행중인 작업을 일시 중지하고 해당 인터럽트 주소 지정을 시작합니다.
어떤 상황에서는 IRQ가 차례로 매우 빠르게 나오며 운영 체제는 다른 서비스가 도착하기 전에 서비스를 마칠 수 없습니다. 이는 고속 네트워크 카드가 짧은 시간 동안 많은 수의 패킷을 수신 할 때 발생할 수 있습니다.
운영 체제는 IRQ가 도착하면 처리 할 수 없기 때문에 (너무 빨리 도착하기 때문에) 운영 체제는라는 특수 내부 프로세스에 의해 나중에 처리하기 위해 대기합니다 ksoftirqd
.
경우 ksoftirqd
CPU 시간의 작은 비율 이상을 취하고,이 기계가 무거운 인터럽트가 발생하고 있다는 뜻이다.
매뉴얼 페이지 ksoftirqd
에는 머신이 소프트 인터럽트로드가 심한 경우 실행되는 CPU 별 커널 스레드가 있습니다.
어떤 CPU가 특정 인터럽트를 선택하는지 정의하여 설정을 약간 조정할 수 있습니다. 의 내용을 변경하면 /proc/irq/$interrupt_number/smp_affinity
됩니다. 다음을 수행하여 인터럽트 목록과 의미를 얻을 수 있습니다.
cat /proc/interrupts
의 숫자는 smp_affinity
16 진수 코드로 표시되는 cpus의 비트 맵입니다. 가장 오른쪽 비트가 가장 중요하지 않습니다. 예를 들어, 내 시스템에는 8 개의 코어가 있습니다. 코어 1, 3 및 4 만 사용하려면 smp_affinity를 1a
다음 과 같이 설정하십시오 .
cpu_7 cpu_6 cpu_5 cpu_4 cpu_3 cpu_2 cpu_1 cpu_0
0 0 0 1 1 0 1 0 = 0001 1010 = 1a (in hex)
개인적으로 다음과 같이 인터럽트 29 (8 코어 시스템의 eth0)를 선택할 수 있도록 모든 CPU를 설정했습니다.
sudo echo ff > /proc/irq/29/smp_affinity
ksoftirqd는 머신에 소프트 인터럽트 인터럽트가 가해질 때 실행되는 CPU 당 커널 스레드이므로 CPU를 소비하지 않고 IRQ로드를 줄입니다.