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


17

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

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

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

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

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

私は/proc/sys/vmシステムを仮想的にクロールし、数百ミリ秒後に元に戻す魔法の値を一時的に書き込むラインに沿って何かを探していますが、それを破る可能な方法の数を見ることは私のような初心者のためではありません(https://www.kernel.org/doc/Documentation/sysctl/vm.txt)。たぶんいくつかのnumactl魔法?


私の考えでは、これにはカーネルモジュールの作成が必要です。どういうわけか、すべてのCPU上のすべてのスレッドをフリーズし、タイマー割り込みで再起動する必要があります。
ジル 'SO-悪であるのをやめる' 14年

スレッドを凍結したくない、カーネルを凍結したい!つまり、ハードウェア(メモリ、PCIe、および/またはディスク)へのアクセスを短時間禁止したいということです。それがうまくいかない場合、私は物事を非常に最適化せず、L1キャッシュを無効にするなど気にしません。これを行う方法がわかりません。
マークラカタ14年

1
ああ、カーネルをフリーズしたくないので、一部のハードウェアに応答するカーネルの部分だけをフリーズしたいですか?それも、カーネルのかなり深いところまで潜る必要があります。
ジル 'SO-悪である停止' 14

ハードウェアがその一部として凍結されている限り、カーネルを完全に凍結してもかまいません。
マークラカタ14年

1
ホストCPUがいくつかのIOバッファーをフラッシュする(HDF5を使用してファイルを書き込む)ため、問題はTLBスラッシングに関連しており、このTLBスラッシングはNUMAシステムであるため、コプロセッサーもスラッシングさせています。必要なのは、制御された時間TLBスラッシングをプログラムで引き起こす信頼できる方法だけだと思います。
マークラカタ

回答:


9

クイックテストを実行する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

同じことをするkdb代わりに使用できkgdbますか?どちらも使ったことがない。これは、過去のSunワークステーションでの「Stop-A」コマンドシーケンスのようなものですか?簡単なSysRq-gを実行してから「go」と入力すると、システムを壊さない可能性が高くなりますか?(参照:kernel.org/pub/linux/kernel/people/jwessel/kdb/...
マーク・Lakata

1
おそらく、kdbを使用できるでしょう。USB接続のキーボードで動作するはずですが、念のためPS / 2を手元に置いてください。そして、これは非常に低レベルのデバッガー(カーネルランド)なので、いつものようにバックアップを保持し、それが壊れた場合は両方を保持します:)
ホルヘネリン​​14年

カーネルを微調整する前に、まずバスを使用している可能性のあるPCIeデバイス(グラフィックドライバー)の未使用のカーネルモジュールをアンロードし、システムからデバイスを物理的に削除するか電源をオフにします。PCIe 1.0 x1の帯域幅は250MB / sであり、PCIe 2.0 x1は最大500MB / sになりますが、起点デバイスと終点デバイスの両方が中断なしでこのような持続レートを自由に受け入れることができますか?
ホルヘネリン​​14年

遅延の別の原因としては、デバイスのACPI電源管理ハンドラー、または外部イベントを待機しているSMM CPUハンドラーが考えられます。
フランキー14年

2

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

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

次の出力が欲しいのですが cat /proc/interruptslsmod;ls -al /dev/yourmod

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

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

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


FPGAはホストメモリへのDMA書き込みを行い、これらの停止期間中、FPGAはホストメモリへの書き込みができないため、内部FIFOがバックアップされます。ホストプロセスへのメッセージベースのインターフェイスがあります(PCIeで発生します)が、これは関係ないことは確かです。検証のために、基本的にFPGAのハードウェアが数百ミリ秒の間ホストメモリに書き込むことを禁止する方法が必要です。メモリの問題を解決したくありませんが、FPGAでの実装がメモリの停止(最大1000ミリ秒)に対処できることを確認したいと思います。
マーク・Lakata

DMAを使用している場合は、kernel.org / doc / Documentation / DMA-ISA-LPC.txtで、claim_dma_lock()およびdma_disable()を特に確認してください。ただし、FPGAで使用されるアドレスを知る必要があります。
エイドリアンM. 14年

1

それが役立つかどうかわからない。ただし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です。

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


感謝しますが、それでうまくいくとは思いません。デバイスをサスペンドしたくありません。これは、休止状態に備えるようにデバイスに指示するカーネルです。カーネルが特定のデバイス(この場合はFPGAドーターボード)を知らずに(長いレイテンシやタイムアウト以外)無視するようにするか、すべてのSDRAMメモリ転送を停止します。
マークラカタ

0

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

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

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

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

irqbalanceは通常ここで適切に機能しますが、ニーズに合わせてその動作を構成できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.