代码之家  ›  专栏  ›  技术社区  ›  Zohar81

观察Linux中的共享映射文件内存

  •  3
  • Zohar81  · 技术社区  · 5 年前

    我在用 mmap 系统调用加载文件内存以供其他几个进程读取(带有标志 MAP_SHARED MAP_POPULATE 提前加载所有内存)。

    检查进程内存消耗似乎忽略了映射文件内存是共享的这一事实。每个进程内存使用量在内存中包含整个映射文件,根据 ps -aux 命令。

    有没有办法区分共享和私有进程内存?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Sigi    5 年前

    即使内存是物理共享的,每个进程都有自己的虚拟内存映射,即使映射相同的区域,也会“消耗”一个独立的寻址空间—您可以在vsize列中看到它。在任何情况下(即使在 malloc() )内核将为每个进程保留一个独立的寻址空间,但不会立即在 后备存储器 .

    一旦开始对分配的内存进行读/写操作,就会将虚拟页分配给相应的 后备存储器 :常驻人数相应增加。

    这些页面是“干净”的,如果你刚刚阅读,如果你写给他们,“脏”的,直到他们不同步。(见 /proc/PID/smaps , /proc documentation , man pmap :此工具允许您区分共享和私有内存、脏页和干净页)

    MAP_POPULATE 选项立即预分配所有页面。如果映射是 MAP_PRIVATE 允许页面保持不干净,直到它们未显式与 msync() . 脏页被缓存在RAM中,事实上,一旦使用更多带有私有映射的页,可用系统内存就会减少。

    在另一侧,使用 MAP_SHARED ,您需要内核使虚拟页与 后备存储器 .

    但是对于一个映射文件,后备存储不是内存,而是文件——因为它是交换空间。所以您会有一个奇怪的效果,即映射文件被计为常驻集。

    这可以通过观察 /proc/PID/status :

    VmRSS                       size of memory portions. It contains the three
                                following parts (VmRSS = RssAnon + RssFile + RssShmem)
    RssAnon                     size of resident anonymous memory
    RssFile                     size of resident file mappings
    RssShmem                    size of resident shmem memory (includes SysV shm,
                                mapping of tmpfs and shared anonymous mappings)
    

    vmrss通常被称为rss。

    在这种情况下,RSS不计算物理内存,但文件映射:请求时,系统总内存大部分不受影响 MAPX共享 ,因为大多数情况下不缓存任何页面(缓存的,脏页将在 RssAnon )必须将它们刷新到共享 后备存储器 (文件)尽快。

    正如您正确地观察到的,RSS在每个进程中都被计算一次,即使是共享的。你可以在里面找到 /PRO/PID/SMAPS 另一个计数器,PSS(比例设置大小)-也可参见此答案:

    What does pss mean in /proc/pid/smaps

    一个进程的“比例集大小”(PSS)是它在内存中拥有的页数,其中每一页都除以共享它的进程数。因此,如果一个进程本身有1000页,并且与另一个进程共享1000页,那么它的PSS将是1500页。

    一个注意事项:您可以使用 MAP_SHARED|MAP_POPULATE 仅使用 tmpfs -否则,您将使用基于文件的共享。如果要查找IPC共享内存,请查看 shmget() .

    测验

    我已经用一个小程序验证了我的语句,该程序从一个带有不同标志的文件映射了2GB,然后用 memset() .

    地图私有

    ps -u 输出:

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    xxxx     15767  0.5  4.1 2004216 666944 pts/1  S+   12:54   0:00 ./mm 1
    

    /PRO/PID/SMAPS :

    7f143e5ec000-7f14b870c000 rw-p 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
    Size:            2000000 kB
    Rss:              666668 kB
    Pss:              666668 kB
    Shared_Clean:          0 kB
    Shared_Dirty:          0 kB
    Private_Clean:         0 kB
    Private_Dirty:    666668 kB
    Referenced:       666668 kB
    Anonymous:        666668 kB
    AnonHugePages:         0 kB
    Swap:                  0 kB
    KernelPageSize:        4 kB
    MMUPageSize:           4 kB
    Locked:                0 kB
    VmFlags: rd wr mr mw me ac sd 
    

    /过程/PID/状态 :

    VmRSS:    666944 kB
    RssAnon:          666560 kB
    RssFile:             384 kB
    RssShmem:              0 kB
    

    map_private_map_populate

    PS-U 输出:

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
    xxxx     17045 31.0 12.3 2004216 2000412 pts/1 S+   13:01   0:01 ./mm 2
    

    /PRO/PID/SMAPS :

    7f14aa983000-7f1524aa3000 rw-p 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
    Size:            2000000 kB
    Rss:             2000000 kB
    Pss:             2000000 kB
    Shared_Clean:          0 kB
    Shared_Dirty:          0 kB
    Private_Clean:         0 kB
    Private_Dirty:   2000000 kB
    Referenced:      2000000 kB
    Anonymous:       2000000 kB
    AnonHugePages:         0 kB
    Swap:                  0 kB
    KernelPageSize:        4 kB
    MMUPageSize:           4 kB
    Locked:                0 kB
    VmFlags: rd wr mr mw me ac sd 
    

    /过程/PID/状态 :

    VmRSS:   2000412 kB
    RssAnon:         2000032 kB
    RssFile:             380 kB
    RssShmem:              0 kB
    

    MAPX共享

    PS-U 输出:

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    xxxx     17670 18.0  4.1 2004216 666944 pts/1  S+   13:06   0:00 ./mm 3
    

    /PRO/PID/SMAPS :

    7f01db018000-7f0255138000 rw-s 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
    Size:            2000000 kB
    Rss:              666668 kB
    Pss:              666668 kB
    Shared_Clean:          0 kB
    Shared_Dirty:          0 kB
    Private_Clean:    666668 kB
    Private_Dirty:         0 kB
    Referenced:       666668 kB
    Anonymous:             0 kB
    AnonHugePages:         0 kB
    Swap:                  0 kB
    KernelPageSize:        4 kB
    MMUPageSize:           4 kB
    Locked:                0 kB
    VmFlags: rd wr sh mr mw me ms sd 
    

    /过程/PID/状态 :

    VmRSS:    666944 kB
    RssAnon:              96 kB
    RssFile:          666848 kB
    RssShmem:              0 kB
    

    map_shared_map_populate

    PS-U 输出:

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    xxxx     18259 16.1 12.3 2004216 2000480 pts/1 S+   13:10   0:00 ./mm 4
    

    /PRO/PID/SMAPS :

    7ff0d020b000-7ff14a32b000 rw-s 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
    Size:            2000000 kB
    Rss:             2000000 kB
    Pss:             2000000 kB
    Shared_Clean:          0 kB
    Shared_Dirty:          0 kB
    Private_Clean:   2000000 kB
    Private_Dirty:         0 kB
    Referenced:      2000000 kB
    Anonymous:             0 kB
    AnonHugePages:         0 kB
    Swap:                  0 kB
    KernelPageSize:        4 kB
    MMUPageSize:           4 kB
    Locked:                0 kB
    VmFlags: rd wr sh mr mw me ms sd 
    

    /过程/PID/状态 :

    VmRSS:   2000480 kB
    RssAnon:              96 kB
    RssFile:         2000384 kB
    RssShmem:              0 kB
    

    map_shared_map_populate,两个实例

    PS-U 输出:

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    xxxx     18259  0.1 12.3 2004216 2000480 pts/1 S    13:10   0:00 ./mm 4
    xxxx     19521  5.8 12.3 2004216 2000480 pts/1 S+   13:19   0:00 ./mm 4
    

    /程序/PID/SMAPS ,仅第一个PID:

    7ff0d020b000-7ff14a32b000 rw-s 00000000 fd:00 201562609                  /home/xxxx/test/mm.dat
    Size:            2000000 kB
    Rss:             2000000 kB
    Pss:             1000000 kB
    Shared_Clean:    2000000 kB
    Shared_Dirty:          0 kB
    Private_Clean:         0 kB
    Private_Dirty:         0 kB
    Referenced:      2000000 kB
    Anonymous:             0 kB
    AnonHugePages:         0 kB
    Swap:                  0 kB
    KernelPageSize:        4 kB
    MMUPageSize:           4 kB
    Locked:                0 kB
    VmFlags: rd wr sh mr mw me ms sd 
    

    /过程/PID/状态 :

    vmrss:20000480kb
    rssanon:96千字节
    rss文件:2000384 KB
    rssshmem:0千字节