mmapと遅いDMA転送

mmapと遅いDMA転送

データが処理され、圧縮され、4TBのメモリマッピングファイルに書き込まれている間、DMA転送を使用してハードウェアデバイスから〜4 * 50 MB / sの速度でデータを読み取るプロセスがあります。

各DMA転送は平均して20ミリ秒未満かかります。ただし、5分ごとに複数回DMAを送信すると最大300ミリ秒かかることがあります。これは大きな問題です。

これは、カーネルがダーティメモリマッピングページをディスクにフラッシュすることに関連している可能性があると思います。マッピングされたメモリへの書き込みを中止すると、DMA転送期間は大丈夫です。しかし、これがDMA転送にどのように/なぜ影響を与えるのかを混乱させ、これを防ぐ方法はありますか?

ハードウェアデバイスにはデータをバッファリングするメモリがありますが、DMA転送速度が遅すぎるとデータが失われます。

現在、私たちは4.1.10 ltsカーネルを使ってArch Linuxでテストしていますが、Ubuntu 14.04でもほとんど悪い結果を得ています。ハードウェアは、HP z820ワークステーション、32GB RAM、およびデュアルXeon E5-2637 @ 3.50Ghz(http://www8.hp.com/h20195/v2/GetPDF.aspx/c04111177.pdf)。

また、Windows版のソフトウェアを試しましたが、この特定の問題はありませんでしたが、他にも多くの問題がありました。

答え1

Linuxには少しリアルタイムオプションですが、それ自体はリアルタイムカーネルではありません。これにより、プロセスは準備ができたらすぐに非リアルタイムプロセスの前にスケジュールするように要求し、必要に応じてCPUをスケジュールできます。

デフォルトでは、プロセスはSCHED_OTHERスケジューリングポリシーを提供します。実行中のpidが与えられたら、それをリアルタイムSCHED_FIFOに設定または起動するときにchrt -f -p prio pidコマンドの前にプレフィックスを付けることができます。chrt -f prio優先順位はprio 通常のプロセスとは関係がなく、リアルタイムプロセスがリソースを配置して競合する場合にのみ使用されます。 psこれらの優先順位を負の値として表示します(例:リアルタイム優先順位20の場合は-21)。

ionice --class 1 -p pidまた、リアルタイムIOキューの優先順位を指定してプロセスをスケジュールするのに役立ちます。

答え2

デバイスは数分間動作し続けますか、それとも転送中に定期的に一時停止しますか?

一時停止がある場合、カーネルを強制的に実行できます空のバッファとキャッシュこの間、このアクティビティはDMA転送を妨げません。あるいは、BDFLUSHRカーネルがバッファをフラッシュすることを決定するたびに、少ない量のデータを書き込むようにカーネルを1秒間隔で設定できます。

継続的な動作を保証する必要がある場合は、CPUとデバイスが同時にメモリにアクセスできるようにするために、より多くのチャネルを持つRAMが必要です(すでに4チャンネルのメモリコントローラがあることがわかりました)。 RAM が次のように構成されていることを確認します。非連携モード、このオプションが利用可能な場合。メモリコントローラが実際に4チャンネルモードで動作するように、メモリチャネルに対応する4つのスロットに同様のDRAMモジュールを取り付けていることを確認してください。

答え3

まだカーネルダーティページ設定を変更していないようです。あなたのユースケースについては、次のようにしてみましょう。

/proc/sys/vm/dirty_background_bytes:50000000
/proc/sys/vm/dirty_bytes:4000000000
/proc/sys/vm/dirty_expire_centisecs:100
/proc/sys/vm/dirty_writeback_centisecs:20

(望むよりhttps://www.kernel.org/doc/Documentation/sysctl/vm.txtもっと学ぶ。 )

問題は、基本的にシステムに多くのRAMがあり、ストレージデバイスが遅く、最悪の待ち時間を下げようとすると、デフォルトのカーネル制限に問題があることです。実際、システムIOサブシステムバッファがいっぱいになり、ブロックデバイスに十分なデータが書き込まれるまで(「ダーティページフラッシュ」)、書き込みプロセスは強制的にスリープモードに移行する必要があります。

関連情報