2013-01-17 69 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()和相关功能的进程之间共享。