2011-09-19 9 views
7

私たちは、netfilterフックを使ってIPパケットを傍受しているLKMを書いています。問題は、1Gb/sペイロードでは、フックがソフトirqを介して1つのCPUコアのみをロードすることがわかります。他の15コアはアイドル状態です。だから私は、フックはマルチスレッドではないという結論を出す。マルチコアシステム上のNetfilterフック

私の質問は:私は複数のコアでフックの処理を拒否する方法はありますか?

答えて

9

prolemはnetfilterのものではなく、カーネルが割り込みを管理している方法です。

デフォルトでは、古いバージョンのAPICはすべての割り込みをCPU0に配信します。

あなたは、これはとあなたの問題であるかどうかを確認することができます

cat /proc/interrupts 

NIC(とnetfilterのフックがRXまたはTXのsoftirq上で実行されていることを覚えておいてください)の割り込みがによって処理されているかどうかを確認することができますシングルコア。

新しいバージョンのカーネルには、コンパイルオプション(CONFIG_HOTPLUG_CPU)があり、既存のコアとのIRQのバランスをとります。

また、バージョンを更新したり、カーネルを再コンパイルできない場合は、異なるコア間のバランスを取るためにSMPアフィニティ(CPUidを処理するマスクを使用)を更新できます。または、ACPIと適切な設定に入ります(ここでは私はもっと助けません)。あなたがすべてのこのようなもの(SMPのaffinintyと適切なIRQの取り扱い)については見つけることができます

Here

+0

ありがとうございました。わかった。 –

6

問題は、あなたのNICが割り込みを1つだけ持っていることかもしれません。いくつかの新しいNICSにはいくつかの割り込み(いわゆるマルチキューNIC)があり、多くのスレッド間で負荷が分散されます。

シングルキューNICの場合、新しいカーネルで利用可能ないくつかのソフトウェア機能があり、負荷を分散するように設定できます。例えば、利用可能な概要については、http://www.spinics.net/lists/linux-doc/msg02975.htmlを参照してください。

関連する問題