当前位置: 首页 > news >正文

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 = 多个进程映射到同一个物理内存页

关键点:

  • 每个进程有自己的虚拟地址空间
  • 但不同进程的虚拟页,可以指向同一个物理页

示意图:

PhysicalMemory

ProcessB

ProcessA

virtual page

virtual page

physical page

结果:

两个进程 共享同一份物理内存

不是复制。


二、shared page 最常见来源:动态链接库 (.so)

例如系统中的:

/lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libstdc++.so.6

当程序启动:

./my_program

Linux 不会把 libc.so 复制进进程。

而是通过:

mmap("libc.so",MAP_SHARED)

把文件映射进内存。

流程:

Program

Loader

mmap

PageCache

ProcessA

ProcessB

关键:

多个进程共享 page cache 中的物理页

三、核心机制:page cache

Linux 有一个全局结构:

page cache

作用:

缓存文件内容对应的物理页

例如:

libc.so

只加载一次:

libc.so on disk

physical pages

ProcessA

ProcessB

ProcessC

结果:

100个进程 只使用一份物理内存

四、为什么 RSS 看起来很大?

RSS 定义:

RSS = 进程映射的物理页数量

注意:

RSS 不关心页是否共享

示例:

libc.so 占用:

10MB

运行 100 个进程:

每个进程:

RSS += 10MB

但真实物理内存:

仍然是 10MB

不是:

1000MB

五、PSS 才是真实物理占用的更好指标

PSS 定义:

PSS = shared page 按进程数量平均分配

示例:

libc.so = 10MB 进程数 = 10

每个进程:

PSS = 1MB

系统总 PSS:

10MB

符合真实物理内存。


六、USS:进程真正独占的内存

USS 定义:

USS = 进程独占页

不包含:

shared page

示例:

heap = 50MB shared libc = 10MB

结果:

RSS = 60MB PSS ≈ 51MB USS = 50MB

七、动态链接库为什么可以共享?

因为动态库是:

文件-backed memory read-only

Linux 可以安全共享。

而不是:

匿名内存(heap)

匿名内存不能共享。


八、如果使用静态链接,会发生什么?

静态链接:

gcc main.c-static

结果:

每个进程:

都有一份 libc 副本

示意:

ProcessC

libcC

ProcessB

libcB

ProcessA

libcA

无法共享。

内存占用:

线性增长

九、fork 也会产生 shared page(Copy-on-Write)

fork 后:

Parent

Page

Child

共享同一页。

只有写入时:

才复制

这叫:

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 counted

not counted

libc.so

physical pages

ProcessA

ProcessB

RSS includes

RSS includes

PSS split

PSS split

USSA

USSB

总结:

指标是否包含 shared
RSS包含
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

http://www.jsqmd.com/news/425330/

相关文章:

  • keil中 .axf .bin .hex文件的认识
  • nodejs+php+vue音乐播放器的设计与实现7z140
  • 基于nodejs+php+vue的宠物用品商城交易平台的设计与实现
  • nodejs+php+vue校园论坛系统 BBS论坛系统
  • Solution - P11597 [NOISG 2018 Finals] City Mapping
  • nodejs+php+vue网上鞋店系统 球鞋商城 鞋材零售网店的设计与实现
  • Shell脚本踩坑记录
  • AT_arc210_e [ARC210E] Subset Sum Gaps
  • 选配
  • nodejs+php+vue课程线上考试系统设计与实现
  • 零基础部署 OpenClaw:从 0 到跑起来(新手可直接照做)
  • 华为 vs H3C交换机常用命令差异
  • 单目相机当深度传感器用,不用双目/结构光。通过阴影估测3D高度。
  • 高并发下如何保证接口的幂等性
  • CF958F2 Lightsabers (medium)题解
  • 【AI渗透】——专为渗透测试工程师和安全研究员设计的新一代集成化安全测试平台(Venom)
  • 一款基于 .NET 开源免费、高效且用户友好文件搜索工具!
  • 基于粒子群算法的含分布式电源的主动配电网电压—有功-无功优化研究:以IEEE33节点为例
  • .Android Compose 基础系列:您的第一个 Kotlin 程序
  • 借助MongoDB实现大数据的分布式存储
  • MiniRAG + LLM (二)
  • 一文梳理清大数据领域CAP定理,轻松驾驭数据
  • 电动汽车充放电调度优化:全局与局部方案的比较及性能分析
  • 鸿蒙应用开发UI基础第十四节:文本显示组件Text核心讲解与实战演示 - 鸿蒙
  • Java求职面试实战:微服务与安全框架场景问题解析
  • 玩转STM32F1驱动双雄:BLDC与PMSM的攻防战
  • 从 Java 到 Go:一场性能革命
  • 使用C语言实现STM的启动文件
  • 探索大数据领域Doris的核心特性与优势
  • AI推理能力革命:如何打造高性能原生应用?