我试图在Linux上获取进程的共享内存大小。这是使用2个不同命令的结果:
顶部并检查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
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
如果标志[3] ==' s'那么这张地图将被视为共享地图。
所以我的问题是哪一个更准确?为什么他们有不同的方法来计算共享内存大小?
提前致谢!
答案 0 :(得分:2)
SHR
中的top
列未报告与pmap
shared
条目相同的内容。 top
报告与其他进程共享的内存量,因为它在一次加载到内存中的动态库中,并且使用该库的所有进程在其映像中包含相同的页面,因为那些页面是只读的。 pmap
似乎正在显示"共享内存"段,可以是读写或只读的数据页,并在具有shmget()
和相关功能的进程之间共享。