Linux内存消耗

2023-05-16

原文:https://web.archive.org/web/20120520221529/http://emilics.com/blog/article/mconsumption.html

本文主要描述如何通过一个合理的方法来测量linux进程的内存消耗。linux包含了虚拟内存管理的特性,因此,内存消耗并没有想想中的那么简单。

心急速览

对于心急的人,我先给出结论。我倾向于使用PSS(Proportional Set Size)来测量内存消耗,前提是你的Linux系统支持。下面的Python方法,可以以KiB为单位返回指定进程ID的PSS。

import sys, re

def pss_of_process(pid):
    with file('/proc/%s/smaps' % pid) as fp:
        return sum([int(x) for x in re.findall('^Pss:\s+(\d+)', fp.read(), re.M)])

完整脚本:
https://web.archive.org/web/20130227090134/http://emilics.com/media/pub/pss.py
执行脚本,运行后获取所有用户运行进程PSS内存消耗(NEW BSD协议)

% sudo python pss.py
USER             PID    PSS  COMMAND
postgres        1308  29521  postgres: writer process
root            1867  21983  /usr/bin/X :0 vt7 -nolisten tcp -auth /var/...
www-data       28752  14507  /usr/sbin/apache2 -k start
www-data       28753  13669  /usr/sbin/apache2 -k start
...

我们介绍三种概念来观测Linux进程的内存消耗。VSZ、RSS和PSS。

尽管有点不准确,但是我们考虑这样一个场景。假设有三个人共同租住1个房子。每个人代表一个进程,生活费代表内存消耗。在这个场景中,测量一个进程的内存消耗相当于计算1个人的生活费。

每个人都独自占有他们自己的电话线。VSZ、RSS、PSS这三个指标都会单独计算每个人的电话费用,这是没有任何问题的。

这个房子有一个车库,付费的人可以使用,但是他们都不开车,所以他们都不会使用这个车库。但是VSZ会在每个人的生活费上计算车库的费用,尽管车库只是留置给他们使用的。因此,VSZ代表了所有东西的总的生活费用,不管他们实际使不使用。RSS和PSS只计算他们实际上使用的费用,因此,他们不会计算车库的费用,因为没有使用。

因为他们一起使用网络和电视,他们均摊这些费用。但是RSS会将全部的费用计算在每个人的头上,即使他们是一起使用,而且还均摊费用。RSS就是假设网络和电视的费用是没有跟任何人分享的。

PSS只会每人计算1/3的网络和电视费用,因为他们均摊了。这个比RSS更合理一些。

我们使场景更复杂些,方便我们理解PSS的局限性。他们中一个人经常上网,但几乎不怎么看电视。因此理论上这个人应该付50%的网络费用和20%的电视费用。但是PSS无法表述这种情况。它只能简单的计算每个人1/3的网络费用和电话费用。

我认为使用PSS更加合理。但是有局限性,有些场景下使用RSS更好。当你想知道如果你搬出去自己生活需要多少生活费时,RSS会更加合理。

虚拟内存管理

通过 ps 命令查看进程信息

#ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
norisky  29065  0.1  0.2   8132  5604 pts/8    Ss   19:03   0:00 zsh
norisky  29075  0.0  0.1  10228  3772 pts/8    S+   19:03   0:00 vi
norisky  29526  8.0  0.5  27708 10676 pts/4    S+   19:05   0:00 emacs -nw
norisky  29527  0.0  0.0   2976  1080 pts/6    R+   19:05   0:00 ps aux

在man手册中,我们可以了解到VSZ和RSS与内存消耗有关。

VSZ virtual memory size of the process in KiB (1024-byte units).  Device mappings are currently excluded; this is
                             subject to change.  (alias vsize).
RSS resident set size, the non-swapped physical memory that a task has used (in kiloBytes).  (alias rssize, rsz)

我们应该使用哪个?

技术术语

  1. Linux内存管理中的一块内存。一般Linux系统上1页是4096字节(4KB)
  2. 物理内存
    指的是实际内存,也就是RAM,计算机主存。
  3. 虚拟内存
    使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),无论实际内存还有多少,其他应用消耗使用了多少。虚拟内存页可以映射到物理内存页。因此,进程只需要考虑使用虚拟内存
