12

LinuxのC/C ++では、イーサネットポートに接続されたセンサーからのリアルタイムデータとストリーミングデータを約110MB /秒で保存するために、大きな(数ギガバイト)メモリブロックを割り当てる必要があります。保存できるデータシーケンスの長さを最大化するために、可能な限り多くのメモリを割り当てたいと思います。ただし、結果として生じる遅延とディスクアクセスの制限された帯域幅により、センサーの(非常に制限された)バッファーがオーバーフローするため、ディスクスワッピングが発生しないことも確認する必要があります。

割り当てるメモリの量を決定するための最良の方法は何ですか?報告された空きメモリよりもわずかに小さいブロックを割り当てることに制限されていますか、それともLinux仮想メモリマネージャーとより直接インターフェースできますか?

4

4 に答える 4

10

Linuxでは、mlock()/ mlockall()を使用して、アドレス範囲を物理メモリに保持し、スワップアウトされないようにすることができます。mlockを使用するプロセスには、これを行うためにいくつかの特権が必要です。「manmlock」に詳細があります。最大のmlock'ableブロック(「無料」のように見えるものとは異なる場合があります)についてはわかりません。したがって、おそらくバイナリ検索が役立つ可能性があります(範囲をロックし、失敗した場合は領域のサイズを縮小するなど)。

一方、110MB/秒はソリッドステートドライブにとって実際には問題ではありません。書き込み速度が280MB/秒の60GBSSDは、コーナーで約200ドルかかります。センサーデータを小さな書き込みバッファーにコピーし、SSDにストリーミングするだけです。

于 2010-07-14T11:43:09.213 に答える
3

コンピューターシステムがセンサーからのデータ受信専用の場合は、スワップを無効にするだけです。次に、できるだけ大きなバッファを割り当て、重要なツール専用の十分なメモリをシステムに残します。

于 2010-07-14T11:51:18.087 に答える
0

必要な量のメモリをその速度で書き込む場合mallocでも、すべてのページフォールトが原因でパフォーマンスが低下します(つまり、仮想メモリの各ページを物理メモリにマッピングします。これには、他のメモリのスワップアウトも含まれる場合があります)。プロセス)。

これを回避するにはmemset、センサーからの読み取りを開始する前に、割り当てられたバッファー全体を0に設定して、必要なすべての仮想メモリを物理メモリにマップすることができます。

使用可能な物理メモリのみを使用する場合は、スワッピングがまったく発生しないはずです。さらに使用すると、他のプロセスのメモリがディスクにスワップされます。これらのプロセスがアイドル状態の場合、問題は発生しません。それらがアクティブである場合(つまり、時々メモリを使用している場合)、スワッピングが発生します。おそらく、ハードドライブの帯域幅よりもはるかに低いレートです。使用するメモリが多いほど、より多くのアクティブなプロセスのメモリがスワップアウトされ、より多くのHDアクティビティが発生します。この時点で、適切なパフォーマンスで使用できるメモリの最大量は、試行錯誤の結果です。

使用可能な物理メモリよりも多くを使用することにより、メモリ書き込みの速度で確実にスワッピングが発生し、それを回避する方法はありません。

于 2010-07-14T11:30:54.030 に答える
0

割り当てるメモリの量を決定するための最良の方法は何ですか?

仮想メモリの使用方法、スワップ不可能なカーネルメモリのため、アプリケーションがアクセスできるインストール済みメモリの量を特定することはほぼ不可能です。

私が思いつくことができる最善のことは、ユーザーがバッファリングに使用するメモリの量を構成できるようにすることです。

報告された空きメモリよりもわずかに小さいブロックを割り当てることに制限されていますか?

報告された空きメモリは、実際には「空き物理メモリ」ではありません。不運にも。

または、Linux仮想メモリマネージャーとより直接インターフェースできますか?

これは、カスタムデバイスドライバーを使用して、カーネルスペースに直接メモリを割り当て、を介してアクセスできるようにすることで実行できますmmap()。一般的にはお勧めしませんが、あなたのような特殊なケースでは機能します。

ただし、ディスクの交換がないことも確認する必要があります

Linuxカーネルの開発のペースで、知識は非常に速く時代遅れになるので、私がここで言っていることを一粒の塩で理解してください。あなたは以下で遊ぶことを試みることができます:

  1. SysV共有メモリ。通常は交換されません。を参照してくださいman shmget

  2. tmpfs-メモリ内ファイルシステム。少なくとも初期の2.6カーネルでは、メモリはRAMに固定されていたため、スワップ可能ではありませんでした。これをメモリとして使用するには、tmpfs上にファイルを作成し、ファイルにwrite()何かを作成して(メモリを実際に割り当てるため)、ファイルをmmap()します。

于 2010-07-14T11:38:13.563 に答える