2011-12-15 8 views
1

カーネル内で使用できるgetloadavg()などの同等のAPIがありますか?カーネル内のgetloadavg()

私はスラッシングしているドライバがあります。私はそれを抑制したいと思います。そして、CPU使用量を見つけるためのカーネル-apiを探しています。

ありがとうございます。

答えて

1

おそらくの機能をkernel/sched.cに探しています。それを使用する方法の例はfs/proc/loadavg.cである:

static int loadavg_proc_show(struct seq_file *m, void *v) 
{ 
     unsigned long avnrun[3]; 

     get_avenrun(avnrun, FIXED_1/200, 0); 

     seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n", 
       LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]), 
       LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]), 
       LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]), 
       nr_running(), nr_threads, 
       task_active_pid_ns(current)->last_pid); 
     return 0; 
} 

私はあなたがドライバーを変更するために負荷平均を使用する方法の少し懐疑的だけど - 平均負荷は、最適なシステムのためのヒューリスティックとして扱われます管理者は、時間の経過とともにシステムの変更をどのように測定するのかを必ずしも把握する必要はありません。システムの他の部分とうまくやり合うためのより良いメカニズムがおそらくあります。

+0

あなたが私の問題にもっと文脈を求めているなら、ここに行きます。このカーネルモジュールはネットワーク通知を処理し、今度は100個の通知から1000個の通知をバーストでスケーリングする必要があります。これはCPUのホッギングを招きます。処理部分はn^2の複雑さで、通知の一部を扱うのに時間がかかります最後のもの)。したがって、CPUの使用状況に応じてこれらの変更を処理しながら、モジュールが「ペース」するようにしたいと思います。 loadavg()がこのシナリオの適切な場所でない場合、私は何を見ているべきですか? – Sethu

+0

ああ、それは固い状況のように聞こえます。あなたはロックを長持ちしていますか?定期的にロックを削除して再取得して、コードを先取りする、あるいは他の方法でCPUを「共有」できるように、コードのコアループを再編成できますか?あるいは仕事を仕事場に委ねることができますか? (Documentation/workqueue.txtを参照してください。) – sarnold

+0

私はロックを保持していません。devドライバはこれらの通知に基づいて最適なネットワークトポロジを再描画し、他のドライバとデーモンに情報を渡します。しかし、これらの通知の段階的な処理が問題の解決に役立つことを確認しました。あなたの迅速な答えをありがとう! – Sethu

関連する問題