web-dev-qa-db-ja.com

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

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

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

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

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

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

魔法の値を/proc/sys/vmに一時的に書き込み、システムを仮想的にクロールさせ、数百ミリ秒後に元に戻す何かを探していますが、それを壊す可能性のある方法の数を調べているのは私のような初心者( https://www.kernel.org/doc/Documentation/sysctl/vm.txt )。多分numactl魔法?

17
Mark Lakata

簡単なテストを行う1つのオプションは、KGDB対応のカーネルを使用し、カーネルを手動で停止してテストすることです このリンクを参照

別のメモでは、あなたの一時停止を引き起こす可能性のあることを覚えています:

  • cpufreq、cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency、値はns(AMD FX(tm)-8120 Eight-Core Processorでは4000)で問題ありませんが、
  • CPU自体または電圧レギュレータモジュールのいずれかのサーマルスロットリング。
  • NAPIおよび/または重いネットワークトラフィック
  • PCIe ASPM(cat /sys/module/pcie_aspm/parameters/policy
  • 宛先デバイス(ハードディスク、nic ...)のバッファーでの競合
  • PCIeバス内の一部のデバイスのファームウェアのバグ(使用していない場合でも)、/sys/bus/pci/devices/$DEVICE/power/controlで電源をオフにしてみてください。
9
Jorge Nerín

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

/ devでblock/charを開き、それと通信することを期待しています。つまり、ドライバーを使用して、アプリケーションと/ dev/XXXファイル間の通信を行います。

次の出力が必要です:cat /proc/interrupts; lsmod; ls -al /dev/yourmod

ここにアイデアがあります:

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

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

2
Adrien M.

それが役立つかどうかわかりません。ただし、別のデバイスのカーネルモジュールの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#L464

私が思い出すことができることから、この機能は主にシステムが休止状態になったときに使用されました。デバイスドライバーは現在の実行ステータスを保存し、それ自体をオフにする必要があります。

1
yegle

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

その方法は、残りのプロセスを停止するのではなく、メインプロセスにほぼリアルタイムのスケジューリング優先順位を与えることです。そのための重要なユーザースペースプロセスにはNiceを使用します。

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

ハードウェアが関係しているので、メインボード上の関係するPCIeレーンと、それが特定のCPUソケットに接続されている可能性がある方法を詳しく調べる必要があります。

irqbalanceは通常、ここでは適切に機能しますが、必要に応じてその動作を構成できます。

0
Nils