linux - 如何获得进程的准确共享内存大小?

标签 linux memory-management shared-memory

我试图获取 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' 那么这张 map 将被算作共享 map 。

所以我的问题是哪个更准确?为什么他们有不同的方法来计算共享内存大小?

提前致谢!

最佳答案

top 中的 SHR 列报告的内容与 pmapshared 条目不同。 top 正在报告与其他进程共享的内存量,因为它位于动态库中,一次加载到内存中,并且使用该库的所有进程在其镜像中都包含相同的页面,因为这些页面是只读的。 pmap 似乎显示“共享内存”段,这些段是可以读写或只读的数据页,并且在进程之间共享 shmget()及相关功能。

关于linux - 如何获得进程的准确共享内存大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14385387/

相关文章:

java - Axis Web 服务引发错误 : Exception occurred while trying to invoke service method

c - 如何在 C 中使用一个引用创建多个内存块

c - 只读时的共享内存

linux - libftdi 入门

linux - 无法为用户将 key 添加到远程计算机

android - 如何从 android 中的 native ndk 'C' 代码中查找内存泄漏(最新方法)

memory-management - 如果CPU正在处理相应的内存请求,如何保证内存页面不会被驱逐?

c++ - 共享内存在windows中是如何实现的?

c - C 中的 fork() 和 POSIX 中共享内存的内存表示

c++ - 在 Linux 上无法按预期工作的共享库中的增强日志记录 channel 过滤