CPU0がeth1割り込みであふれている


12

UbuntuベースのXen XCP内で実行されているUbuntu VMがあります。背後にあるカスタムFCGIベースのHTTPサービスをホストしますnginx

最初のCPUコアから負荷ab が飽和状態になり、残りの負荷が不足します。

/proc/interrupts私が見ることCPU0は、他のコアよりも大きさ以上の割り込みのために役立ちます。それらのほとんどはから来ていeth1ます。

このVMのパフォーマンスを改善するためにできることはありますか?割り込みをより均等にバランスさせる方法はありますか?


流血の詳細:

$ uname -a
Linux MYHOST 2.6.38-15-virtual#59-Ubuntu SMP Fri Apr 27 16:40:18 UTC 2012 i686 i686 i386 GNU / Linux

$ lsb_release -a
使用可能なLSBモジュールはありません。
ディストリビューターID:Ubuntu
説明:Ubuntu 11.04
リリース:11.04
コードネーム:natty

$ cat / proc / interrupts 
           CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7       
283:113720624 0 0 0 0 0 0 0 xen-dyn-event eth1
284:1 0 0 0 0 0 0 0 xen-dyn-event eth0
285:2254 0 0 3873799 0 0 0 0 xen-dyn-event blkif
286:23 0 0 0 0 0 0 0 xen-dyn-event hvc_console
287:492 42 0 0 0 0 0 295324 xen-dyn-event xenbus
288:0 0 0 0 0 0 0 222294 xen-percpu-ipi callfuncsingle7
289:0 0 0 0 0 0 0 0 xen-percpu-virq debug7
290:0 0 0 0 0 0 0 151302 xen-percpu-ipi callfunc7
291:0 0 0 0 0 0 0 3236015 xen-percpu-ipi resched7
292:0 0 0 0 0 0 0 60064 xen-percpu-ipi spinlock7
293:0 0 0 0 0 0 0 12355510 xen-percpu-virq timer7
294:0 0 0 0 0 0 803174 0 xen-percpu-ipi callfuncsingle6
295:0 0 0 0 0 0 0 0 xen-percpu-virq debug6
296:0 0 0 0 0 0 60027 0 xen-percpu-ipi callfunc6
297:0 0 0 0 0 0 5374762 0 xen-percpu-ipi resched6
298:0 0 0 0 0 0 64976 0 xen-percpu-ipi spinlock6
299:0 0 0 0 0 0 15294870 0 xen-percpu-virq timer6
300:0 0 0 0 0 264441 0 0 xen-percpu-ipi callfuncsingle5
301:0 0 0 0 0 0 0 0 xen-percpu-virq debug5
302:0 0 0 0 0 79324 0 0 xen-percpu-ipi callfunc5
303:0 0 0 0 0 3468144 0 0 xen-percpu-ipi resched5
304:0 0 0 0 0 66269 0 0 xen-percpu-ipi spinlock5
305:0 0 0 0 0 12778464 0 0 xen-percpu-virq timer5
306:0 0 0 0 844591 0 0 0 xen-percpu-ipi callfuncsingle4
307:0 0 0 0 0 0 0 0 xen-percpu-virq debug4
308:0 0 0 0 75293 0 0 0 xen-percpu-ipi callfunc4
309:0 0 0 0 3482146 0 0 0 xen-percpu-ipi resched4
310:0 0 0 0 79312 0 0 0 xen-percpu-ipi spinlock4
311:0 0 0 0 21642424 0 0 0 xen-percpu-virq timer4
312:0 0 0 449141 0 0 0 0 xen-percpu-ipi callfuncsingle3
313:0 0 0 0 0 0 0 0 xen-percpu-virq debug3
314:0 0 0 95405 0 0 0 0 xen-percpu-ipi callfunc3
315:0 0 0 3802992 0 0 0 0 xen-percpu-ipi resched3
316:0 0 0 76607 0 0 0 0 xen-percpu-ipi spinlock3
317:0 0 0 16439729 0 0 0 0 xen-percpu-virq timer3
318:0 0 876383 0 0 0 0 0 xen-percpu-ipi callfuncsingle2
319:0 0 0 0 0 0 0 0 xen-percpu-virq debug2
320:0 0 76416 0 0 0 0 0 xen-percpu-ipi callfunc2
321:0 0 3422476 0 0 0 0 0 xen-percpu-ipi resched2
322:0 0 69217 0 0 0 0 0 xen-percpu-ipi spinlock2
323:0 0 10247182 0 0 0 0 0 xen-percpu-virq timer2
324:0 393514 0 0 0 0 0 0 xen-percpu-ipi callfuncsingle1
325:0 0 0 0 0 0 0 0 xen-percpu-virq debug1
326:0 95773 0 0 0 0 0 0 xen-percpu-ipi callfunc1
327:0 3551629 0 0 0 0 0 0 xen-percpu-ipi resched1
328:0 77823 0 0 0 0 0 0 xen-percpu-ipi spinlock1
329:0 13784021 0 0 0 0 0 0 xen-percpu-virq timer1
330:730435 0 0 0 0 0 0 0 xen-percpu-ipi callfuncsingle0
331:0 0 0 0 0 0 0 0 xen-percpu-virq debug0
332:39649 0 0 0 0 0 0 0 xen-percpu-ipi callfunc0
333:3607120 0 0 0 0 0 0 0 xen-percpu-ipi resched0
334:348740 0 0 0 0 0 0 0 xen-percpu-ipi spinlock0
335:89912004 0 0 0 0 0 0 0 xen-percpu-virq timer0
NMI:0 0 0 0 0 0 0 0マスク不能割り込み
LOC:0 0 0 0 0 0 0 0ローカルタイマー割り込み
SPU:0 0 0 0 0 0 0 0スプリアス割り込み
PMI:0 0 0 0 0 0 0 0パフォーマンス監視割り込み
IWI:0 0 0 0 0 0 0 0 0 IRQ作業割り込み
RES:3607120 3551629 3422476 3802992 3482146 3468144 5374762 3236015割り込みの再スケジュール
CAL:770084 489287 952799 544546 919884 343765 863201 373596関数呼び出し割り込み
TLB:0 0 0 0 0 0 0 0 TLBシュートダウン
TRM:0 0 0 0 0 0 0 0熱イベント割り込み
THR:0 0 0 0 0 0 0 0しきい値APIC割り込み
MCE:0 0 0 0 0 0 0 0マシンチェック例外
MCP:0 0 0 0 0 0 0 0マシンチェックポーリング
エラー:0
MIS:0