VSZ和按需分页

使用VSZ来测量进程内存消耗没有太大的意义。由于存在按需分页这个特性,它会阻止非必要的内存消耗。

例如,emacs文本编辑器有能够处理XML文件的方法。但是这些方法根本没有使用。当用户编辑普通文本时,将这些方法加载到物理内存完全没有必须。按需加载特性使得进程只有在使用时才加载对应的页。

首先,当程序启动时,系统给予进程一个虚拟内存空间,但是并不会将方法功能对应的内存页真的加载到物理内存空间。当程序执行虚拟内存中的方法功能时,CPU中的MMU告诉Linux系统,内存页未加载。而后,Linux暂停进程,加载内存页到主存,将页映射到进程的虚拟内存,然后进程从暂停的位置启动运行。因此,进程并不需要知道它暂停了,只需要假设从虚拟内存加载方法并使用。

VSZ是指进程的整个虚拟内存大小,无论页是否被加载到实际的主存中。因此,它并不是一个真实的指标可以用来测量内存消耗,因为它包含了没有使用的页。

RSS和共享库

RSS描述了进程实际加载到物理内存的页数量。听起来,特别像进程的真实内存消耗,而且比VSZ更精准。但因为共享库或动态链接库的原因,RSS也没有那么简单。

库是一个包含特定功能的模块。例如,libpng.so 处理PNG图片的压缩和解压缩,libxml2.so 处理xml文件。通常不需要每个程序员都编写这些功能,他们可以使用别人写的库来实现他们的目的。

共享库是被多个程序或进程所共享的。例如,当两个同时运行的进程都想要使用 libxml2.so中的XML处理功能时,Linux一旦加载libxml2.so后,将它映射到两个进程的虚拟空间。这两个进程不需要关注他们是否和其他进程共享这些功能,因为他们可以访问这些功能,在他们自己的虚拟空间中使用这些功能。因为这个特性,Linux减少了不必要的重复内存页。

现在,我们回头之前的例子。emacs 拥有可以处理xml文件的功能。这是使用的 libxml2.so共享库。这次,用户确实在处理xml文件,emacs正在使用 libxml2.so。同时,有两个后台进程也在使用 libxml2.so。因为 libxml2.so是共享库,Linux只需要加载libxml2.so 一次到物理内存,然后将该地址映射到这3个进程的虚拟空间就可以了。

如果我们这时查看emacs的RSS,它将包含libxml2.so的内存页。这并没有错,因为emacs确实在使用它。但另外两个进程呢?并不只是emacs在使用这些功能。如果你将这三个进程的RSS相加,libxml2.so尽管只被加载到物理内存1次,却被累加计算了3次。

因此,RSS可以表明当进程独自运行,没有去其他进程共享任何库时,所需要的内存消耗。而在实际中,RSS会过度进程的内存消耗。用来测量一个进程的内存消耗并没有错,但是你需要牢记RSS的行为。

PSS

PSS是一个相对比较新的内存消息测量指标。并不是所有Linux都支持PSS,但如果支持,那它绝对派的上用场。PSS的原理是将共享页平均分配到所有使用它的进程上。

如果存在N个进程在使用共享库,那么每个进程占用1/N共享库内存页。

还是之前的例子,emacs和另外两个进程共享libxml2.so,因为存在3个进程,PSS会假定每个进程占用1/3的libxml2.so的内存页。

我认为PSS相对RSS更加可靠。尤其是考虑系统的整体内存消耗时。例如,当你开发一个多进程的系统时,你想评估你需要为设备配备多大内存时,PSS比RSS更加合适。

