これは他の質問と重複しているように見えるかもしれませんが、なぜそうでないのか説明してください。Linux(およびOSX)で割り当てられたメモリの量を照会するにはどうすればよいですか?
特定のメモリ制限に達すると、アプリケーションの特定の部分が正常に機能しなくなることを期待しています。残りの物理メモリに基づいて基準を使用することもできましたが、安全ではないでしょう。同じ理由で、私はOSが私を交換し始めるとすぐに、OSのページメモリとして割り当てることを続けるので、現在のプロセスで使用されている物理メモリの量を使用することはできません。もはや成長しない。
この理由から、アプリケーションで割り当てられたメモリの量、つまり仮想メモリのサイズに非常に近い基準を選択しました。
この質問(How to determine CPU and memory consumption from inside a process?)は、私が必要と思った現在のプロセスで使用されている仮想メモリの量を問い合わせる素晴らしい方法を提供します。
Windowsでは、私はGetProcessMemoryInfo()
フィールドとPrivateUsage
フィールドを使用しています。これはうまくいきます。
Linuxでは、私は動作しなかったいくつかのもの(以下に記載)を試しました。仮想メモリの使用が私にとってうまくいかない理由は、Linux上のNVidiaハードウェアでOpenCLコンテキストを作成するときに起こることが原因です。ドライバは、すべてのRAM、すべてのスワップおよびすべてのビデオメモリを保持するのに十分な大きさの仮想メモリ空間の領域を予約します。私は、統一されたアドレス空間とすべてのためにそう思っています。しかし、それはまた、プロセスが膨大な量のメモリを使用して報告することを意味します。たとえば、私のシステムでは、トップはVIRTカラム(12GbのRAM、6Gbのスワップ、2Gbのビデオメモリ、NVidiaドライバによって予約された20Gbを与える)で23.3Gbを報告します。
task_info()
とvirtual_size
フィールドを使用すると、予想よりも大きな数字(Windowsでは1Gbにも近くないアプリケーションでは数GB)が得られますが、Linuxほど大きくはありません。
ここで大きな疑問があります。私のアプリケーションによって割り当てられるメモリの量はどうすればわかりますか?私は、これはやや漠然とした質問(?手段何を「メモリを割り当てられた」ん)であることを知っているが、私は柔軟だ:
- 私は、アプリケーションの静的データ、コードセクション、すべてを含めることを好むだろうが、私はすることができますなしに生きる。
- 私はスタックに割り当てられたメモリを含めることを好むでしょうが、私はなくても使えます。
- 私は共有ライブラリで使用されているメモリを含めることをお勧めしますが、私はこのライブラリを使わずに暮らすことができます。
- 私は実際にmmapのものを気にしません、私はその時点で、またはなしで行うことができます。
- 等
本当に重要なのは、数が(私は実装依存することを知っている)動的割り当て(新しい、malloc関数、何でも)で成長し、メモリが解放されたときに縮むことです。私はここで
を試してみました
物事は私が試してみましたソリューションのカップルおよび/またはのことを考えているが、それは私のために動作しないでしょう。これはどのようにツー・決定し、CPUとメモリ消費-から-インサイド・プロセスによって提案されたアプローチがある読み取り/ procの/自己/ステータス
から
。しかし、上記のように、これは私のために動作しない仮想メモリの量を返します。
を読むの/ proc /自己/ STATMから
ごくわずか最悪:Linuxカーネルのコードを指すhttp://kernelnewbies.kernelnewbies.narkive.com/iG9xCmwB/proc-pid-statm-doesnt-match-with-statusによれば、これらの2つの値の間の唯一の違いは、第二の一方がないことです
reserved_vm
を仮想メモリの量に引く。私は、reserved_vm
にはOpenCLドライバによって予約されているメモリが含まれていると願っていましたが、そうではありません。使用
mallinfo()
とuordblks
フィールドがこれは後に(仮想メモリ空間内+ 2GBの成長のためにいるので、(私は
new
sが不足している推測している)すべての割り当てを含めていないようです記憶が重い仕事をしていてもメモリを保持している)、私はmallinfo()
によって返された数字の約0.1Gbの成長しか見ていない。この値はKB周り336760で開始し、+ 2Gbのことで、仮想メモリ空間を増加した仕事のために1019496 KBでピークに達し、その後、
smaps /の/ proc /自己から[ヒープ]セクションのサイズを読みますそれが降りたことがないので、私は、私は本当にこの数に頼ることができないかわからない...
モニター自分のアプリケーション内のすべてのメモリ割り当てを
はい、理想的な世界では、私が希望前夜を支配するメモリを割り当てる人。しかし、これはいくつかの異なるアロケータを使用する従来のアプリケーションであり、いくつかの
malloc
、いくつかのnew
、いくつかのOS固有のルーチンなどがあります。必要なものを実行できるプラグインがいくつかあります。コンパイラなどを使用することができます。これは実際にメモリを制御するのには素晴らしいかもしれませんが、これは私の状況では機能しません。これが問題を解決するために(と私はそれにフォールバックする必要があるかもしれません)「ハック」方法かもしれないが、私は本当に希望のOpenCLコンテキストの初期化の前と後に
を仮想メモリのサイズを読みますOpenCLコンテキストが私のコントロールのどこかから初期化される可能性があるので、メモリを照会するより信頼性の高い方法を望んでいますが、他の類似しているがOpenCL以外の特定の問題が陥る可能性があります。
これはほとんどすべてのものです。まだ試していないことがもう1つありますが、これはOSXでしか機能しませんが、Why does mstats and malloc_zone_statistics not show recovered memory after free?に記載されている方法を使用することです。malloc_get_all_zones()
とmalloc_zone_statistics()
を使用しますが、これはmallinfo()
と同じ問題だと思いますすべての配分を考慮する。
誰でも、Linuxの特定のプロセス(とは別の方法であってもOSX)のメモリ使用量をクエリする方法を提案できますか?
mallinfo()with(arena + hblkhd + uordblks) –
@brianbeuning:http://man7.org/linux/man-pages/man3/mallinfo.3.htmlによると、 'arena'は' uordblks' + 'fordblks'ので、あなたの提案はいくつかのメモリを2回カウントアップするだろう... –