2013-01-17 17 views
5

Linux上でプロセスの共有メモリサイズを取得しようとしました。プロセスの正確な共有メモリサイズを取得するには?

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

あなたがいることを見ることができます:

  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ここでは2つの異なるコマンドを使用した結果ですpmapの共有メモリサイズはtopよりはるかに小さくなります。

    理由を見つけるためにいくつかのソースコードを読んでいます。すべてのファイルのページが共有メモリとしてカウントされているようです

    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; 
    } 
    

    :トップは/ procの// STATMから値を読んでいると、値がで計算されているようですか?

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

    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 
    

    フラグであれば[3] ==「s」は、このマップされます共有されたものとして数えられる。

    私の質問はより正確です。共有メモリのサイズを計算する方法が異なるのはなぜですか?

    ありがとうございます!

答えて

2

SHRtopにはpmap s sharedと同じことが報告されていません。 topは、他のプロセスがメモリに一度ロードされたダイナミックライブラリにあり、そのライブラリを使用するすべてのプロセスが読み取り専用であるため、イメージに同じページが含まれているため、他のプロセスと共有されるメモリ量を報告しています。 pmapは、「共有メモリ」セグメントを示しているように見えます。これは、読み書き可能なデータページであり、shmget()のプロセスと関連する機能の間で共有されています。

関連する問題