Linux 性能实战 | 附录:动态链接库是如何影响多个进程内存占用的?

📅 发布时间:2026/7/17 11:59:11 👁️ 浏览次数:
Linux 性能实战 | 附录:动态链接库是如何影响多个进程内存占用的?
Linux 性能实战 | 附录动态链接库是如何影响多个进程内存占用的在 Linux 内存分析中很多工程师都会遇到一个现象psaux|grepmy_program发现多个进程的 RSS 都很大例如进程A RSS 200MB 进程B RSS 200MB 进程C RSS 200MB直觉上会认为系统用了600MB 内存但实际物理内存可能只增加了220MB为什么会这样答案就是shared page共享页而 shared page 最常见的来源就是动态链接库 (.so)。这篇文章将从工程角度彻底讲清楚什么是 shared page动态链接库如何产生 shared page为什么多个进程 RSS 很大但实际内存没增加多少RSS / PSS / USS 的本质区别一、shared page 是什么一句话定义shared page 多个进程映射到同一个物理内存页关键点每个进程有自己的虚拟地址空间但不同进程的虚拟页可以指向同一个物理页示意图PhysicalMemoryProcessBProcessAvirtual pagevirtual pagephysical page结果两个进程 共享同一份物理内存不是复制。二、shared page 最常见来源动态链接库 (.so)例如系统中的/lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libstdc.so.6当程序启动./my_programLinux 不会把 libc.so 复制进进程。而是通过mmap(libc.so,MAP_SHARED)把文件映射进内存。流程ProgramLoadermmapPageCacheProcessAProcessB关键多个进程共享 page cache 中的物理页三、核心机制page cacheLinux 有一个全局结构page cache作用缓存文件内容对应的物理页例如libc.so只加载一次libc.so on diskphysical pagesProcessAProcessBProcessC结果100个进程 只使用一份物理内存四、为什么 RSS 看起来很大RSS 定义RSS 进程映射的物理页数量注意RSS 不关心页是否共享示例libc.so 占用10MB运行 100 个进程每个进程RSS 10MB但真实物理内存仍然是 10MB不是1000MB五、PSS 才是真实物理占用的更好指标PSS 定义PSS shared page 按进程数量平均分配示例libc.so 10MB 进程数 10每个进程PSS 1MB系统总 PSS10MB符合真实物理内存。六、USS进程真正独占的内存USS 定义USS 进程独占页不包含shared page示例heap 50MB shared libc 10MB结果RSS 60MB PSS ≈ 51MB USS 50MB七、动态链接库为什么可以共享因为动态库是文件-backed memory read-onlyLinux 可以安全共享。而不是匿名内存heap匿名内存不能共享。八、如果使用静态链接会发生什么静态链接gcc main.c-static结果每个进程都有一份 libc 副本示意ProcessClibcCProcessBlibcBProcessAlibcA无法共享。内存占用线性增长九、fork 也会产生 shared pageCopy-on-Writefork 后ParentPageChild共享同一页。只有写入时才复制这叫Copy-on-Write十、如何查看 shared page查看cat/proc/pid/smaps示例Shared_Clean: 2048 kB Private_Clean: 0说明全部共享推荐工具smem-r输出PID RSS PSS USS十一、shared page 如何影响 RSS / PSS / USS关系图not countednot countedlibc.sophysical pagesProcessAProcessBRSS includesRSS includesPSS splitPSS splitUSSAUSSB总结指标是否包含 sharedRSS包含PSS按比例USS不包含十二、工程中的典型误解误解RSS 大 内存真的占用大正确理解RSS 包含 shared page真实占用更接近PSS 或 USS十三、一个真实工程案例系统运行100 个 nginx worker 每个 RSS 50MB直觉5000MB实际物理内存 ≈ 800MB原因libc libssl libcrypto 共享十四、总结shared page 本质多个进程共享 page cache 中的物理页主要来源动态链接库 (.so) mmap 文件 fork (COW)对内存指标影响RSS 包含 shared PSS 按比例分摊 USS 只统计独占工程实践建议看真实内存占用 优先看 PSS 其次看 USS 不要只看 RSS