ボーナス質問:からの割り込みの数を減らす方法はありeth1ますか?
アレクサンダーグラディシュ

回答:


10

/proc/irq/283ディレクトリを見てください。smp_affinity_listどのCPUが283割り込みを受け取るかを示すファイルがあります。このファイルには、おそらく「0」が含まれています(smp_affinityおそらく「1」が含まれています)。

CPU範囲をsmp_affinity_listファイルに書き込むことができます。

echo 0-7 | sudo tee /proc/irq/283/smp_affinity_list

または、各ビットがCPUに対応するビットマスクを次のように記述できますsmp_affinity

printf %x $((2**8-1)) | sudo tee /proc/irq/283/smp_affinity

ただし、irqbalanceは、各割り込みにどのようなアフィニティーが必要かという独自のアイデアを持っていることが知られており、更新を元に戻す可能性があります。したがって、irqbalanceを完全にアンインストールするのが最善です。または、少なくともそれを停止し、再起動時に起動しないようにします。

irqbalanceがなくてもsmp_affinity、再起動後に割り込み283 が発生する場合は、起動スクリプトの1つでCPUアフィニティを手動で更新する必要があります。


irqbalanceすでに実行されています。たぶん正しく設定されていませんか?それを確認する方法は?
アレクサンダーグラディシュ

たぶん、irqbalanceを無効にしてリブートし、それが役立つかどうか確認してください。割り込みはデフォルトでかなりバランスが取れています。
チャッツ

FYI:/proc/irq/283/smp_affinityしている01ことになりました(誰もが私の知る限り、このマシンでその原料を変更していない-これは、システムのデフォルトでなければなりませんので)。
アレクサンダーグラディシュ

申し訳ありませんが、回答を更新しました。おそらくirqbalanceが原因です。それを取り除くだけです。デフォルトがどのようになっているのかはわかりませんが、経験から、デフォルトは「すべてのCPU」になっています。
-chutz