ps命令不会打印PSS。你可以使用pss.py的脚本来查看进程的PSS。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内存消耗 的相关文章

  • ubuntu如何分区

    1 swap交换分区 xff0c 一般为你机器内存的两倍 xff0c 少于这个容量 xff0c 系统无法进入休眠 实质是硬盘上的交换空间而非分区 xff0c 所以没有格式 xff0c 默认休眠将数据储存于此 可以取消 xff08 如不用sw
  • Networkx_找出最大联通子图及联通子图规模排序

    G 61 nx path graph 4 生成一个包含4个节点的线型网络 xff08 一字长蛇型 xff09 xff0c 节点编号lebel从0到1 span style font size 18px strong nx draw G wi
  • databinding简单使用

    开始使用分为4步 xff1a 第一步 数据绑定支持 xff0c 在app的build gradle下面添加数据绑定支持 android dataBinding enabled 61 true 第二步 xff1a 创建实体类 xff0c 如U
  • java使用线程池和Future接口实现异步的实例

    线程池可以提供线程的复用和管理 xff0c 避免线程频繁创建和销毁的开销 而Future接口则可以获取异步任务的执行结果和状态 xff0c 避免了阻塞等待异步任务完成的情况 下面是一个简单的示例代码 xff1a 96 96 96 impor
  • 我程序人生的启蒙书

    是这本书 xff0c 大一的我接触了c和c 43 43 xff0c 为数学专业的我打开了通往另一个世界的道路 xff0c 做一名优秀的程序员 是这本书 xff0c 大一的我开始废寝忘食的学习 xff0c 自习室里往往就放着这一本数 xff0
  • Leetcode Decode Ways 解题报告

    A message containing letters from A Z is being encoded to numbers using the following mapping 39 A 39 gt 1 39 B 39 gt 2
  • 研究生计算机专业的方向有哪些?

    链接 xff1a https www zhihu com question 349899328 answer 1752872326 编辑 xff1a 深度学习与计算机视觉 声明 xff1a 仅做学术分享 xff0c 侵删 作者 xff1a
  • Android Studio使用OpenCV进行图像基本处理

    Android Studio使用OpenCV进行图像基本处理 1 环境配置 进入OpenCV官网下载SDK包 进入官网 xff08 https opencv org releases xff09 选择 34 Android 34 版本下载
  • QT中基于QWebEngineView的C++和JS互相调用

    QT版本5 14 2 xff0c ubuntu18 04 4 1 PRO包含库 QT 43 61 webenginewidgets 2 main中启用OpenGL QCoreApplication setAttribute Qt AA Us
  • cin相关函数

    cin cin的相关函数 get getline gt gt ignore cin cout 都关联一个行缓冲区 按下enter键 xff0c 生成一个 n 在缓冲区中 xff0c 同时也就可以操作这一行了 cin get 从缓冲区取一个字
  • 浅谈人工智能(AI)

    人工智能 AI 一 人工智能简介 1 1 人工智能定义和发展历史 人工智能 xff08 Artificial Intelligence xff09 xff0c 英文缩写为AI 它是研究 开发用于模拟 延伸和扩展人的智能的理论 方法 技术及应
  • ubuntu18.04忘记密码的解决办法

    大半年没动的U盘系统忘了用户登录密码 xff0c root密码也忘记 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 简单记录一下 xff0c
  • iocp 非阻塞Socket异步接收限速

    网上找遍了也没找到关于异步非阻塞Socket的限速资料 于是 自己写了一份 限速100M S 误差15M S 限速50M S 误差5M S 限速10M S 误差0 3M S 限速5M S 误差0 02M S 限速越小 精度越准 functi
  • qt发布的程序时如何将依赖的dll分开放在不同目录下

    qt发布的程序时如何将依赖的dll分开放在不同目录下 QT发布的程序 xff0c exe可执行程序与dll文件都在同一个目录下 xff0c 我现在想把那些dll文件 xff0c 放到一个文件夹下 xff0c 这个文件夹和exe在同一个目录下
  • Android性能优化:Bitmap详解&你的Bitmap占多大内存?

    在开发app时 xff0c 显示一张本地图片 xff0c 这张图片在加载时会占用大多内存呢 xff1f 猜测占用内存大小和以下几个因素有关 xff1a 设计师切图 xff0c 图片本身的分辨率 xff1b 图片所放文件夹代表的 密度 dpi
  • HashMap初始容量为什么是2的n次幂及扩容为什么是2倍的形式

    HashMap的初始容量都是2的n次幂的形式存在的 xff0c 而扩容也是2倍的原来的容量进行扩容 xff0c 也就是扩容后的容量也是2的n次幂的形式存在的 xff0c 下面就来说明一下为什么是2的n次幂的形式 xff01 先来看一下源码
  • ARM裸机第五部分-SDRAM和重定位relocate

    第一部分 章节目录 1 5 1 汇编写启动代码之关看门狗 1 5 2 汇编写启动代码之设置栈和调用C语言1 1 5 3 汇编写启动代码之设置栈和调用C语言2 1 5 4 汇编写启动代码之开iCache 1 5 5 重定位引入和链接脚本1 1
  • Java线程死锁的原因和条件

    一 死锁概念 所谓死锁 xff0c 是指多个进程在运行过程中因争夺资源而照成的一种僵局 当进程处于这种僵持状态时 xff0c 若无外力作用 xff0c 它们都将无法再向前推进 二 产生死锁的原因 xff08 1 xff09 竞争资源 当系统
  • Ubuntu 14.04无法连接ssh服务解决方法

    解决方法如下 xff1a 1 先试着开启SSH服务 在使用SSH之前 xff0c 可以先检查SSH服务有没有开启 使用命令 xff1a sudo ps e grep ssh 来查看 xff0c 如果返回的结果是 xxxx 00 00 00
  • 1.14.ARM裸机第十四部分-LCD显示器

    第一部分 章节目录 1 14 1 LCD简介 1 14 2 LCD的接口技术 1 14 3 LCD如何显示图像1 1 14 4 LCD如何显示图像2 1 14 5 LCD的六个主要时序参数1 1 14 6 LCD的六个主要时序参数2 1 1

