GNU/Linux >> Linux の 問題 >  >> Linux

Linux 割り込みと CPU SMP アフィニティの紹介

割り込みは、ハードウェアまたはソフトウェアによって IRQ (割り込み要求ライン) を介して送信される信号です。

割り込みにより、キーボード、シリアル カード、パラレル ポートなどのデバイスは、CPU の注意が必要であることを示すことができます。

CPU が割り込み要求を受信すると、CPU は実行中のプログラムの実行を一時的に停止し、割り込みハンドラーまたは ISR (割り込みサービス ルーチン) と呼ばれる特別なプログラムを呼び出します。

割り込みサービスまたは割り込みハンドラー ルーチンを見つけることができます。メモリ内の固定アドレスに配置されている割り込みベクタ テーブル内。割り込みが処理された後、CPU は割り込まれたプログラムを再開します。

起動時に、システムはすべてのデバイスを識別し、適切な割り込みハンドラが割り込みテーブルにロードされます。

以下は、CPU の注意を要求する 2 つの方法です:

<オール>
  • 割り込みベース
  • 投票ベース
  • すべての Linux ベースの OS は割り込み駆動型です。

    キーボードのキーを押すと、キーボードはキーが押されたことを CPU に伝えます。ただし、CPU は、RAM、システム クロック、NIC カード、ビデオまたは PCI バスからの処理でビジー状態になることがあります。その場合、キーボードはそのハードウェアに割り当てられた IRQ ラインに電圧をかけます。この場合は [キーボード] です。この電圧の変化は、デバイスに処理が必要な要求があることを示すデバイスからの要求として機能します。

    /proc/interrupts ファイル

    Linux マシンでは、ファイル /proc/interrupts には、使用中の割り込みに関する情報と、プロセッサーが割り込まれた回数に関する情報が含まれています

    # cat /proc/interrupts
               CPU0   CPU1  CPU2  CPU3
      0: 3710374484      0     0     0  IO-APIC-edge  timer
      1:         20      0     0     0  IO-APIC-edge  i8042
      6:          5      0     0     0  IO-APIC-edge  floppy
      7:          0      0     0     0  IO-APIC-edge  parport0
      8:          0      0     0     0  IO-APIC-edge  rtc
      9:          0      0     0     0  IO-APIC-level  acpi
     12:        240      0     0     0  IO-APIC-edge  i8042
     14:   11200026      0     0     0  IO-APIC-edge  ide0
     51:   61281329      0     0     0  IO-APIC-level  ioc0
     59:          1      0     0     0  IO-APIC-level  vmci
     67:   19386473      0     0     0  IO-APIC-level  eth0
     75:   94595340      0     0     0  IO-APIC-level  eth1
    NMI:          0      0     0     0
    LOC: 3737150067 3737142382 3737145101 3737144204
    ERR:          0
    MIS:          0
    

    上記のファイル内:

    • 最初の列は IRQ 番号です。
    • 2 番目の列は、CPU コアが中断された回数を示します。上記の例では、timer は割り込み名 [System clock] であり、3710374484 は CPU0 が割り込まれた回数です。 I8042 は、PC の PS/2 キーボードとマウスを制御するキーボード コントローラーです。
    • rtc のような割り込みの場合 [リアルタイム クロック] CPU は割り込みを受けていません。 RTC は、時間を追跡するために電子機器に搭載されています。
    • NMI と LOC は、システムで使用されるドライバーであり、ユーザーがアクセス/構成することはできません。

    IRQ 番号は、CPU が処理する必要がある割り込みの優先順位を決定します。

    IRQ 数値が小さいほど、優先順位が高くなります。

    たとえば、CPU がキーボードとシステム クロックから同時に割り込みを受信した場合です。 IRQ 番号が 0 であるため、CPU は最初にシステム クロックを提供します。

    • IRQ 0 — システムタイマー (変更不可);
    • IRQ 1 — キーボード コントローラー (変更不可)
    • IRQ 3 — シリアル ポート 2 用のシリアル ポート コントローラ (存在する場合、シリアル ポート 4 と共有);
    • IRQ 4 — シリアル ポート 1 用のシリアル ポート コントローラ (存在する場合、シリアル ポート 3 と共有);
    • IRQ 5 — パラレルポート 2 および 3 またはサウンドカード;
    • IRQ 6 — フロッピー ディスク コントローラ;
    • IRQ 7 — パラレル ポート 1。プリンタまたはプリンタが存在しない場合は任意のパラレル ポートに使用されます。

    ジョイスティックのようなデバイスの場合、CPU はデバイスが割り込みを送信するのを待ちません。ゲームに使用されるジョイスティックとジョイスティックの動きは速いため、ポーリングを使用してデバイスに注意が必要かどうかを確認するのが理想的です。この方法の欠点は、CPU がデバイスを何度もチェックしてビジー状態になる可能性があることです。

    関連して、Linux でシグナルを適切に処理することも不可欠です。

    ハードウェア割り込み

    上記のシナリオはすべて、ハードウェア割り込みの例です。

    ハードウェア割り込みはさらに 2 つの主要なカテゴリに分類されます。

    <オール>
  • ノンマスカブル割り込み [NMI]:名前が示すように、これらのタイプの割り込みは、CPU によって無視または抑制できません。 MNI は個別の割り込みラインを介して送信され、通常、メモリ エラー、ファンの障害を示すハードウェア トラップ、温度センサーの障害などの重大なハードウェア エラーに使用されます。
  • マスカブル割り込み:これらの割り込みは、CPU によって無視または遅延されます。割り込みマスク レジスタは、キャッシュ コントローラーの外部ピンでトリガーされる割り込みをマスクします。 0 を書き込んでビットを設定すると、ピンでトリガーされる割り込みが無効になります
  • ソフトウェア割り込み

    これらの割り込みは、CPU [ALU ユニット] 自体で例外条件を引き起こす可能性のある命令を CPU が実行するときに生成されます。

    たとえば、数値をゼロで割ることは不可能です。ゼロ除算の例外が発生し、コンピューターが計算を中止したり、エラー メッセージを表示したりします。

    ファイル /proc/stat は /proc ファイルシステムのファイル部分でもあり、システム カーネル統計に関する情報があり、いくつかの割り込み情報も保持しています。

    # cat /proc/stat
    cpu  17028082 5536753 5081493 1735530500 42592308 90006 479750 0
    cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0
    cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
    cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0
    cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
    intr 417756956 --- Output Truncated

    行 intr は、起動時以降に処理された割り込みの数を示します。最初の列は、処理されたすべての割り込みの合計です。後続の各列は、特定の割り込みの合計です。

    SMP_AFFINITY

    対称型マルチプロセッシングは、複数のプロセッサによるプログラムの処理です。

    smp_affinity ファイルは、IRQ 番号の割り込みアフィニティ値を保持します。各 IRQ 番号に関連付けられた smp_affinity ファイルは、/proc/irq/IRQ_NUMBER/smp_affinity ファイルに保存されます。ファイル内の値は、システム内のすべての CPU コアを表す 16 進数のビットマスクで保存されます。 smp_affinity は、IO-APIC が有効なデバイス ドライバーを持つデバイスで機能します。

    たとえば、イーサネット ドライバーの smp_affinity エントリは次のとおりです。

    grep eth0 /proc/interrupts
    67: 23834931 0 0 0 IO-APIC-level eth0
    

    eth0 の IRQ 番号は 67 で、対応する smp_affinity ファイルは次の場所にあります:

    cat /proc/irq/67/smp_affinity
    00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

    値「000000001」に相当する 10 進数は「1」です。つまり、イーサネット ドライバに関連するすべての割り込みは、CPU0 によって処理されます。

    特定のコントローラの smp_affinity ファイルの値を変更するか、irqbalance を使用して、プロセッサ アフィニティを手動で変更できます。

    IRQバランス

    Irqbalance は、コンピュータ システムのプロセッサ コアに割り込みを分散する Linux ユーティリティで、パフォーマンスの向上に役立ちます。

    Irqbalance の目標は、省電力と最適なパフォーマンスのバランスを見つけることです。

    システムに irqbalance がインストールされていない場合は、以下に示すように yum を使用してインストールしてください。

    # rpm -qa | grep irqbalance
    irqbalance-0.55-15.el5
    
    # yum search irqbalance
    
    # yum install irqbalance.x86_64

    irqbalance サービスを開始します:

    service irqbalance start
    

    以下は、irqbalance がインストールされている Linux マシンからの出力例です。割り込みが CPU 間で分散されていることがわかりました。

    # cat /proc/interrupts
               CPU0     CPU1      CPU2       CPU3
      0:  950901695        0         0          0  IO-APIC-edge  timer
      1:         13        0         0          0  IO-APIC-edge  i8042
      6:         96    10989       470          0  IO-APIC-edge  floppy
      7:          0        0         0          0  IO-APIC-edge  parport0
      8:          1        0         0          0  IO-APIC-edge  rtc
      9:          0        0         0          0  IO-APIC-level  acpi
     12:        109     1787         0          0  IO-APIC-edge  i8042
     15:         99 84813914         0          0  IO-APIC-edge  ide1
     51:      17371        0  46689970          0  IO-APIC-level  ioc0
     67:       1741        0         0  225409160  PCI-MSI  eth0
     83:          0        0         0          0  PCI-MSI  vmci
    NMI:          0        0         0          0
    LOC:  950902917  950903742  950901202  950901400
    ERR:          0
    MIS:          0
    

    通常、割り込みは最初のコアによってのみ処理されるため、Irqbalance はマルチコア プロセッサを搭載したシステムで特に役立ちます。


    Linux
    1. Linuxのchgrpおよびnewgrpコマンドの概要

    2. Linux では割り込みはどのように処理されますか?

    3. Linux でプロセスを 1 つの CPU コアに制限する方法は?

    1. Linux –Linuxでプロセスを1つのCPUコアに制限する方法は??

    2. Linuxで単一プロセスのCPU使用率とメモリ使用率を取得しますか?

    3. Linux の CPU 使用率とプロセス実行履歴

    1. Linuxカーネルが割り込みを処理する方法

    2. Glanceを使用したLinuxおよびWindowsホストの監視

    3. Linux用のbpftraceの紹介