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

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

私たちは非リアルタイムカーネル(CentOS 6)でリアルタイムプロセスを実行していますが、これは変更されない可能性があります。

一度に1.5時間、カスタムFPGAで約500 MB / sのPCIeトラフィックを必要とするストリーミングビデオアプリケーションがあります。このアプリはほとんどがうまく動作します。ただし、カーネルが一度に最大500ミリ秒間PCIeサービスまたはメモリ要求に応答しないように見える状況も発生しました。これは、他のスレッドでファイル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オクタコアプロセッサでは4000)で、問題はありませんが、確認してください。
  • CPU自体または電圧レギュレータモジュールの熱調整。
  • 高NAPIおよび/またはネットワークトラフィック
  • PCIe ASPM( cat /sys/module/pcie_aspm/parameters/policy)
  • ターゲットデバイス(ハードディスク、ネットワークカード...)のバッファに競合があります。
  • PCIeバスの一部のデバイスファームウェアにバグがあります(使用しなくても)。次のコマンドを使用して電源を切ることができます。/sys/bus/pci/devices/$DEVICE/power/control

答え2

アプリケーションがFPGAと通信する方法の詳細を学ぶことはできますか?アプリケーションがFPGAからバッファを読み取っていますか、またはFPGAがコア(ネットワークカードなど)に割り込みを送信していますか?

私はそれが/ devでブロック/文字を開き、それと通信したいと思います。これは、ドライバを使用してアプリケーションと/ dev / XXXファイル間の通信を意味します。

私が望む出力:cat /proc/interrupts;lsmodls -al /dev/yourmod

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

  • 割り込み駆動の場合は、対応するIRQを無効にしてから再度有効にするようにCPU PICを設定できます。これにより、カードからのすべての要求が無視されます(カードはこれについて知りません)。
  • バッファのように読み取ると、次のことができます。
    • 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ネットワークカードの一時停止機能は次のとおりです。http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643

私が知る限り、この機能は主にシステムが休止状態に入るときに使用され、デバイスドライバは現在の実行状態を保存して自己終了する必要があります。

答え4

私はあなたの考えが間違っていると思います。あなたの目標は明らかです。

残りのプロセスを停止する代わりに、リアルタイムスケジューリングに近い優先順位をメインプロセスに付与する方式である。使用いいね重要なユーザースペースプロセスのためのものです。

より困難な問題は、カーネル空間に常駐するPCIe割り込み処理です。

関連するハードウェアがあるため、マザーボードに関連するPCIeレーンと特定のCPUソケットに接続する方法の詳細を見ることから始める必要があります。

割り込みバランスここでは一般的にうまくいきますが、必要に応じて動作を設定できます。

関連情報