随机推荐

  • LCD常用接口原理

    LCD常用接口原理 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 xubin 平台信息 内核 xff1a linux2 6 linux3 0 系统 xff1a android
  • 1.15.ARM裸机第十五部分-触摸屏TouchScreen

    第一部分 章节目录 1 15 1 输入类设备简介 1 15 2 电阻式触摸屏的原理 1 15 3 S5PV210的电阻触摸屏控制器 1 15 4 电容触摸屏的原理 1 15 5 ft5x06电容触摸IC简介 第二部分 章节介绍 1 15 1
  • MAC【Android studio】Gradle download:kotlin-compiler-embeddable-1.3.70.jar下载太慢

    采用策略去Maven仓库下载资源 更新到本地进行加载 1 进入仓库网址链接 https mvnrepository com 点击下载如图 2 配置下载jar文件到 gradle文件中 文件路径 Users 34 用户名 34 gradle
  • 线程安全是如何实现的?

    实现线程安全与代码编写有很大的关系 xff0c 但虚拟机提供的同步和锁机制也起到了至关重要的作用 互斥同步 互斥同步 xff08 Mutual Exclusion amp Synchronized xff09 是一种最常见也是最主要的并发正
  • 2022,音乐号自媒体起号涨粉保姆级攻略,这是个收获的季节。

    前言 最近遇到好多朋友说想做短视频自媒体 xff0c 但找了很多资料 xff0c 甚至报了学习班也没什么起色 xff0c 这不前天一个姐姐说他家姑娘想做抖音 xff0c 俩月了没啥粉丝也没啥播放量 xff0c 看到我的音乐号了 xff0c
  • 短视频消重去重九种方法,组合使用原创度更高,各平台轻松过原创

    想做好视频去重 xff0c 首先要了解视频查重的机制 网上流传的检查MD5其实已经过时了 xff0c 现在MD5已经是过去式 查重要对视频的方方面面进行检查 xff0c 包括但不限于 xff1a 视频的标题 xff0c 封面 xff0c 描
  • 不直播不露脸也能做短视频变现,想挣点生活费试试这些玩法

    大家好 xff0c 我是 64 我赢助手短视频运营 xff0c 最近一直有小伙伴问我 xff0c 做了好久的短视频一直不赚钱 xff0c 今天总结了一下 xff0c 做了90天短视频还没赚了试试这5种易变现的玩法 新手不直播不露脸也能做短视
  • 科普一下:拍抖音需要什么设备,可能用到的设备合集

    大家好 xff0c 我是 64 我赢助手短视频运营 xff0c 抖音是现在最火的短视频平台之一 xff0c 几乎每个人都在用它 xff0c 抖音视频的发展离不开手机 但你知道吗 xff1f 手机拍摄有很多方面的限制 xff0c 比如手持稳定
  • 短视频上热门技巧总结,这样做你也可以快速上热门。

    最近开始做短视频 xff0c 找了很多短视频运营创作技巧 xff0c 但能上热门的只有那么几个 xff0c 经过近一周的分析 xff0c 结合了我赢上短视频运营创作技巧 xff0c 得到了以下几个经典技巧合集 xff1a 学会一个就值了 首
  • 不要再被骗了,解密短视频里追剧看电影都能赚钱的坑。

    不要再被骗了 解密短视频里追剧看电影都能赚钱的坑 最近刷短视频刷到了好多抖音追剧看电影每天收几百 xff0c 还有截图 xff0c 还有怎么实操的视频 关键不是刷到一个两个 xff0c 是几十个还有越来越多的趋势 都说新入门实操 xff0c
  • 视频号的视频怎么下载到手机?不录屏也不找手机缓存,一键下载。

    你有没有看到有用的视频 xff0c 只收藏起来 xff0c 最后又找不到的时候 前天给朋友找了一个过年快速整理家具杂物的教程 xff0c 谁知道原作者第二天把视频给删掉了 xff0c 朋友说没有来得及看 昨天发给了朋友一个最新的教程 xff
  • 2023年做好自媒体的五个步骤,一步一个脚印稳妥找到结果。

    2023年做好自媒体的五个步骤 一步一个脚印稳妥找到结果 我不管你现在什么负债 破产 xff0c 还是迷茫焦虑 xff0c 通通别管了 xff0c 听话照做执行 看完我这篇内容 xff0c 2023年你还做不起来 xff0c 你就别打嘴炮
  • 2023视频号视频怎么下载到手机?最新验证过的可用方法汇总

    视频号视频怎么下载到手机 xff1f 今天又想下载一个视频号的视频 xff0c 找到收藏已久的视频号视频下载方法 xff0c 结果发现很多方法已经不能用 xff0c 一些能用的也开始收费了 只好重新寻找适合2023最新的几种方法解决视频号下
  • Android系统签名制作

    系统环境 Ubuntu18 04 首先要有对应系统的源码 源码目录build target product security将platform pk8和platform x509 pem copy出来放到一个目录下生成shared priv
  • 使用Cropper进行图片剪裁上传

    在项目中 xff0c 需要多上传的图片按照比例和尺寸进行裁剪 xff0c 这类场景在一些CMS系统中是比较常见的 xff0c 尤其是大部分的文章现在要适配PC Mobile两种平台 xff0c 文章的封面图等便需要按照尺寸做裁剪 xff0c
  • Element-UI消息提示组件Message在Vuex中的调用实现

    在最近的项目开发中 xff0c 前端部分使用 Vue 开发 xff0c 整个页面基于 Element UI 实现 由于是单页面多组件应用 xff0c 使用了 Vuex 做状态管理 为了页面交互的友好和风格的统一 xff0c 消息提醒使用 E
  • Fork原项目新增分支的同步和推送

    在 Github 或者 Gitlab Fork 项目以后 xff0c 原项目增加了新的分支 xff0c 我们可以通过以下流程将分支同步下来 本项目前提假设我们设置了 remote 的名称为 up 与源项目关联 git remote v or
  • Elasticsearch文档版本冲突原理与解决

    一般我们在更新文档时 xff0c 主要的操作流程时 xff1a 读取文档 gt 修改 gt 提交保存 数据中心等保存的都是最新一次提交的内容 大部分时候 xff0c 这都没有什么问题 但是如果两个或更多的请求同时修改一个文档时 xff0c
  • 随笔

    沟通 跨部门沟通 xff0c 首先应确立沟通的目的是双方的有效配合和问题解决的方向 方法 xff0c 去除程序员们自带的问题责任论 xff0c 不能按照 不是我的问题 xff0c 我这OK xff0c 跟我无关 这样的思路去讨论和解决问题
  • Linux内存消耗

    原文 xff1a https web archive org web 20120520221529 http emilics com blog article mconsumption html 本文主要描述如何通过一个合理的方法来测量li