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等信息。


相关文章
|
26天前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
13天前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
|
13天前
|
缓存 Linux
如何检查 Linux 内存使用量是否耗尽?
何检查 Linux 内存使用量是否耗尽?
|
23天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
25天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
66 4
|
26天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
6天前
|
存储 算法 安全
深入理解Linux内核的内存管理机制
本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
|
15天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
70 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0