[パフォーマンス] 割り込みバインドと表示|irqbalance 割り込みロード バランシング|CPU ボトルネック

共通コマンド 


```
# 查看当前运行情况
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,根本原因

  1. 以前は、irqbalance デーモンは、禁止された CPU セットの IRQ (割り込み要求) に対する NUMA ノードの割り当てを考慮していませんでした。その結果、IRQBALANCE_BANNED_IRQS 変数が単一の CPU に設定された場合、irqbalance はアフィニティを誤って設定しました。さらに、適格な CPU を持たないノードには IRQ を割り当てることができませんでした。ノードの割り当ては、unbanned_cpus ビットマスクで定義されている適格な CPU を持つノードに制限され、バグが修正されました。その結果、irqbalance はアフィニティを適切に設定し、IRQ がそれぞれのノードに正しく割り当てられるようになりました。(BZ#1054590、BZ#1054591)

  2. この更新より前は、irqbalance デーモンの依存関係が誤って設定され、間違ったカーネル バージョンを参照していました。その結果、irqbalance は NUMA システム上の IRQ のバランスをとることができませんでした。この更新により、依存関係が修正され、NUMA システム上で IRQ のバランスが正しくとられるようになりました。irqbalance デーモンを正しく使用するには、irqbalance パッケージのユーザーはカーネルを 2.6.32-358.2.1 以降に更新する必要があることに注意してください。(BZ#1055572、BZ#1055574)

  3. 最新バージョンより前の 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
    
  • 追加の 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 回収集

 

おすすめ

転載: blog.csdn.net/bandaoyu/article/details/129234911