2012-12-05 3 views
2

4 코어 Intel 머신에 multiqueue NIC 카드가 있고 나는 CPU 코어 (set/proc/irq/xxx/smp_affinity)에서 NIC 카드의 모든 큐를 바인딩합니다. 하자 core0의 queue0, core1의 queue1 등등.리눅스에서 모든 ksoftirqds를 활성화하는 방법은 무엇입니까? (리눅스 커널의 네트 스택에 대해)

softirq는 하드웨어 인터럽트가 발생한 코어와 동일한 코어에서 호출됩니다. ksoftirqd가 내 컴퓨터에서 parellelly를 실행할 수없는 이유는 무엇입니까? 그것은 단지 하나 개의 커널 스레드의 (같은 ksoftirqd/2) 코어의 100 %를 사용하지만 다른 사람들이 내가

cat /proc/interrupts | grep eth1 

나는 모든 패키지도 모두 분포되어 있음을 알 수 사용할 때 0 %

있는 것 NIC 대기열.

갱신 : 당신이 http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3 (참조하시기 바랍니다 # 7) 없는 경우, 블로그는 당신이 다른 카드를 추가 할 수 있다고하는,이 문제 중국어를 읽을 수 있는지 여기

은 100 % 현재 softirq의 문제에 대한 솔루션입니다 해결 될 것입니다

답변

0

ksoftirqd는 카드의 네트워크 대기열 폴링을 포함하여 커널의 모든 폴링 루틴의 기반입니다.

이와 같이 ksoftirqd를 실행하면 스레드가 얼마나 좋은지가 영향을받습니다. 사실 스레드가 전혀 없다는 것입니다. 이는 ksoftirqd를 트리거하는 타이머가 항상 동일한 코어에 전달되기 때문입니다.

그러나이 목표를 염두에두고이 질문을하십시오. 그 목표에 대한 구현의 세부 사항이 아니라 먼저 그 목표에 대해 이야기하는 것이 합리적 일 수 있습니다.

+0

ok, 제 질문은 100 %가 코어에 있고 0 %가 다른 3 개의 코어에있는 이유입니다. 100 % 모두가 4 개의 코어에 분산되어 있어도 각각 25 %가됩니다. – dilfish

2

ksoftirqd는 일반적으로 softirqs를 실행하지 않기 때문에 병렬로 실행할 필요가 없습니다. 모든 softirq는 일반적으로 요청 된 인터럽트 직후 CPU에서 실행됩니다.

softirqs는 "softirq"flood의 경우에만 ksoftirqd에서 실행됩니다 - 커널이 인터럽트를 실행 한 후 anu softirqs를 실행해야하는지 확인합니다. 실행하면 실행됩니다. 이러한 인터럽트가 실행되는 동안 softirq를 실행할 때 다시 실행하도록 표시된 인터럽트가 발생할 수 있습니다. 이것이 커널이 실행 된 후에 시장 softirq를 다시 검사하게되는 이유입니다.

인터럽트가 발생하면 매우 빠르게 라이브 잠금이 될 수 있습니다. 우리가하는 일은 softirqs와 인터럽트를 실행하고 사용자 코드는 절대 실행하지 않는 것입니다. 이것이 커널에 "댐퍼 (damper)"메커니즘이있는 이유입니다. 실행 후 softirq가 표시되었다는 것을 10 번 확인한 후에도 커널은 softirq를 인터럽트 종료시 실행하지 않고 대신 특수 커널 스레드를 깨 웁니다 홍수가 끝날 때까지 ksoftirqd를 실행하십시오.

이것은 IRQ 플러드를 처리하기위한 감시 메커니즘이며 대부분 휴면 상태이므로 멀티 스레드 ksoftirqd를 사용하면 일반적인 경우에 도움이되지 않습니다.

+0

설명해 주셔서 감사합니다. 정확히 '홍수'에 대한 해결책이 있습니까? – dilfish

+0

@dilfish 예, 커널 코드를 변경합니다. 이것이 오픈 소스 인 이유입니다 :-) – gby