4

4 コアの Intel マシンにマルチキュー NIC カードがあり、NIC カードのすべてのキューを CPU コアにバインドします (set /proc/irq/xxx/smp_affinity)。core0 に queue0、core1 に queue1 などとします。

ハードウェア割り込みが発生したのと同じコアで softirq が呼び出されると言われています。私のマシンで ksoftirqd を並列実行できないのはなぜですか? コアの 100% を使用するのは 1 つのカーネル スレッド (ksoftirqd/2 など) だけですが、他のスレッドは 0% です。

私が使うとき

cat /proc/interrupts | grep eth1

すべてのパッケージがすべての NIC キューに配布されていることがわかります。

アップデート:

中国語http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3を読める場合の 100% softirq 問題の解決策は次のとおりです (#7 を参照してください)。この問題は解決されるでしょう

4

2 に答える 2

2

ksoftirqd は、通常は softirqs を実行しないため、並行して実行する必要はありません。通常、すべての softirq は、それらを要求した割り込みの直後に要求された CPU 上で実行されます。

softirqs は、「softirq」フラッドの場合にのみ ksoftirqd で実行されます。カーネルが割り込みを実行した後、すべての softirqs を実行する必要があるかどうかを確認します。もしそうなら、それはそれらを実行します。これらの実行中は割り込みが有効になっているため、softirq を実行しているときに、再度実行するようにマークする割り込みが発生する可能性があります。これが、カーネルが実行後にマーケットの softirq を再度チェックする理由です。

割り込みが殺到すると、これが非常に高速にライブロックに変わる可能性があることは明らかです。ここで行うことは、softirq と割り込みを実行することだけであり、ユーザー コードは一切使用しません。これが、カーネルが「ダンパー」メカニズムを備えている理由です。実行後にソフトIRQがマークされているかどうかを10回チェックした後でもマークされている場合、カーネルは割り込みの最後にソフトIRQを実行せず、代わりに特別なカーネルスレッドを起動しますksoftirqd を使用して、フラッドが終わるまでそれらを実行します。

これは IRQ フラッドを処理するためのウォッチドッグ メカニズムであり、ほとんどの場合休止状態であるため、通常のケースではマルチスレッドの ksoftirqd を使用してもあまり役に立ちません。

于 2012-12-06T09:09:13.043 に答える
0

ksoftirqd は、カードのネットワーク キューのポーリングを含む、カーネル内のすべてのポーリング ルーチンのベースです。

そのため、ksoftirqd のトリガーは、スレッドの程度に影響します。全く引っかからないのが実情です。これは、ksoftirqd をトリガーするタイマーが常に同じコアに配信されるためです。

しかし、あなたは目標を念頭に置いてこの質問をします。その目標に向けた実装のこの詳細についてではなく、最初にその目標について話すことが理にかなっているかもしれません。

于 2012-12-06T08:47:09.747 に答える