web-dev-qa-db-ja.com

イーサネットsmp_affinityvs / proc / interrupts vs / sys / class / net / ethX / device

私の目標は、カスタムの低遅延ネットワークプログラム用にCentOS(「無料」RHEL)5.xサーバーを構成することです。イーサネットNIC割り込み処理をプログラムが実行されているのと同じCPUにバインドすることを実験したいと思います(キャッシュ使用率を改善するため)。このプロセスの最初のステップは、NICのIRQを決定することです。

1つのサーバーでの/ proc/interruptsの内容は次のとおりです(簡潔にするためにCPU 2から14を削除したことに注意してください)。

           CPU0       CPU1       CPU15
  0:  600299726          0          0    IO-APIC-Edge  timer
  1:          3          0          0    IO-APIC-Edge  i8042
  8:          1          0          0    IO-APIC-Edge  rtc
  9:          0          0          0   IO-APIC-level  acpi
 12:          4          0          0    IO-APIC-Edge  i8042
 50:          0          0          0   IO-APIC-level  uhci_hcd:usb6, uhci_hcd:usb8
 58:       6644      25103          0   IO-APIC-level  ioc0
 66:          0          0          0   IO-APIC-level  ata_piix
 74:        221     533830          0   IO-APIC-level  ata_piix
 98:         35          0    2902361       PCI-MSI-X  eth1-0
106:         61         11       3841       PCI-MSI-X  eth1-1
114:         28          0      61452       PCI-MSI-X  eth1-2
122:         24       1586         22       PCI-MSI-X  eth1-3
130:       2912          0        337       PCI-MSI-X  eth1-4
138:         21          0         28       PCI-MSI-X  eth1-5
146:         21          0         56       PCI-MSI-X  eth1-6
154:         34          1          1       PCI-MSI-X  eth1-7
209:         23          0          0   IO-APIC-level  ehci_hcd:usb1
217:          0          0          0   IO-APIC-level  ehci_hcd:usb2, uhci_hcd:usb5, uhci_hcd:usb7
225:          0          0          0   IO-APIC-level  uhci_hcd:usb3
233:          0          0          0   IO-APIC-level  uhci_hcd:usb4
NMI:       7615       2989       2931
LOC:  600328144  600328099  600327086
ERR:          0
MIS:          0

「eth1-X」の形式で「eth1」に複数のエントリがあるのはなぜですか?

また、「/ sys/class/net/eth1/device/irq」の内容は「90」です。しかし、上記の割り込みリストには90はありません。

したがって、IRQ98である「eth1-0」だけを見たとしましょう。/proc/irq/98/smp_affinityの内容は次のとおりです。

00000000,00000000,00000000,00000000,00000000,00000000,00000000,00008000

これは、1つの数字ではなく、数字のリストです。

では、eth1のsmp_affinityを設定するにはどうすればよいですか?

私が見つけたオンラインの例やドキュメントのどれも、このようなケースについて言及していませんでした。/proc/interruptsには常に1つの「ethX」エントリがあります。示された割り込みは/ sys/class/net/ethX/device/irqと一致します。/proc/irq/N/smp_affinityには1つの番号しかありません。

FWIW、このアプリケーションは非常にレイテンシーに敏感であることを付け加えておきます。 C状態とプロセッサ周波数スケーリングを無効にするところまで(これらの機能はレイテンシーを引き起こしすぎるため)。 マイクロ秒はここで違いを生みます。

編集:次のWebページに出くわしました http://www.kernel.org/doc/man-pages/online/pages /man7/cpuset.7.html これは、cpusetに関するものですが、「Mask Format」というタイトルのセクションがあり、私は仮定は私と同じです。/proc/irq // smp_affinityファイルに表示されています。引用:

この形式では、各32ビットワードが16進数で表示されます(ASCII文字 "0"-"9"および "a"-"f"を使用)。必要に応じて、ワードは先行ゼロで埋められます。 1ワードより長いマスクの場合、ワード間にコンマ区切り文字が使用されます。ワードはビッグエンドの順序で表示され、最上位ビットが最初になります。ワード内の16進数もビッグエンディアンの順序になります。

表示される32ビットワードの数は、ビットマスクのサイズに基づいて、ビットマスクのすべてのビットを表示するために必要な最小数です。

マスクフォーマットの例:

   00000001                        # just bit 0 set
   40000000,00000000,00000000      # just bit 94 set
   00000001,00000000,00000000      # just bit 64 set
   000000ff,00000000               # bits 32-39 set
   00000000,000E3862               # 1,5,6,11-13,17-19 set

ビット0、1、2、4、8、16、32、および64が設定されたマスクは、次のように表示されます。

   00000001,00000001,00010117

最初の「1」はビット64、2番目はビット32、3番目はビット16、4番目はビット8、5番目はビット4、「7」はビット2、1、0用です。

4
Matt

「eth1-X」の形式で「eth1」に複数のエントリがあるのはなぜですか?

複数のtx/rxキューがあるためです。これらのキューは、多くの場合(ローカルアドレス、ポート、リモートアドレス、ポート)およびその他のもののハッシュです。トラフィックソースが少ない場合、複数のキューを抑制すると、アプリケーションをより確定的にすることが容易になる場合があります。または、アルゴリズムを調べて、エフェメラルポートを回避する方が簡単な場合もあります。

3
Brian Cain

リアルタイムカーネルを使用していますか? cgroupsまたはcpusetsを活用してアプリケーションを分離していますか?株式流通カーネルを使用している場合は、テーブルにかなりのレイテンシーの増加が残っています。また、16個のCPUコアが表示されます。これは、ハイパースレッディングが有効になっていることを示します。実コアと論理コアのどちらにバインドしているかをどのようにして知ることができますか?

2
ewwhite