6

Linuxでプロセスの共有メモリサイズを取得しようとしました。2つの異なるコマンドを使用した結果は次のとおりです。

  1. トップとSHRフィールドで確認してください:

     PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1734 root      20   0  201m 4072 1012 S  0.0  0.1  22:00.65 php-fpm
    
  2. pmap -d:

    mapped: 206672K    writeable/private: 4352K    shared: 128K
    

pmapの共有メモリサイズがtopよりもはるかに小さいことがわかります。

理由を見つけるためにいくつかのソースコードを読みました。topは/proc// statmから値を読み取っているようで、値は次のように計算されます。

unsigned long task_statm(struct mm_struct *mm,
    unsigned long *shared, unsigned long *text,
    unsigned long *data, unsigned long *resident)
{
    *shared = get_mm_counter(mm, MM_FILEPAGES);
    *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
                                                       >> PAGE_SHIFT;
    *data = mm->total_vm - mm->shared_vm;
    *resident = *shared + get_mm_counter(mm, MM_ANONPAGES);
    return mm->total_vm;
}

すべてのファイルページが共有メモリとしてカウントされているようですか?

そして、pmapコマンドは/ proc // mapsから情報を読み取り、いくつかのフラグを使用して共有メモリを計算します。

3dc822a000-3dc822d000 rw-p 0002a000 08:13 5134288      /usr/lib64/libmcrypt.so.4.4.8
start-end flags file_offset dev_major:dev_minor inode

flags [3] =='s'の場合​​、このマップは共有マップとしてカウントされます。

だから私の質問はどちらがより正確ですか?そして、なぜ彼らは共有メモリサイズを計算するための異なる方法を持っているのですか?

前もって感謝します!

4

1 に答える 1

2

SHR列は、 sエントリtopと同じことを報告していません。は、他のプロセスと共有されるメモリの量を報告しています。これは、メモリに一度読み込まれるダイナミックライブラリにあり、そのライブラリを使用するすべてのプロセスは、それらのページが読み取り専用であるため、イメージに同じページを含むためです。「共有メモリ」セグメントを表示しているようです。これは、読み取り/書き込みまたは読み取り専用のデータページであり、および関連する機能を持つプロセス間で共有されます。pmapsharedtoppmapshmget()

于 2013-01-17T18:53:51.377 に答える