共通コマンド
```
# 查看当前运行情况
service irqbalance status
# 终止服务
service irqbalance stop
取消开机启动:
chkconfig irqbalance off
# irqbalance -h
```
```
/proc/interrupts 文件中可以看到各个 cpu 上的中断情况。
/proc/irq/#/smp_affinity_list 可以查看指定中断当前绑定的 CPU
获得各网卡中断的当前 cpu 的整体情况
cat /proc/interrupts | grep eth0- | cut -d: -f1 | while read i; do echo -ne irq":$i\t bind_cpu: "; cat /proc/irq/$i/smp_affinity_list; done | sort -n -t' ' -k3
```
Linux チューニング: 仮想化チューニング (irqbalance NIC 割り込みバインディング)* 2_Charlie Wang のブログ-CSDN Blog_irqbalance linux
irqbalance_adaptiver のブログ - CSDN blog_irqbalance サービス
irqbalance アンバランス割り込み? |irqbalanceの設定は効果がないのでしょうか?
(https://access.redhat.com/solutions/677073)
1、カーネルはバージョン kernel-2.6.32-358.2.1.el6 より大きいことが保証されています
2. irqbalance のバージョンが十分に新しいことを確認します
3,根本原因
-
以前は、irqbalance デーモンは、禁止された CPU セットの IRQ (割り込み要求) に対する NUMA ノードの割り当てを考慮していませんでした。その結果、IRQBALANCE_BANNED_IRQS 変数が単一の CPU に設定された場合、irqbalance はアフィニティを誤って設定しました。さらに、適格な CPU を持たないノードには IRQ を割り当てることができませんでした。ノードの割り当ては、unbanned_cpus ビットマスクで定義されている適格な CPU を持つノードに制限され、バグが修正されました。その結果、irqbalance はアフィニティを適切に設定し、IRQ がそれぞれのノードに正しく割り当てられるようになりました。(BZ#1054590、BZ#1054591)
-
この更新より前は、irqbalance デーモンの依存関係が誤って設定され、間違ったカーネル バージョンを参照していました。その結果、irqbalance は NUMA システム上の IRQ のバランスをとることができませんでした。この更新により、依存関係が修正され、NUMA システム上で IRQ のバランスが正しくとられるようになりました。irqbalance デーモンを正しく使用するには、irqbalance パッケージのユーザーはカーネルを 2.6.32-358.2.1 以降に更新する必要があることに注意してください。(BZ#1055572、BZ#1055574)
-
最新バージョンより前の irqbalance は、ローカルの NUMA ノードや IRQ の送信先デバイスを正確に判断できませんでした。カーネルの affinity_hint 値は、この問題を回避するために作成されました。今回のアップデートにより、irqbalance は sysfs() 関数によって提供される IRQ に関するすべての情報を解析できるようになりました。IRQ バランシングが正しく機能するようになり、irqbalance 機能を歪めないよう、affinity_hint 値がデフォルトで無視されるようになりました。(BZ1093441、BZ1093440)
診断手順
-
割り込みのバランスが取れていません:
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 59: 1292013110 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-0 60: 851840288 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-1 61: 843207989 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-2 62: 753317489 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-3 $ grep eth /proc/interrupts 71: 2073421 5816340 ...lots of zeroes... PCI-MSI-edge eth11-q0 72: 294863 114392 ...lots of zeroes... PCI-MSI-edge eth11-q1 73: 63206 234005 ...lots of zeroes... PCI-MSI-edge eth11-q2 74: 238342 72189 ...lots of zeroes... PCI-MSI-edge eth11-q3 79: 1491483 699 ...lots of zeroes... PCI-MSI-edge eth9-q0 80: 1 525546 ...lots of zeroes... PCI-MSI-edge eth9-q1 81: 1524075 5 ...lots of zeroes... PCI-MSI-edge eth9-q2 82: 9 1869645 ...lots of zeroes... PCI-MSI-edge eth9-q3
-
irqbalance サービスがオンになり、実行されています。
$ chkconfig | grep irqb irqbalance 0:off 1:off 2:off 3:on 4:on 5:on 6:off $ grep irqb ps root 1480 0.0 0.0 10948 668 ? Ss Oct31 4:27 irqbalance
-
$ egrep -v "^#" /etc/sysconfig/irqbalance $ grep: /etc/sysconfig/irqbalance: No such file or directory
-
割り込みは他の/すべての CPU コアに到達することが許可されます。
(irqbalance で CPU に割り込みを割り当てたい場合は、それらの CPU で割り込みを実行できるようにアフィニティを設定する必要があります)
$ for i in {59..62}; do echo -n "Interrupt $i is allowed on CPUs "; cat /proc/irq/$i/smp_affinity_list; done Interrupt 59 is allowed on CPUs 0-5 Interrupt 60 is allowed on CPUs 0-5 Interrupt 61 is allowed on CPUs 0-5 Interrupt 62 is allowed on CPUs 0-5 $ for i in {71..82}; do echo -n " IRQ $i: "; cat /proc/irq/$i/smp_affinity_list; done IRQ 71: 1,3,5,7,9,11,13,15,17,19,21,23 IRQ 72: 0,2,4,6,8,10,12,14,16,18,20,22 IRQ 73: 1,3,5,7,9,11,13,15,17,19,21,23 IRQ 74: 0,2,4,6,8,10,12,14,16,18,20,22 IRQ 79: 0,2,4,6,8,10,12,14,16,18,20,22 IRQ 80: 1,3,5,7,9,11,13,15,17,19,21,23 IRQ 81: 0,2,4,6,8,10,12,14,16,18,20,22 IRQ 82: 1,3,5,7,9,11,13,15,17,19,21,23
-
プロセッサーはキャッシュの局所性を共有しないため、 設計により irqbalance が動作しなくなります。
(irqbalance の動作を妨げるため、プロセッサーがキャッシュの場所を共有しないようにしてください)
$ for i in {0..3}; do for j in {0..7}; do echo -n "cpu$j, index $i: "; cat /sys/devices/system/cpu/cpu$j/cache/index$i/shared_cpu_map; done; done cpu0, index 0: 00000001 cpu1, index 0: 00000002 cpu2, index 0: 00000004 cpu3, index 0: 00000008 cpu4, index 0: 00000010 cpu5, index 0: 00000020 cpu6, index 0: 00000040 cpu7, index 0: 00000080 cpu0, index 1: 00000001 cpu1, index 1: 00000002 cpu2, index 1: 00000004 cpu3, index 1: 00000008 cpu4, index 1: 00000010 cpu5, index 1: 00000020 cpu6, index 1: 00000040 cpu7, index 1: 00000080 cpu0, index 2: 00000001 cpu1, index 2: 00000002 cpu2, index 2: 00000004 cpu3, index 2: 00000008 cpu4, index 2: 00000010 cpu5, index 2: 00000020 cpu6, index 2: 00000040 cpu7, index 2: 00000080 cpu0, index 3: 00000001 cpu1, index 3: 00000002 cpu2, index 3: 00000004 cpu3, index 3: 00000008 cpu4, index 3: 00000010 cpu5, index 3: 00000020 cpu6, index 3: 00000040 cpu7, index 3: 00000080
-
CPU と MEM のトップ ユーザー
USER %CPU %MEM RSS oracle 204.9% 12.2% 5.34 GiB
-
Oracle インスタンスは中断不可能なスリープ状態で、プロセスが停止しています:
USER PID %CPU %MEM VSZ-MiB RSS-MiB TTY STAT START TIME COMMAND oracle 17631 10.5 0.2 260 57 ? Ds 22:10 3:17 ora_j000_INDWS
-
サービス
irqbalance
は、次の場所で「リソースが一時的に利用できません」エラーを報告しますlsof -b
。lsof | grep -i irqbalance lsof: avoiding stat(/usr/sbin/irqbalance): -b was specified. irqbalanc 1480 0 txt unknown /usr/sbin/irqbalance (stat: Resource temporarily unavailable) irqbalanc 1480 0 mem REG 8,2 423023 /usr/sbin/irqbalance (stat: Resource temporarily unavailable)
ただし -b
、NFS マウントの存在により lsof
実行が 妨げられstat()
、代わりに実行される statsafely()
ため、次のメッセージが予想されます。
statsafely(path, buf)
char *path; /* file path */
struct stat *buf; /* stat buffer address */
{
if (Fblock) {
if (!Fwarn)
(void) fprintf(stderr,
"%s: avoiding stat(%s): -b was specified.\n",
Pn, path);
errno = EWOULDBLOCK;
return(1);
}
return(doinchild(dostat, path, (char *)buf, sizeof(struct stat)));
}
オプションが指定されている場合 -b
、 Fblock
を取得します True
。 EWOULDBLOCK
(= EAGAIN
)が返されます。
割り込みの説明
ハード割り込み処理プログラムは中断できないため、実行に時間がかかりすぎると CPU が他のハードウェア割り込みに応答できなくなります。そのため、カーネルはソフト割り込みを導入して、ハード割り込み処理機能の時間のかかる部分を移動させます。ソフト割り込み処理関数へ。
カーネル内のksof ti rqd プロセスは、特にソフト割り込みの処理を担当します。
ソフト割り込みを受信すると、対応するソフト割り込みに対応する処理関数を呼び出します。ネットワーク カード ドライバー モジュールによってスローされたソフト割り込みの場合、ksoftirqd はネットワークモジュールの net_rx_action 関数を呼び出します。
< LINUX カーネル ネットワークのソフト割り込み KSOFTIRQD - 組み込みテクノロジ - Electronics Enthusiasts Network >より
データ パケット --> ネットワーク カード --DMA --> メモリ ハードウェア割り込み --> ksof ti rqd (ソフト割り込み ksoftirqd。ソフト割り込みシステムは、各 CPU に 1 つずつある一連のカーネル スレッドとして想像できます)
Softirq は実際にはカーネル スレッドとして実行され、各 CPU は Softirq カーネル スレッドに対応し、この Softirq カーネル スレッドは ksoftirqd/CPU 番号と呼ばれます。
$ ps aux | grep ソフトIRQ
ルート 7 0.0 0.0 0 0 ? S 10月10日 0:01 [ksoftirqd/0]
ルート 16 0.0 0.0 0 0 ? S 10月10日 0:01 [ksoftirqd/1]
角括弧で囲まれた名前は通常、カーネル スレッドです。
top コマンドを実行すると、カーネル スレッド ksoftirqd/0 が表示されます。これは、下の図に示すように、softirq スレッドが CPU 0 で実行されることを意味します。
CPU 使用率を表示する場合、si フィールドは Softirq ソフト割り込みに対応します。
RSS (Receive Side Scaling) はネットワーク カードのハードウェア機能であり、複数のキューを実装し、異なる割り込み時間を異なる CPU に分散できます。
シングルコア CPU ではネットワーク カードのニーズを完全に満たすことはできませんが、マルチキュー ネットワーク カード ドライバーのサポートにより、各キューは割り込みを通じて異なるコアにバインドされ、ネットワーク カードのニーズを満たし、CPU0 の負荷を軽減します。
ネットワーク カードがキューをサポートしているかどうか、およびサポートしているキューの数を確認します。
awk '$NF~/ens3f0np0/{print $1,$NF}' /proc/interrupts
awk '$NF~/ens3/{print $1,$NF}' /proc/interrupts
37 : eth0-TxRx-0
38: eth0-TxRx-1
39: eth0-TxRx-2
40: eth0-TxRx-3
41: eth0-TxRx-4
42: eth0-TxRx-5
43: eth0-TxRx-6
44: eth0-TxRx-7
上記のネットワーク カード eth0 は例としてキューをサポートしており、37 ~ 44 は割り込み番号です。一般に、主流のネットワーク カード ドライバーは現在複数のキューをサポートしており、デフォルトは 7 つのキューです。
各割り込み番号をどのCPUが処理しているかを確認する
バインドを解除する
ネットワーク カードはキューをサポートしています。つまり、割り込み番号と処理 CPU の間の関係をバインドできます。
Linux システムは、デフォルトで irqbalance サービスを使用して割り込み割り当てを最適化します。データを自動的に収集し、割り込み要求をスケジュールできますが、その割り当てとスケジューリング メカニズムは非常に不均一です。これを有効にすることはお勧めできません。割り込みバインディングを理解するには、 irqbalance サービスをオフにしてバインディングを手動で調整し、関係を決定します。
## 関連する構成ファイル:
割り込み IRQ_ID の CPU アフィニティ設定には、2 つの同等の設定ファイルがあります。
/proc/irq/割り込み番号/smp_affinity、16進数
/proc/irq/割り込み番号/smp_affinity_list、10進数、
smp_affinity と smp_affinity_list は同等です。一方を変更するだけです (もう一方もそれに応じて変更されます)。smp_affinity_list の変更の方が便利です。
*) smp_affinity については、カンマで区切られた 16 進数のビットマスクです。CPU マスクは最大 64 ビットです。コア数が 32 を超える場合は、00000001,0000ff00 のように、カンマで区切って 2 つの 32 ビット マスクを使用できます。 )
たとえば、0000,00000020 は、irq が CPU5 に割り当てられていることを意味します。(0x20=00100000、5 番目の CPU)
エコー 0x0004 > /proc/irq /50/smp_affinity
/proc/softirqs は、softirqs の実行ステータスを提供します。
[root@node33 ~]# cat /proc/softirqs|awk '{print $1,$2,$95}'|column -t
CPU0 CPU1 CPU94
ひ: 0 0
タイマー: 2109 14097 72722
NET_TX: 1 168
NET_RX: 14 25408
ブロック: 0 0
IRQ_POLL: 0 0
タスクレット: 10 4
予定: 0 0
HRタイマー: 0 0
RCU: 148145894 25453537
次の 2 点に注意してください。
まず、最初の列のソフト割り込みのタイプに注目してください。
次に、異なる CPU 上の同じソフト割り込みの分散、つまり同じ行の内容に注意してください。
最初の列は割り込み ID 番号、CPU N 列は n 番目の CPU コアの割り込み応答数、最後から 2 番目の列は割り込みタイプ、最後の列は説明です。
echo コマンドを使用して CPU マスクを /proc/irq/interrupt ID/smp_affinity ファイルに書き込み、割り込みの CPU アフィニティを変更します。例えば
エコー 0x0004 > /proc/irq /50/smp_affinity
2.2 中断を避けるための irqblance の構成
割り込みバランス デーモン (irqbalance デーモン) は、割り込みを各 CPU コアに定期的に均等かつ公平に分散します。これはデフォルトで有効になっています。1 つの方法は、irqblance を直接オフにして、割り込みが各コアに自動的に割り当てられないようにする方法で、もう 1 つの方法は、割り込みバランス戦略をカスタマイズして、遅延に敏感なコアを戦略から除外する、つまり割り込みを受信しない、または設定する方法です。割り込み 割り込みのアフィニティは、以下で 1 つずつ紹介する遅延に敏感なコアには割り当てられません。
閉じる
このデーモン プロセスを閉じると、すべての割り込み応答が CPU0 コアによって処理されるようになります。
デーモンプロセスの実行ステータスを表示します: systemctl status irqbalance
デーモンを閉じます: systemctl stop irqbalance
起動後に再起動しないようにプロセスをキャンセルします: systemctl disable irqbalance
irqblance を終了する CPU を指定する
/etc/sysconfig/irqbalance 構成ファイルを変更することで、指定した CPU コアを割り込みバランス デーモンのリストから削除できます。つまり、デーモンはこれらの CPU コアに割り込みを割り当てなくなります。
/etc/sysconfig/irqbalance ファイルを開き、「#IRQBALANCE_BANNED_CPUS=」の位置を見つけてコメントをキャンセルし、等号の後に CPU 16 進数マスクを入力します。次に例を示します。
IRQBALANCE_BANNED_CPUS=0000ff00
ここのマスクには最大 64 ビットを含めることができます。システムに 32 を超えるコアがある場合は、等号の後に 2 つの 32 ビット マスクを追加し、それらをカンマで区切ることができます。
IRQBALANCE_BANNED_CPUS=00000001,0000ff00
8~15と33の9コアを分離するためです。
システムの中断とは何ですか
ハード割り込みを表示する
cat /proc/割り込み
1
ソフトウェアを見る
cat /proc/softirqs
1
筆者を例に挙げると、筆者のシングルコアシステムにおけるソフト割り込みに対応する割り込み数は以下のようになることがわかります。1列目の対応する割り込みタイプはそれぞれ
NET_RX は、ネットワーク受信が中断されたことを示します
NET_TX は、ネットワーク送信が中断されていることを示します
TIMER はタイマー割り込みを意味します
RCU は RCU ロック割り込みを意味します
SCHED はカーネル スケジューリング割り込みを意味します
もちろん、ソフト割り込みのリアルタイム変化率を確認することもできます。
watch -d cat /proc/softirqs
ソフト割り込みの最終処理がカーネル スレッドに引き渡されて処理されることは誰もが知っています。次のコマンドを入力して表示することもできます。
ps aux |grep Softirq
以下の図に示すように、作者のサーバーはシングルコアであるため、カーネルスレッドは 1 つだけであり、その名前も非常に単純です [ksoftirq/cpu 番号]
。
元のリンク: https://blog.csdn.net/shark_chili3007/article/details/114441820
割り込み統計手法
#共通変数を定義する
インターフェース=ens3f1np1
PCI_ADDR =$(ethtool -i ${INTERFACE} |grep "バス情報" |awk '{print $2}' )
SIZE=1M_all_cpu
RW =書き込み
#1 io の前後の割り込み回数を記録する
#前方:
cat /proc/interrupts|grep -E "$PCI_ADDR" |awk '{print $ 1 ,$( 31 + 2 ),$( 63 + 2 ),$( 95 + 2 ),$( 127 + 2 )}' |列 -t > cpu31- 63 - 95 - 127 irq- ${SIZE } -${RW}-0.txt
#戻る:
cat /proc/interrupts|grep -E "$PCI_ADDR" |awk '{print $ 1 ,$( 31 + 2 ),$( 63 + 2 ),$( 95 + 2 ),$( 127 + 2 )}' |列 -t > cpu31- 63 - 95 - 127 irq- ${SIZE} - ${RW} - 1 .txt
# *説明: PCI_ADDR は、ネットワーク カードのPCIアドレスを取得します。awk '{print $1,$(31 +2 ),$(63 +2 ),$(95 +2 ),$(127 +2 )}'は、最初の列 (割り込み番号)、CPU31、CPU63、を出力することを意味します。 CPU95、CPU127の割り込みを記載します。
# 2 計算
貼り付けcpu31- 63 - 95 - 127 irq- ${SIZE} - ${RW} - 0 .txt cpu31- 63 - 95 - 127 irq- ${SIZE} - ${RW} - 1 .txt > uinte.txt #表と裏の書類を水平方向に結合します
cat uinte.txt|awk '{print $1 , $7 - $2 , $8 - $3 , $9 - $4 , $10 - $5 }' |column -t|tr ':' ' ' > cpu31- 63 - 95 -127irq- ${ SIZE} - ${RW} -result.txt #列の減算 (後の統計から前の統計を引く)
#3 フィルター結果
#31 CPU の割り込みの統計を取得する
cat cpu31- 63 - 95 - 127 irq- ${SIZE} - ${RW} -result.txt |awk '$ 2 > 0 {print $ 0 }'
他の:
コロンを削除します cat cpu31-63-95-127irq-1M-write-result.txt|tr ':' ' ' > uinte.txt
sumlimeで結果ファイルを開き、マウスの中ボタンを押したままにすると、列ごとに選択してExcelに貼り付けることができます
CPU 割り込みの数を表示する
マルチコアCPUの各コアCPUの割り込み数を表示します。
# mpstat -I SUM -P ALL 1 3
Linux 5.4.0-40-generic (verify-new-511kernel) 08/28/2021 _x86_64_ (72 CPU)
09:09:30 AM CPU 内部秒
午前 09:09:31 すべて 18762.00
午前 09:09:31 0 253.00
午前 09:09:31 1 256.00
09:09:31 AM 2 253.00
午前 09:09:31 3 253.00
午前 09:09:31 4 254.00
午前 09:09:31 5 260.00
例証します:
pstat [-I {SUM| CPU | SCPU}][-P {|ALL}] [内部 [カウント]]
パラメータの説明
-I は割り込みを表示します {SUM は各 CPU の割り込み数の合計を意味します | SCPU は個々のソフトウェア割り込みの数}
-P {|ALL} は監視する CPU を示し、cpu の値は [0,cpu 番号 -1] にあります。
内部 2 つの隣接するサンプル間の間隔、
count サンプリング回数。count は遅延とのみ使用できます。
特定の CPU に割り込みが集中すると、CPU に負荷がかかりますので、各 CPU に均等に割り込みを分散することを推奨します。
-----------------------------------
CPU 割り込み番号ビューとネットワーク カード割り込みバインディング コア
https://blog.51cto.com/u_15080020/4188117
テストドラフト
インターフェイス=ens3f1np1
PCI_ADDR=$(ethtool -i ${INTERFACE}|grep "バス情報"|awk '{print $2}')
SIZE=1M_all_cpu
RW=書き込み
1 io の前後の割り込み数を記録します。
#前方:
cat /proc/interrupts|grep -E "$PCI_ADDR"| awk '{for(i=65; i<=NF; i++){ $i="" }; $0 を印刷します }'| 列 -t > cpu-irq-${SIZE}-${RW}-0.txt
#戻る:
cat /proc/interrupts|grep -E "$PCI_ADDR"| awk '{for(i=65; i<=NF; i++){ $i="" }; $0 を印刷します }'| 列 -t > cpu-irq-${SIZE}-${RW}-1.txt
2つの計算
past cpu-irq-${SIZE}-${RW}-0.txt cpu-irq-${SIZE}-${RW}-1.txt > uinte.txt #2 つのドキュメントを水平方向に結合します
cat uinte.txt|awk '{print $1,$66-$2,$67-$3,$68-$4,$69-$5,$70-$6,$71-$7,$72-$8,$73-$9,$74-$10,$75-$11,$76-$12,$77-$13,$78-$14,$79-$15,$80-$16,$81-$17,$82-$18,$83-$19,$84-$20,$85-$21,$86-$22,$87-$23,$88-$24,$89-$25,$90-$26,$91-$27,$92-$28,$93-$29,$94-$30,$95-$31,$96-$32,$97-$33,$98-$34,$99-$35,$100-$36,$101-$37,$102-$38,$103-$39,$104-$40,$105-$41,$106-$42,$107-$43,$108-$44,$109-$45,$110-$46,$111-$47,$112-$48,$113-$49,$114-$50,$115-$51,$116-$52,$117-$53,$118-$54,$119-$55,$120-$56,$121-$57,$122-$58,$123-$59,$124-$60,$125-$61,$126-$62,$127-$63,$128-$64}' |column -t|tr ':' ' ' > cpu-irq-${SIZE}-${RW}-result.txt #列相减(后面的统计减去前面的统计)
cat cpu-irq-1M_all_cpu-write-result.txt|awk '{ for(i=36;i<=96;i++){$i=""} {print $0}}'|column -t
cat cpu-irq-1M_all_cpu-write-result.txt|awk '{ for(i=1;i<=35;i++){$i=""} {print $0}}'|column -t
cat cpu-irq-1M_all_cpu-write-result.txt|awk '{ for(i=1; i<=2; i++){ $i="" }; for(i=7; i<=NF;i++){ $i="" }; print $0 }'|column -t
65+2 -
LCXSTR="cat uinte.txt|awk '{print \$1";
for i in {2..64};do after=$(($i+64));LCXSTR=${LCXSTR}",\$${after}-\$$i";done
$LCXSTR=$LCXSTR"}'"
エコー $LCXSTR
LCXSTR="";
for i in {1..96};do LCXSTR=$LCXSTR",${i}";完了
エコー $LCXSTR
テスト - ビューの分割、バインド、設定
================================================= == =================================irqbalance設定
デーモンプロセスの実行ステータスを表示します: systemctl status irqbalance
デーモンを閉じます: systemctl stop irqbalance
起動後に再起動しないようにプロセスをキャンセルします: systemctl disable irqbalance
================================================= == ================================== ネットワークカードパラメータ設定
ネットワークカードが使用するキューの数を表示および設定します
受信専用
ethtool -l ens3f1np1 #ネットワーク カード キューの数を表示します
ethtool -L ens3f1np1 #ネットワーク カード キューの数を設定します
ethtool -L ens3f1np1 rx 8
ethtool -L ens3f1np1 tx 8
ethtool -L ens3f1np1 結合 8
キューには、RX、TX、結合などのいくつかのタイプがあります。一部のネットワーク カードは結合キューのみをサポートします (送信と受信は共通であり、これは結合キューと呼ばれます)。
※表示の場合は小文字のl、設定の場合は大文字のL
[root@node32 2023-3-14-test]# ethtool -L ens3f1np1 結合 8
[root@node32 2023-3-14-test]# ethtool -l ens3f1np1
ens3f1np1 のチャネルパラメータ:
事前に設定された最大値:
RX: 該当なし
TX: 該当なし
その他: 該当なし
合計: 63
現在のハードウェア設定:
RX: 該当なし
TX: 該当なし
その他: 該当なし
合計:8
[root@node32 2023-3-14-test]#
ネットワークカードのキューの長さを表示および設定します
ethtool -g ens3f1np1 #ネットワーク カード キューの長さを表示します。事前設定された最大値: サポートされている最大値、現在のハードウェア設定: 現在設定されている値
ethtool -G ens3f1np1 rx 4096 #ネットワーク カード キューの長さを設定します
※表示の場合は小文字のl、設定の場合は大文字のL
知らせ:
①: すべてのネットワーク カードが、ethtool を使用したネットワーク カードのキューの長さの表示と変更をサポートしているわけではありません。
②: この操作によりネットワーク カードもシャットダウンして起動されるため、このネットワーク カードに関連する接続も中断されます。
ネットワークカードの RSS ハッシュの表示と設定 (キューへのパケットのハッシュ マッピング) / 重みの設定
チェック:
ethtool -x ens3f1np1
重量を設定する
すべての割り込みが最初の N 個の RX キューに均等に分散されるように設定します。
ethtool -X ethx が N に等しい
ethtool -X でカスタム重みを設定する
sudo ethtool -X eth0 重み 6 2
*上記のコマンドは、rx キュー 0 と rx キュー 1 に異なる重みを与えます: 6 と 2。そのため、キュー 0 はより多くの値を受け取ります。通常、キューは CPU にバインドされているため、これは、対応する CPU がパケットの受信により多くのタイム スライスを費やすことも意味することに注意してください。
sudo ethtool -X ens1f0np0weight 8 4 2 1 #最初の 4 つのキューの重みを 8 4 2 1 に設定します
sudo ethtool -X ens1f0np0weight 2 1 2 2 3 3 2 4 #最初の 8 キューの重みを設定します 2 1 2 2 3 3 2 4
ハッシュフィールドを設定する
ネットワーク フローの RX ハッシュ フィールドを調整する
チェック
1)。RSSハッシュ関数
tcp4 ハッシュ メソッドを取得して、デフォルトで 5 タプル ハッシュを有効にします
#ethtool -n ens3f1np1 rx-flow-hash tcp4
TCP over IPV4 フローは、ハッシュ フロー キーの計算に次のフィールドを使用します。
IP SA
IPはい
L4 バイト 0 & 1 [TCP/UDP src ポート] #L4 層の 0 番目と 1 番目のバイト -- 両方とも uint16 src ポート
L4 バイト 2 & 3 [TCP/UDP dst ポート] #L4 層の 2 番目と 3 番目のバイト -- 両方とも uint16 dst ポート
設定
ethtool -N ens3f1np1 rx-flow-hash tcp4 sdfn
s 送信元アドレスのハッシュ
d Dst アドレスのハッシュ
f rx パケットのレイヤ 4 ヘッダーのバイト 0 および 1 のハッシュ。
n rx パケットのレイヤ 4 ヘッダーのバイト 2 および 3 のハッシュ。
5 タプル ハッシュに基づいて upd4 を設定します。デフォルトはオフです
# ethtool -N eth2 rx-flow-hash udp4 sdfn
================================================= == ================================== 割り込みキュービュー
==== ネットワークカードの割り込みとキューを表示する
インターフェイス=ens3f1np1
PCI_ADDR=$(ethtool -i ${INTERFACE}|grep "バス情報"|awk '{print $2}')
cat /proc/interrupts|grep -E "${INTERFACE}|$PCI_ADDR"|awk '{print $1,$NF}'
[root@node33 ~]#
1335: ens3f0np0-0
1336: ens3f0np0-1
1337: ens3f0np0-2
1338: ens3f0np0-3
11383: ens3f0np0-48
……
1393: ens3f0np0-58
1394: ens3f0np0-59
1395: ens3f0np0-60
1396: ens3f0np0-61
1397: ens3f0np0-62
==== すべてのネットワーク カードの割り込みとキューを表示する
#ネットワークポート割り込みのCPUバインドステータスを確認します(割り込みファイル内のネットワークポートがPCIアドレスとして表示されます) lcx
for if in $(ifconfig|grep -E "eno|ens|enp|bond" -A 1|grep -w "inet" -B 1|awk -F ":" '{print $1}'|grep -vE " \--|inet"); \
する \
echo "eth:${if}===================================;\
PCI_ADDR=$(ethtool -i ${if}|grep "バス情報"|awk '{print $2}');\
cat /proc/割り込み | grep -E "${if}|${PCI_ADDR}" | カット -d: -f1 | 私を読みながら; echo -ne irq":$i\t binding_cpu: "; を実行します。\
cat /proc/irq/$i/smp_affinity_list; 完了 | ソート -n -t' ' -k3;\
終わり
==== すべてのネットワーク カードの割り込み番号を表示 - キュー - バインドされた CPU
**以下をコピーしてウィンドウに貼り付け、getEthIrqBind.sh スクリプトを生成し、スクリプトとネットワーク カード名を実行します: getEthIrqBind.sh ens3f1np1
猫 > getEthIrqBind.sh << "EOF"
インターフェース=$1
if [[ "$1" == "" ]];then
echo "インターフェースを入力してください。
例:./$(ベース名 $0) eth0、
列 1 でソート:./$(basename $0) eth0 1
列2でソート:./$(basename $0) eth0 2"
出口1
フィ
if [[ "$2" != "" ]];then
sort_col=$2
それ以外
ソート列=1
フィ
oldIFS=$IFS;IFS=$'\n'
#中断の可能性のあるファイルは、ネットワーク カード名または PCI ごとに表示されます。
PCI_ADDR=$(ethtool -i ${INTERFACE}|grep "バス情報"|awk '{print $2}')
IRQ_LIST=($(cat /proc/interrupts|grep -E "${INTERFACE}|${PCI_ADDR}"|awk '{print $1,$NF}'))
エコー「irq:キュー:bind_cpu:」
${IRQ_LIST[@]} の行
する
irq=$(echo "$line"|awk -F":" '{print $1}' )
queue=$(echo "$line"|awk -F":" '{print $2}' )
queue=$(echo ${queue}|awk -F "@" '{print $1}')
echo "$irq $queue $(cat /proc/irq/$irq/smp_affinity_list)"
完了| ソート -n -k${sort_col}|列 -t;
IFS=$oldIFS
終了後
chmod +x getEthIrqBind.sh
./getEthIrqBind.sh ens3f1np1
================================================= == ================================== バインドを解除
#指定されたネットワーク ポート ETH の割り込み番号を CPU_LIST で指定された CPU に均等にバインドします。 lcx
猫 > ./balance.sh << 'EOF'
if [[ "$1" == "" ]];then
echo "インターフェースを入力してください。
例:./$(ベース名 $0) eth0"
出口1
フィ
ETH=$1
PCI_ADDR=$(ethtool -i ${ETH}|grep "バス情報"|awk '{print $2}')
IRQ_LIST=($(cat /proc/interrupts|grep -E "${ETH}|${PCI_ADDR}"|awk '{print $1,$NF}'|awk -F ':' '{print $1}') )
フィ
if [[ ${#IRQ_LIST[@]} -eq 0 ]] ;then
echo 「IRQ 番号リストが見つかりません。」
フィ
CPU_LIST=(40 41 62 63) #<-----------------------------------CPU_LIST
インデックス=0
cpu_num=${#CPU_LIST[@]}
${IRQ_LIST[@]} にあります
する
((インデックス++))
cpu_list_index=$((${index}%${cpu_num}))
#echo "irq:$it --bind-to--> cpu:${CPU_LIST[${cpu_list_index}]}" #結果を表示しますが、実際には設定されていません
echo ${CPU_LIST[${cpu_list_index}]} > /proc/irq/${it}/smp_affinity_list
終わり
終了後
chmod +x ./balance.sh
生成されたスクリプトをコピーして貼り付けた後、./balance.sh ネットワーク ポート名 (例: ./balance.sh eth0) を実行します。
================================================= == ================================= データ分析
============64 CPU 割り込みデータの傍受と統計
インターフェイス=ens3f1np1
PCI_ADDR=$(ethtool -i ${INTERFACE}|grep "バス情報"|awk '{print $2}')
SIZE=1M_4_cpu
RW=書き込み-47
1 io の前後の割り込み数を記録します。
#前方:
cat /proc/interrupts|grep -E "$PCI_ADDR"| awk '{for(i=65; i<=NF; i++){ $i="" }; $0 を印刷します }'| 列 -t > cpu-irq-${SIZE}-${RW}-0.txt
#戻る:
cat /proc/interrupts|grep -E "$PCI_ADDR"| awk '{for(i=65; i<=NF; i++){ $i="" }; $0 を印刷します }'| 列 -t > cpu-irq-${SIZE}-${RW}-1.txt
*説明: awk '{for(i=65; i<=NF; i++){ $i="" }; print $0 }' 65 列の後の列は空に設定されます。つまり、65 列の前の列のみです。取られます。
2つの計算
past cpu-irq-${SIZE}-${RW}-0.txt cpu-irq-${SIZE}-${RW}-1.txt > uinte.txt #2 つのドキュメントを水平方向に結合します
cat uinte.txt|awk '{print $1,$66-$2,$67-$3,$68-$4,$69-$5,$70-$6,$71-$7,$72-$8,$73-$9,$74-$10,$75-$11 、$76-$12、$77-$13、$78-$14、$79-$15、$80-$16、$81-$17、$82-$18、$83-$19、$84-$20、$85-$21、$86-$22、$87-$23、$88 -$24、$89-$25、$90-$26、$91-$27、$92-$28、$93-$29、$94-$30、$95-$31、$96-$32、$97-$33、$98-$34、$99-$35、$100-$36 、$101-$37、$102-$38、$103-$39、$104-$40、$105-$41、$106-$42、$107-$43、$108-$44、$109-$45、$110-$46、$111-$47、$112-$48、$113 -$49、$114-$50、$115-$51、$116-$52、$117-$53、$118-$54、$119-$55、$120-$56、$121-$57、$122-$58、$123-$59、$124-$60、$125-$61 ,$126-$62,$127-$63,$128-$64}' |column -t|tr ':' ' ' > cpu-irq-${SIZE}-${RW}-result.txt #列の減算 (stat マイナスの後ろ)以前の統計)
チェック:
#最初の 35 列を表示します
cat cpu-irq-1M_all_cpu-write-result.txt|awk '{ for(i=34;i<=95;i++){$i=""} {print $0}}'|column -t
#35列表示後
cat cpu-irq-1M_all_cpu-write-result.txt|awk '{ for(i=1;i<=33;i++){$i=""} {print $0}}'|column -t
# 3~6列を表示
cat cpu-irq-1M_all_cpu-write-result.txt|awk '{ for(i=1; i<=2; i++){ $i="" }; for(i=7; i<=NF;i++){ $i="" }; print $0 }'|column -t
============4 CPU 割り込みデータの傍受と統計
インターフェイス=ens3f1np1
#PCI_ADDR=$(ethtool -i ${INTERFACE}|grep "バス情報"|awk '{print $2}')
PCI_ADDR=ens3f1np1
SIZE=1M_4_cpu
RW=書き込み-54-8K-ハッシュ-sdnf
#前方:
cat /proc/interrupts|grep -E "$PCI_ADDR"|awk '{print $1,$(40+2),$(41+2),$(62+2),$(63+2)}'|列 -t > cpu40-41-62-63irq-${SIZE}-${RW}-0.txt
#戻る:
cat /proc/interrupts|grep -E "$PCI_ADDR"|awk '{print $1,$(40+2),$(41+2),$(62+2),$(63+2)}'|列 -t > cpu40-41-62-63irq-${SIZE}-${RW}-1.txt
#* lcx を解釈します:
#PCI_ADDR ネットワーク カードの PCI アドレスを取得します。awk '{print $1,$(31+2),$(63+2),$(95+2),$(127+2)}' は、最初の列 (割り込み番号)、CPU31、CPU63、を出力することを意味します。 CPU95 、 CPU127 の割り込みシステム (CPU は 0 から始まるので、CPU31 は $(31+2) です。
#2 計算
貼り付け cpu40-41-62-63irq-${SIZE}-${RW}-0.txt cpu40-41-62-63irq-${SIZE}-${RW}-1.txt > uinte.txt #put before 2 つのドキュメントを水平方向にマージした後 lcx
cat uinte.txt|awk '{print $1,$7-$2,$8-$3,$9-$4,$10-$5}' |column -t|tr ':' ' ' > cpu40-41-62-63irq-${ SIZE}-${RW}-result.txt #列の減算 (後の統計値から前の統計値 lcx を引く)
猫 cpu40-41-62-63irq-${SIZE}-${RW}-result.txt
================================================= == ================================= CPU 統計
mpstat -P ALL 2 30 すべての CPU 使用率を表示、2 秒ごとに 1 回収集、30 回収集