問題タブ [softirq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - softirq と tasklet はどのコンテキストにありますか?
プロセス コンテキストと割り込みコンテキストがあることは知っていますが、softirq や tasklet を実行するときに、どのコンテキストで実行されるのかわかりません。
「下半分のコンテキスト」という用語を使用している人を見たことがありますが、そのような用語がある場合、他の用語との違いは何ですか。
softirq と tasklet に対するもう 1 つの質問は、実行中にスリープが許可されないのはなぜですか??
誰でもこれらの質問を特定するのを手伝ってもらえますか、ありがとう!!
linux-kernel - SoftIRQとタスクレットの違い
Linuxの割り込み処理を研究していると、タスクレットとSoftIRQが「下半分」(優先度の低い作業)を実行する2つの異なる方法であることがわかりました。私はこれを理解しています(かなりの真の必要性)。
違いは、SoftIRQは再エンタラントですが、タスクレットは再エンタラントではありません。同じSoftIRQを異なるCPUで実行できますが、タスクレットの場合はそうではありません。
私はこれを表面から理解していますが、2つの機能の要件を理解できていません。どのような場合にこれらの機能を使用できますか?今タスクレットを使用し、次にSoftIRQを使用する必要があることを認識する方法。
また、タスクレットがSoftIRQで作成されるとはどういう意味ですか?私がLKMLで読んだ本の1つで、タスクレットの削除について議論がありました。なぜそのような機能を導入するのか、私は完全に混乱しましたか?近視眼的(犯罪を意味しない)?
これに関するポインタは大いに役立ちます。
linux-kernel - Linux IRQ: ISR 内の IRQ のマスク解除
を使用している IRQ がありhandle_level_irq()
ます。ほとんどの場合、ISR は下位半分をスケジュールする必要がありますが、場合によっては、それが偽であると判断でき、(パフォーマンス上の理由から) 下位半分をスケジュールしたくない場合があります。問題は、後者の場合、競合状態が発生することです。ISR がスプリアスであると判断した場合、割り込みのマスクを解除し、終了する準備をします (desc->lock
この時点では、ISR は によって保護されていないことに注意してください)。handle_level_irq()
しかし、その後、2 番目の CPU で割り込みがトリガーされます。2 番目の CPU は、グラブに従ってdesc->lock
IRQ をマスクし、1 番目の CPU で ISR が進行中であると判断するため、ロックを解除desc->lock
して終了します。最初の CPU の元の ISR も終了し、割り込みは常にマスクされたままになります。
必要がない限り、下半分をスケジュールできないようにしたいので、上記の競合状態を回避しながら、ISR がマスクを解除する方法はありますか?
android - Linuxカーネルで独自の新しいsoftirqを定義してトリガーする方法は?
Linux カーネルで独自の softirq を作成したいと考えています。それを行う正しい方法ですか:
init
からトリガーしたいモジュールの に、softirq
次の呼び出しを追加します。
そして、スニペットでは、softirq を上げたいので、raise_softirq
関数への呼び出しを追加します。
そして、私の新しいものを追加softirq
してください:
そしてここで:
質問:
- 私は正しいですか、それとも何かを見逃しましたか?
- それは正しい方法ですか?他のオプションはありますか?
c - softirq とプロセス コンテキスト間でデータを共有する
softirq (netfilter 事前ルーティング フック) とユーザー コンテキスト (ioctl 呼び出し内) の間でデータ構造を共有するカーネル モジュールを開発しています。
このリンクを読んだ後、(spin_lock_bh
またはを使用してspin_lock_irqsave
) データを変更するときにユーザー コンテキストでソフトウェア割り込みを無効にし、共有データの操作が完了したら再度有効にする必要があることがわかりました。
ただし、softirq ハンドラー関数でロックを取得する必要があるかどうかはわかりません。ここでも (spin_lock を使用して) ロックを取得する必要がありますか?
別のsoftirqまたはhardirqとデータを共有する場合、softirqハンドラーでスピンロックを使用するだけでよいことを理解しています。私の理解は正しいですか?
linux - 高度にスレッド化された高頻度の使用にsoftirqが使用されるのはなぜですか?
ネットワークドライバーやブロックドライバーなど、高頻度で使用するためにsoftirqを特別なものにしている理由.
linux - 複数のプロセスを実行してもスケーリングしない
2 つの C++ プロセスがあり、各プロセスに 1 つのスレッドがあります。スレッドは、32 の着信 TCP 接続からのネットワーク トラフィック (Diameter) を処理し、それを解析して、32 の発信 TCP 接続を介して分割メッセージを転送します。この C++ プロセスを DiameterFE と呼びましょう。
実行中の DiameterFE プロセスが 1 つだけの場合、1 秒あたり 70,000 メッセージを処理できます。
2 つの DiameterFE プロセスが実行されている場合、それぞれ 35,000 メッセージ/秒を処理できるため、合計で同じ 70,000 メッセージ/秒になります。
なぜ彼らはスケーリングしないのですか?ボトルネックとは?
詳細: 各 Diameter フロント エンド プロセスには 32 のクライアント (カモメ) と 32 のサーバ (カモメ) があり、別々のホストで実行されます。
これら 2 つのプロセス用に専用ホストが提供されます - 2 つの E5-2670 @ 2.60GHz CPU x 8 コア/ソケット x 2 HW スレッド/コア = 合計 32 スレッド。
10 ギガビット/秒のネットワーク。平均直径メッセージ サイズは 700 バイトです。
Cpu0 だけがネットワーク トラフィックを処理しているようです - 58.7%si. 異なるネットワーク キューを異なる CPU に明示的に構成する必要がありますか?
最初のプロセス (PID=7615) は 89.0 % の CPU を使用し、Cpu0 で実行されています。
2 番目のプロセス (PID=59349) は 70.8 % の CPU を使用し、Cpu8 で実行されています。
一方、Cpu0 は 95.2% = 9.7%us + 26.8%sy + 58.7%si で
ロードされますが、Cpu8 は 70.3% = 14.8%us + 55.5%sy でしかロードされません。
2番目のプロセスでもCpu0が作業を行っているようです。非常に高い softirq があり、Cpu0 = 58.7% のみです。なんで?
キー「1」が押されたときの一番上の出力は次のとおりです。