私の目標は、カスタムの低遅延ネットワークプログラム用に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用です。
「eth1-X」の形式で「eth1」に複数のエントリがあるのはなぜですか?
複数のtx/rxキューがあるためです。これらのキューは、多くの場合(ローカルアドレス、ポート、リモートアドレス、ポート)およびその他のもののハッシュです。トラフィックソースが少ない場合、複数のキューを抑制すると、アプリケーションをより確定的にすることが容易になる場合があります。または、アルゴリズムを調べて、エフェメラルポートを回避する方が簡単な場合もあります。
リアルタイムカーネルを使用していますか? cgroups
またはcpusets
を活用してアプリケーションを分離していますか?株式流通カーネルを使用している場合は、テーブルにかなりのレイテンシーの増加が残っています。また、16個のCPUコアが表示されます。これは、ハイパースレッディングが有効になっていることを示します。実コアと論理コアのどちらにバインドしているかをどのようにして知ることができますか?