1

カーネル モジュールを作成し、dev_add_pack を使用して着信パケットをすべて取得しました。与えられたフィルター規則に従って、パケットが一致した場合、それをユーザー空間に転送しています。

このカーネル モジュールをロードし、sipp を使用して udp トラフィックを送信すると、ksoftirqd プロセスが表示され、CPU の消費が開始されます。(私はトップコマンドでこれをテストしています)

cpuを節約する方法はありますか?

4

1 に答える 1

2

ETH_P_ALL タイプを使用して、packet_type 構造体をプロトコル スタックに登録していると思います。そして、あなたの packet_type->func がボトルネックであると思います。おそらくそれ自体が大量の CPU を消費するか、既存のプロトコル スタック モデルを壊して、他の既存の packet_type 関数をトリガーして CPU を消費します。したがって、CPU を節約する唯一の方法は、packet_type->func を最適化することです。関数が複雑すぎる場合は、関数をいくつかの部分に分割することを検討する必要があります。単純な部分を ksoftirqd コンテキストで実行される packet_type->func として使用し、複雑な部分は他のカーネル スレッド コンテキストに配置する必要があります (作成することができます)。必要に応じて、カーネル モジュールに新しいスレッドを追加します)。

于 2013-03-22T07:56:31.333 に答える