Linux中smaps与smaps_rollup的区别及PSS数值差异与计算方式咨询
Linux中smaps与smaps_rollup的区别及PSS相关问题解析
一、smaps与smaps_rollup的核心区别
- smaps:是进程内存映射的详细拆分记录,会列出每个独立内存段(如代码段、私有数据段、共享库的单个映射实例等)的细分内存指标,包括Size、RSS、PSS、Swap等,适合排查单个内存段的占用问题。
- smaps_rollup:是smaps的汇总简化版,仅输出进程所有内存映射的合计指标(总Size、总RSS、总PSS、总Swap等),无细分内存段的细节,适合快速获取进程整体内存占用情况。
二、smaps总和与smaps_rollup中PSS的差异原因
这里的差异指手动累加smaps各段PSS值的总和与smaps_rollup给出的总PSS值之间的偏差,核心原因有两点:
- 四舍五入误差:内核计算单个共享内存段的PSS时会得到精确浮点值,但smaps输出时会取整为整数KB;而smaps_rollup直接用未取整的精确值累加总PSS,手动累加整数化后的段PSS会与精确总PSS产生微小偏差。
- 特殊段统计差异:极少数情况下,smaps可能未显示某些内核内部特殊内存映射(如部分vmalloc区域),但smaps_rollup会将这些段的PSS纳入统计,导致总和出现差异。
三、PSS的具体计算方式
PSS(Proportional Set Size)是按比例分配共享内存的统计指标,计算逻辑如下:
单个内存段的PSS计算
- 私有内存段:如进程私有代码、私有堆/栈数据,这类内存仅当前进程使用,PSS等于该段的RSS(驻留内存大小)。
- 共享内存段:如系统共享库、进程间共享内存区域,这类内存被多个进程共享,PSS等于该段的RSS除以共享该段的进程数量(N个进程共享时,单个进程的该段PSS = RSS / N)。
smaps与smaps_rollup的PSS计算流程
- smaps:遍历进程每个内存映射段,对每个段单独计算PSS(私有段取RSS,共享段按比例拆分),将结果取整为整数后输出。
- smaps_rollup:内核遍历进程所有内存映射段,直接累加每个段的精确PSS值(保留浮点精度,未取整),最终输出进程总PSS的合计值。
内容的提问来源于stack exchange,提问作者yuni
相关产品推荐
相关产品推荐

