Linux内存工具解析之RSS/VSS/USS/PSS区别于联系

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Linux内存工具解析之RSS/VSS/USS/PSS区别于联系

对于Linux系统程序开发人员,经常需要和进程所使用的内存情况打交道,比如,分析程序的内存泄漏问题。这时候我们可能使用ps、top、procrank、dumpsys(后两个命令为Android系统)来跟踪、调试进程内存的使用情况。上述几个工具进程涉及到的几个比较的重要的概念:VSS、RSS、PSS、USS,对于这几个概念,大家总是存在一种似曾相识,却又不甚了解的感觉,这对于真正的把握进程内存使用情况是十分有害的。所以,本文旨在彻底分析这个四个概念,弄清各个量之间的联系和区别,提供有助于解释各种工具的内存报告的信息,以便确定Linux进程和系统的实际内存使用量,为以后分析内存问题提供坚实的理论基础。


基本概念


  • VSS:Virtual Set Size 虚拟耗用的内存(包含与其他进程共享占用的虚拟内存)


  • RSS:Resident Set Size 实际使用的物理内存(包含与其他进程共享占用的内存)


  • PSS:Proportional Set Size 实际使用的物理内存(按比例包含与其他进程共享占用的内存)


  • USS:Unique Set Size 进程独自占用的物理内存(不包含与其他进程共享占用的内存)


对于单个进程,一般来说内存占用大小排序如下:VSS >= RSS >= PSS >= USS


概念解析


Android有一个名为procrank(/system/xbin/procrank)的工具,它列出了Linux进程的内存使用量,并按使用量的高低排序。每个进程报告的内存使用情况分为VSS、RSS、PSS和USS。


为了简单起见,在这个描述中,内存将用页面而不是字节来表示。像我们这样的Linux系统在最低级别上以4096字节的页面管理内存。


下面分别具体解释一下各个概念的含义:


  1. VSS(ps工具中表示为VSZ)表示进程总的可访问地址空间。这个大小还包括可能不驻留在RAM中的内存,比如使用malloc分配内存后,尚未写入数据的内存。VSS对于确定进程的实际内存使用量几乎没有什么用处。


  1. RSS表示一个进程在RAM中实际拥有的总内存。RSS可能具有误导性,因为它包括了该进程与其他进程共享的实际物理内存使用量,例如,对于共享库,其往往只加载到内存中一次,而不管有多少进程使用它。RSS不能准确地表示单个进程的内存使用情况。


  1. PSS与RSS不同之处是,对于进程间共享的内存,其按比例报告其所使用的共享物理内存大小。比如有n进程同时在使用一个共享库,那对于单个进程其占用的该共享库的内存为1/n。如果三个进程都使用一个有30页的共享库,那么这个库将只向每个进程报告的PSS贡献10页。PSS是一个非常有用的数字,因为当系统中所有进程的PSS加在一起时,就可以很好地表示系统中总的内存使用量。当一个进程被终止时,贡献给它的PSS的共享库将按比例分配给仍然使用该库的其他进程的PSS总数。这样,PSS可能有点误导人,因为当进程被终止时,PSS不能准确地表示返回到整个系统的内存。


  1. USS表示进程占用的总的物理内存大小,也就是说这部分内存是该进程完全独占的。 USS是一个非常有用的数字,因为它表示运行特定进程的实际增量成本。当进程被终止时,USS是实际返回给系统的总内存。当最初怀疑某个进程存在内存泄漏时,USS是最好的监视数字。


对于使用Python的系统,还有一个很好的工具叫做ledsmem,它可以报告内存统计信息,包括所有这些类别。


NOTE:这里有几个问题需要注意


  1. 两个进程共享的部分,远远不是只有共享库,比如我们在Linux里面开2个bash进程,那么这2个bash,实际是共享1个代码段;其他的mmap()的时候shared的映射当然也是两个进程共享的内存。


  1. 共享库里面的内存,也不是都共享,只是代码段等不会做CoW(写时拷贝)的内存才会跨进程共享。


  1. USS去掉的是所有跨进程共享的内存,不是只去掉了共享库。


实例解析


下面通过一个实例,具体解析各个量之间的关系。假设Linux下有两个bash进程、一个cat进程,进程ID分别为1044、1045、1054,下面通过公式分别计算VSS、RSS、PSS、USS:


网络异常,图片无法展示
|


  • VSS = 1 + 2 + 3


  • RSS = 4 + 5 + 6


  • PSS = 4/3 + 5/2 +


  • USS = 6


上图中的4这片内存,是libc的代码段在内存驻留的部分,被3个进程共享;5这段内存,是bash的代码段,被2个进程(1044和1045)指向。在计算PSS的时候,这些都需要被比例化。


监测工具


对于Linux系统,一般都会提供ps、top两个命令,Android系统还会提供procrank、dumpsys这两个命令。对于ps、top其只能查到VSS、RSS这两个值;procrank、dumpsys可以提供PSS、USS信息,dumpsys meminfo 可以查出native和dalvik分别占用多少内存。另外,dumpsys可以查询到很多有用的系统信息,比如meminfo、cpuinfo、activity、window、wifi、account等信息。


相关文章
|
4天前
|
存储 缓存 安全
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
8天前
|
安全 程序员 API
|
2天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
6天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
30 4
|
10天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
84 9
|
1月前
|
人工智能 JavaScript 数据可视化
Cursor 、v0 和 Bolt.new:当今 AI 编程工具的全面解析与对比
本文对 Cursor AI、v0 和 Bolt.new 三大 AI 编程工具进行了全面比较,分析其各自优势与局限性,帮助开发者在不同工作流中灵活应用。
193 8
Cursor 、v0 和 Bolt.new:当今 AI 编程工具的全面解析与对比
|
7天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
25天前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
46 2
|
23天前
|
存储 前端开发 JavaScript
前端模块化打包工具的深度解析
【10月更文挑战第13天】前端模块化打包工具的深度解析
|
23天前
|
JSON JavaScript 前端开发
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
64 0
下一篇
无影云桌面