2013-01-17 107 views
5

我試圖在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。

我讀了一些源代碼找到原因。看來,頂部從/ 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 //地圖讀取信息,然後通過一些標誌計算共享存儲器:

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

top中的SHR列未報告pmap s shared條目所做的相同操作。 top正在報告與其他進程共享的內存量,因爲它位於一次加載到內存中的動態庫中,並且使用該庫的所有進程都在其映像中包含相同的頁面,因爲這些頁面是隻讀的。 pmap似乎在顯示「共享內存」段,它們是可以讀寫或只讀的數據頁,並且在具有shmget()和相關功能的進程之間共享。