POLLING(4) | FreeBSD Kernel Interfaces Manual | POLLING(4) |
名称
polling — デバイスポーリングサポート書式
options DEVICE_POLLING解説
デバイスポーリング (略して polling) は、それらが注意を必要とするとき割り込みを生成するためにデバイスを頼る代わりに、オペレーティングシステムが定期的にデバイスにポーリングする技術に委ねます。これは、効率が悪く直観に反するように思えるかもしれませんが、適切に行なわれると、 polling は、システムの反応性と性能に関して多くの有利な点でいつどのようにデバイスを操作するかに関してオペレーティングシステムにより多くの制御を与えます。特に、 polling は、割り込みサービスのとき発生されるコンテキストスイッチのためのオーバヘッドを削減し、最終的にシステムのライブロック (訳注: デッドロックより軽いロック) の機会を小さくする様々なタスク (ユーザプロセス、ソフトウェア割り込み、デバイス操作) の間の CPU のスケジューリングでより多くの制御を与えます。
操作の原則
通常は、割り込みベースモードで、それらが注意を必要とするときはいつもデバイスは、割り込みを発生させます。これは、順にコンテキストスイッチとプロセスがデバイスによって必要とされるときは、いつも処理される割り込みハンドラの実行が置きます。デバイスドライバが (一般的に、 FreeBSD ドライバのための場合でないこと) を考慮してリアルタイムを気づかってプログラムされていない場合、割り込みハンドラの持続時間は、潜在的に結合されません。その上、激しいトラフィックの負荷の下で、システムは、カーネルかユーザランドのいずれかで他の仕事を終了することができることなしで、割り込みを持続して処理しているかもしれません。デバイスポーリングは、適切な時間でポーリングデバイスによって割り込みを無効にします。すなわち、オンクロック割り込みとアイドルループです。このように、コンテキストスイッチオーバヘッドは、取り除かれます。その上、オペレーティングシステムは、どのくらいの仕事をデバイスイベントの操作に費やすかを正確に制御することができ、その結果、他のタスクへのある量の CPU を予約することによって、ライブロックを防ぎます。
また、 polling を有効にするとソフトウェアネットワーク割り込みがスケジュールされ、従ってパケットが完了するために処理されないので、ライブロックのリスクが決してありません。
ポーリングを有効にする
現在、ネットワークインタフェースドライバだけが polling をサポートします。それは、 ifconfig(8) コマンドの助けをかりて、オン、オフされます。すべてのインタフェースのためのポーリングを有効にされる、歴史的な kern.polling.enable を、次のコードに置き換えることができます:
for i in `ifconfig -l` ; do ifconfig $i polling; # use -polling to disable done
MIB 変数
polling の操作は、次の sysctl(8) MIB 変数によって制御されます:
- kern.polling.user_frac
-
行なういくらかの仕事があるという条件で、
polling が有効になるとき、CPU サイクルのこのパーセントまで
polling 処理のために利用可能となる残っている断片であるユーザランドタスクへ予約されます。デフォルトは、50 です。
- kern.polling.burst
-
各タイマの刻みごとに各ネットワークインタフェースから取り込まれたパケットの最大数です。プログラムされた
user_frac,
burst_max, CPU 速度、およびシステムロードに従って、この数は、カーネルによってダイナミックに調整されます。
- kern.polling.each_burst
-
上記のバースト (爆発) が
polling のために登録されたすべてのインタフェースのうちで現在継続中のラウンドロビンである、パケットは、この数より小さなチャンク (塊) に分割されます。単一のインタフェースからの大きいバーストは、IP 割り込みキュー (
net.inet.ip.intr_queue_maxlen) を飽和状態にならないようにします。デフォルトは、5 です。
- kern.polling.burst_max
-
kern.polling.burst のための上限。
polling が有効にされるとき、アイドルループで
polling に利用可能な予備の CPU サイクルがない場合、各インタフェースが 1 秒あたりのパケットを多くても (
HZ *
burst_max) 受信できることに注意してください。この数は、予想された (GigE カードでかなり高くできる) 負荷に合わせるために調整されるべきです。デフォルトは、100Mbit ネットワークと HZ=1000 に適切な 150 です。
- kern.polling.idle_poll
-
polling がアイドルループ内で有効になるかどうかを制御します。これを無効にする理由は、(節電またはアイドル優先順位のカーネルスレッドのスケジューラの操作におけるバグを除いて) ありません。
- kern.polling.reg_frac
-
デバイスのステータスレジスタがどれくらいの頻度で (
reg_frac /
HZ 秒毎で) エラー条件と同様のものをチェックされるかどうかを制御します。この値を増加させると、バスの負荷が減少するだけでなく、エラー検出も遅くなります。デフォルトは、20 です。
- kern.polling.handlers
-
どのくらい多くのアクティブデバイスが
polling に登録されたか。
- kern.polling.short_ticks
- kern.polling.lost_polls
- kern.polling.pending_polls
- kern.polling.residual_burst
- kern.polling.phase
- kern.polling.suspect
- kern.polling.stalled
- デバッグ変数。
サポートされているデバイス
デバイスポーリングは、デバイスドライバへの明白な変更を必要とします。この書き込みは、現在、 bge(4), dc(4), em(4), fwe(4), fwip(4), fxp(4), igb(4), ixgb(4), nfe(4), nge(4), re(4), rl(4), sf(4), sis(4), ste(4), stge(4), vge(4), vr(4) と xl(4) デバイスがサポートされています。他のものが準備中です。この変更は、かなり簡単で、割り込みサービスルーチンの内部の抽出で構成され、イベントのためにデバイスをプローブしそれらを処理するために呼び出されるコールバック関数 *_poll() を書きます。 (詳細に関して上記のデバイスの条件付きにコンパイルセクションを参照してください。)最悪の場合には、デバイスがクロック割り込みのときにポーリングされるだけであるので、処理パケットの待ち時間を減少させるためにクロックの周波数を 1000Hz 未満まで減少させることは賢明ではありません。
歴史
デバイスポーリングは、 FreeBSD 4.6 と FreeBSD 5.0 ではじめて登場しました。作者
デバイスポーリングは、 <luigi@iet.unipi.it>によって書かれました。April 6, 2007 | FreeBSD |