使用ps  aux  查看系统进程时,第六列即 RSS列显示的就是进程使用的物理内存。

可是把系统所有进程的该列相加时,得到的总和又远远高于系统实际的物理内存?这到底是怎么回事呢?

看一看linux是如何管理内存的就会知道。

我理解的意思是这样的,linux会在每个进程生成时分配一定量的内存给这个进程,这个只是分配,而体现在ps出来的是VSZ那列,这叫做虚拟内存。但实际上这些进程并没有占用这些内存。不妨,我也借用网上的一个例子来形容一下,就像银行发工资给员工一样,每个员工都有一个自己的银行卡,每月银行都会把固定的钱数打到员工的银行卡里,但是这个过程并不是把实际的钱发到员工手里,只是一串数字而已。实际上,银行并没有那么多钱的。回头再来看看linux给进程分配内存是不是和上面的举的例子很像呢?

讲了上面的观点后,依然不能把笔者所设的问题解答,那么继续往下探讨:

把系统所有进程的该列相加时,得到的总和又远远高于系统实际的物理内存?这是因为 ps 的结果,RSS 那部分,是包括共享内存的。这里使用 pmap 来看看。

pmap -d 24030

24030:   /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf

Address           Kbytes Mode  Offset           Device    Mapping

0000000000400000    6444 r-x-- 0000000000000000 008:00002 php-cgi

0000000000c4b000     272 rw--- 000000000064b000 008:00002 php-cgi

0000000000c8f000      52 rw--- 0000000000c8f000 000:00000   [ anon ]

00000000059dc000    9572 rw--- 00000000059dc000 000:00000   [ anon ]

0000003519000000     508 r-x-- 0000000000000000 008:00002 libfreetype.so.6.3.10

000000351907f000    2048 ----- 000000000007f000 008:00002 libfreetype.so.6.3.10

中间部分省略

00002b757df75000       4 rw--- 000000000000a000 008:00002 libnss_files-2.5.so

00002b757df76000   32768 rw-s- 0000000000000000 000:00008 zero (deleted)

00002b7580685000       4 rw-s- 0000000000000000 000:00008 zero (deleted)

00007fff2e126000     476 rwx-- 00007fff2e126000 000:00000   [ stack ]

00007fff2e19d000       8 rw--- 00007fff2e19d000 000:00000   [ anon ]

ffffffffff600000    8192 ----- 0000000000000000 000:00000   [ anon ]

mapped: 139548K    writeable/private: 12344K    shared: 32772K



pmap是用来显示内存使用的指令,-d 后面跟的是进程id. 关于pmap的使用以及显示的数据请看http://mylinux.5d6d.com/thread-977-1-1.html




linux 会把一些shared libraries 载入到内存中,在pmap 的输出中,这些shared libraries 的名字通常是 lib*.so ,如 libX11.so.6.2.0 。

这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中,同时,ps 输出的RSS 结果中,每个process 都包含了这个libX11.so.6.2.0 ,而事实上它只被load 了一次,如果单纯把ps 的结果相加,这样就重复计算了。



看pmap输出的结果,其实php-cgi 单纯进程所占的内存是这个writeable/private: 12344K

为何PS出的RSS总和大于实际物理内存的更多相关文章

  1. T-SQL 查询出某个列总值大于X的数据

    原文: https://www.lesg.cn/netdaima/sqlservert-sql/2016-459.html 今天操作查询的时候遇见一个这样的要求: 有一张表 用户ID 购买日期 购买金 ...

  2. ps -aux --sort -rss |head 列出进程拿物理内存占用排序 使用ps aux 查看系统进程时,第六列即 RSS列显示的就是进程使用的物理内存。

    ps -a     Select all processes -u userlist               Select by effective user ID (EUID) or name. ...

  3. background-size的应用情景:当给出的背景图片大于实际网页需要布局的图片大小时

    网页需求是:50*50 如果只设置  width:50px;height:50px;background-image("images/XXX.png"); 效果如下: 添加设置:b ...

  4. scala基础题--100以内的数求和,求出当和第一次大于20的当前数【for】

    import util.control.Breaks._ object work01 { def main(args: Array[String]): Unit = { //方式一 var sum:I ...

  5. 初级SQL开发汇总指南

    汇总部分内容来自网络(作者  :zhtbs),比较基础的东西,能够了解比较基础的一些东西. Select语句概要 数据库中数据的提取(查询)使用select 语法,主要有以下几点作用 l  提取的数据 ...

  6. java虚拟机的内存模型

    一.为什么要了解java虚拟机的内存模型 java虚拟机作为java代码运行的平台,是java技术的基石.了解java虚拟机的内存模型也就变得十分必要.它能帮助我们更好的了解java代码的运行机制,更 ...

  7. Java 虚拟机的内存结构

    Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的J ...

  8. JVM探秘:Java内存区域

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 概述 Java 虚拟机为程序员分担了很多内存管理的工作,不再像 C/C++ 那样容易出 ...

  9. HBase基准测试

    执行命令: hbase org.apache.hadoop.hbase.PerformanceEvaluation 返回信息: [root@node1 /]# hbase org.apache.had ...

随机推荐

  1. 10分钟精通SharePoint-搜索

    大势所趋随着企业内容和文档数量的骤增,快速定位到所需材料和内容已经迫不及待,这也是所有企业所面临的共同的挑战,应这个大的趋势,"搜索"闪亮登上了企业协作(SharePoint)舞台 ...

  2. cordova原理与插件制作

    ---恢复内容开始--- cordova插件打包教程: http://www.jianshu.com/p/96855e009e95 www.itnose.net/detail/6245407.html ...

  3. Java中的函数对象

    初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...

  4. input的type属性引申的日历组件

    HTML5规范里只规定date新型input输入类型,并没有规定日历弹出框的实现和样式.所以,各浏览器根据自己的设计实现日历.目前只有谷歌浏览器完全实现日历功能.相信这种局面很快就会结束,所有的浏览器 ...

  5. PHP随机生成随机个数的字母组合示例

    在很多系统环境下大家都会用到字母组合各种编码,下面推荐大家非常实用的PHP代码. $num由几个字母组合. $s字母包含大小写,可以自己调配大写还小写. <?php function makec ...

  6. windows phone 8.1开发:文件选择器FileOpenPicker

    原文出自:http://www.bcmeng.com/fileopenpicker/ 今天小梦给大家分享一下 windows phone 8.1中的文件选择器,和之前的windows phone8的不 ...

  7. Javascript:面试经典套路-查重(reduce)

    今天在偶然间查看到了一段代码,代码使用了很短的篇幅完成了字符串统计相同字符次数这个经典面试题,其中用到了reduce这个方法,网上查了查,没有查到什么有价值的东西,导致浪费了我一些时间才看懂,现将我的 ...

  8. css动画特效与js动画特效(一)------2017-03-24

    1.用css做动画效果: 放鼠标才会发生 利用hover <head> <style> #aa{ background-color: red; width: 100px; he ...

  9. 利用firefox调试安卓手机端web

    分2部分: 手机: 1.安装最新版firefox 2.打开浏览器,输入about:config 3.设置 devtools.debugger.remote-enabled 值为true devtool ...

  10. malloc函数及用法

    动态存储分配在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变.C语言中不允许动态数组类型.例如:int n;scanf("%d",&n);int a[n ...