irqbalance(経由ENABLED=0/etc/default/irqbalance)無効にしても効果はありません。再起動後irqbalanceはですがstop/waiting/proc/irq/283/smp_affinityまだ01です。
アレクサンダーグラディシュ

2

Intel NICの適切なモデルがある場合、パフォーマンスを大幅に改善できます。

最初の段落を引用するには:

マルチコアプロセッサと最新のイーサネットアダプタ(82575、82576、82598、82599を含む)を使用すると、実行フローを個々のコアに割り当てることで、TCP転送フローを最適化できます。デフォルトでは、Linuxは自動的に割り込みをプロセッサコアに割り当てます。現在、割り込みを自動的に割り当てるための2つの方法があります。ユーザー空間でのIRQバランサーとIRQバランスデーモンです。どちらもCPU使用率を下げる可能性があるトレードオフを提供しますが、IP転送レートを最大化しません。イーサネットアダプターのキューを特定のプロセッサーコアに手動で固定することにより、最適なスループットを得ることができます。

IP転送の場合、送信/受信キューペアは同じプロセッサコアを使用し、異なるコア間のキャッシュ同期を削減する必要があります。これは、特定のコアに送信割り込みと受信割り込みを割り当てることで実行できます。Linuxカーネル2.6.27以降、82575、82576、82598、82599では複数のキューを使用できます。さらに、拡張メッセージングシグナル割り込み(MSI-X)で複数の送信キューが有効になりました。MSI-Xは、使用可能な多数の割り込みをサポートしており、特定のCPUへの割り込みのきめ細かな制御とターゲティングを可能にします。

参照:Intel®82575/82576または82598/82599イーサネットコントローラーを使用したプロセッサーコアへの割り込みの割り当て


2

実際、特に短期間の反復プロセスを処理する場合は、IRQバランシングではなく、デバイスキューによって生成されるすべての割り込みを同じCPUで処理することをお勧めします。したがって、単一のCPUがeth1割り込みを処理するとパフォーマンスが向上します***下記の例外

上記のリンク元のソースはLinuxシンポジウムからのものです。この記事よりも効果的に説得できるので、SMP IRQアフィニティに関するいくつかの段落を読むことをお勧めします。

どうして?

メインメモリーにアクセスできることに加えて、各プロセッサーには独自のキャッシュがあることを思い出してください。この図をご覧ください。割り込みがトリガーされると、CPUコアはメインメモリから割り込みを処理するための命令をフェッチする必要があり、命令がキャッシュ内にある場合よりもはるかに時間がかかります。プロセッサがタスクを実行すると、キャッシュにこれらの命令が含まれます。ここで、同じCPUコアがほとんど常に同じ割り込みを処理するとします。割り込みハンドラー関数はCPUコアキャッシュを離れることはほとんどなく、カーネルのパフォーマンスが向上します。

あるいは、IRQのバランスが取れている場合、割り込みを異なるCPUで常に処理するように割り当てることができます。その場合、新しいCPUコアはキャッシュに割り込みハンドラー機能を持たず、メインから適切なハンドラーを取得するのに長い時間が必要になりますメモリ。

例外:めったにeth1割り込みを使用していない場合、他のタスクを実行することでキャッシュが上書きされるのに十分な時間が経過し、その間、そのインターフェイスを介して断続的にデータが到着する場合...なぜなら、プロセスを高頻度で使用するときだからです。

結論

割り込みが非常に頻繁に発生する場合は、特定のCPUのみによって処理されるようにその割り込みをバインドするだけです。この構成は

 /proc/'IRQ number'/smp_affinity

または

/proc/irq/'IRQ number'/smp_affinity

上記のリンク元のSMP IRQアフィニティセクションの最後の段落を参照してください。手順が記載されています。

代わりに

ネットワークで許可されている場合はMTUサイズ(ジャンボフレーム)を大きくするか、パケットごとではなく大量のパケットを受信した後にフラグを立てるように変更するか、またはタイムアウトになるため、一定時間後に割り込みを発生させます。タイムアウトが発生する前にバッファサイズがいっぱいになる可能性があるため、timeオプションには注意してください。これは、リンクされたソースで概説されているethtoolを使用して実行できます。

この答えは、人々がそれを読んでいない長さに近づいているので、私はあまり詳しくはしませんが、あなたの状況に応じて多くの解決策があります...ソースを確認してください:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.