Linux カーネルを数百ミリ秒間「フリーズ」(またはほぼフリーズ)させる方法

Linux カーネルを数百ミリ秒間「フリーズ」(またはほぼフリーズ)させる方法

非リアルタイム カーネル (CentOS 6) 上でリアルタイム プロセスを実行していますが、これはおそらく変更されないでしょう。

ストリーミング ビデオ アプリケーションでは、カスタム FPGA から 1.5 時間連続して約 500 MB/秒の PCIe トラフィックが必要です。アプリケーションはほとんどの場合、問題なく動作します。ただし、カーネルが PCIe またはメモリ要求への応答を最大 500 ミリ秒停止する状況が発生しました。これは、別のスレッドからのバースト ファイル IO 中に発生するようです。メイン アプリケーションの実行中にユーザー スペースから大量のダミー ファイル IO を実行するだけでは、この問題を再現できないことがわかりました。

この問題を再現できるように、Linux カーネルのグローバルな「フリーズ」を強制 (シミュレート) する方法 (具体的には、PCIe またはすべての DDR3 メモリ アクセスを停止するなど) はありますか?

現在、内部 FPGA メモリに最大 10 ミリ秒のバッファリングが実装されていますが、それだけでは十分ではありません。FPGA DDR3 にバッファリングしてからホストにダンプすることはできますが、この新しい機能を厳しい状況でテストする方法が必要です。

カーネルが永久にフリーズしたりロックしたりするのは望ましくありません。時間間隔を設定できる機能が必要です。

私は、一時的に魔法の値を書き込んで/proc/sys/vmシステムを事実上クロールさせ、数百ミリ秒後に元に戻すようなものを探していますが、それを破る可能性のある方法の数を見るのは私のような初心者には無理です(https://www.kernel.org/doc/Documentation/sysctl/vm.txt)numactl魔法でしょうか?

答え1

簡単なテストを行うための1つのオプションは、KGDBが有効になっているカーネルを使用し、カーネルを手動で停止してテストすることです。このリンクを参照してください

別の話ですが、皆さんが立ち止まる原因になりそうなことを思い出します。

  • cpufreq、cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency値はns単位(私のAMD FX(tm)-8120 8コアプロセッサでは4000)なので問題ないはずですが、
  • CPU 自体または電圧レギュレータ モジュールのいずれかの熱スロットリング。
  • NAPI および/または大量のネットワークトラフィック
  • PCIe ASPM ( cat /sys/module/pcie_aspm/parameters/policy)
  • 宛先デバイス (ハードディスク、NIC など) のバッファーの競合
  • PCIeバス内のデバイスのファームウェアにバグがある場合(使用していない場合でも)、次の方法で電源をオフにしてみてください。/sys/bus/pci/devices/$DEVICE/power/control

答え2

アプリケーションが FPGA とどのように通信しているかについて、さらに詳しく教えていただけますか? FPGA からバッファを読み取るのはアプリケーションですか、それともカーネルに割り込みを送信するのは FPGA (ネットワーク カードなど) ですか?

/dev 内のブロック/文字を開いて、それと通信することを期待しています。つまり、アプリケーションと /dev/XXX ファイル間の通信にはドライバーが使用されます。

次のような出力を得たいです: cat /proc/interrupts; lsmod;ls -al /dev/yourmod

アイデアは次のとおりです:

  • 割り込み駆動の場合は、CPU の PIC を設定して対応する IRQ を無効にし、その後再度有効にすることができます。これにより、カードのすべての要求が無視されます (カードはそれを認識しません)。
  • バッファ読み取りのような場合は、次の操作を実行できます。
    • アプリケーションをスリープ状態にして、FPGA からのデータが読み取られないようにし、バッファがいっぱいになるようにしてから、アプリケーションを起動して読み取りを続行します。
    • 「crash」または「kgdb」を使用して、「read」値を数秒間「noop」に変更し、その後デフォルトの機能に戻します。

役に立つと思われる情報はすべて提供してください。

答え3

役に立つかどうかはわかりません。ただし、suspend別のデバイスのカーネル モジュールの機能を呼び出すカーネル モジュールを作成できる場合は、役立つ可能性があります。

各PCIデバイスはヘッダーファイルに従ってサスペンドできるhttp://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479

例えば、Intel e1000 NICのサスペンド機能は次のようになります。http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

私の記憶によれば、この機能は主にシステムが休止状態になり、デバイス ドライバーが現在の実行状態を保存して自身をオフにする必要があるときに使用されていました。

答え4

あなたは間違った考え方をしていると思います。あなたの目標は明確です。

方法は、残りのプロセスを停止するのではなく、メインプロセスにほぼリアルタイムのスケジュール優先度を与えることです。ニースそのために重要なユーザー空間プロセスのために。

さらに難しい問題は、カーネル空間にある PCIe 割り込み処理です。

ハードウェアが関係しているので、マザーボード上の関連する PCIe レーンと、それが特定の CPU ソケットにどのように接続されているかを詳しく調べる必要があります。

irqバランス通常はここでうまく機能しますが、ニーズに合わせて動作を構成することもできます。

関連情報