1

初期化時に照会すると、すぐに2GBを超えるRAMを使用するプログラムがあります。基本的に、コードは次のようになります。

#include <blah>

int main() {
    cout << get_mem_usage() << endl;
    //Lots of things happen, but no significant memory usage
    return 0;
}

出力:[2013-02-15 18:38:05.865283] 2147.71 Mb

ただし、私は多くの異なる共有オブジェクトファイルにリンクしています。lddをチェックし、合計.soサイズが66MBの58個のライブラリにリンクしています。

get_mem_usageプログラムが正しい値を返していることは間違いありません。これらはtopおよびmassifの出力と一致します。

また、私は高エネルギー物理学分析のためのROOTフレームワークに対してリンクしていることにも言及する必要があります。

Linux x86_64を使用していますが、get_mem_usage()関数は自家製です。

可能であれば、プログラムのメモリ使用量を減らしたいと思います。

4

4 に答える 4

5

私の最初の推測:リンクしているライブラリのいくつかでの静的な初期化。

の最初の行として長い一時停止を挿入しmain()、/ proc / <pid> /を調べて、メモリが割り当てられている場所を確認します。例えば:

  • / proc / 12345 / task / 12345 / maps
  • / proc / 12345 / task / 12345 / smaps
于 2013-02-14T18:48:03.317 に答える
4

に関するドキュメントは見つかりませんでしたget_mem_usage()

報告されているメモリ使用量はどのようなものですか?

仮想メモリ システムのメモリ使用量を決定することは、非常に困難です。

実際に使用されるメモリ量はresident set size. これは基本的に、使用している物理メモリです。共有ライブラリ (例としては libc) を使用しますが、そのメモリ消費は (部分的に) 他のアプリケーションと共有されます。

次に、仮想セットのサイズがあります。これは、マップされた仮想メモリ、匿名マッピング、その他のマップされたファイルの合計です。その多くは実際には物理メモリに支えられておらず (つまり、常駐していない)、他のプログラム間で共有される可能性があります。

pmap -x <pid>常駐/汚れた部分を含めて、きれいなテーブルを提供します。

全体として、何がそのすべてのメモリを「使用する」かを調査する価値はありますが、それほど問題にはならないかもしれません。32 ビット システムで実行している場合、(仮想アドレス空間が限られているため) いずれにせよ後で少しきつくなる可能性があります。

于 2013-02-15T04:21:38.727 に答える
2

この場合、1.9 G のメモリを割り当てた単一のライブラリ (私が直接使用したわけではありません) であることが判明しました。/proc/12345/smaps を調べて見つけました

2aaab2197000-2aab2ba86000 rw-p 2aaab2197000 00:00 0 
Size:           1991612 kB

/proc/12345/maps で住所を調べて見つけた

2aaab2174000-2aaab2197000 rw-p 0016c000 4f9:2c566 59607963               /mnt/lustre/epp_scratch/atlas/sm442/Irvex/lhapdf-5.8.8/lib/.libs/libLHAPDF.so.0.0.0

これは、膨大な量の静的初期化を行っていた Fortran ライブラリです。

于 2013-02-14T22:27:22.033 に答える
2

別の可能性: アプリ間でメモリを共有している場合、その共有メモリは、1 回しか割り当てられない場合でも、共有メモリ セグメントにアクセスするすべてのアプリに対してカウントされます。したがって、2 GB の共有メモリ セグメントがどこかに割り当てられ、20 個の異なるアプリケーションがその共有メモリを使用すると、20 個のアプリケーションすべてが 2 GB 以上のメモリを使用しているように見え、40 GB 以上のメモリが割り当てられているように見えます。 .

于 2013-02-14T19:08:44.010 に答える