为何PS出的RSS总和大于实际物理内存
使用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总和大于实际物理内存的更多相关文章
- T-SQL 查询出某个列总值大于X的数据
原文: https://www.lesg.cn/netdaima/sqlservert-sql/2016-459.html 今天操作查询的时候遇见一个这样的要求: 有一张表 用户ID 购买日期 购买金 ...
- ps -aux --sort -rss |head 列出进程拿物理内存占用排序 使用ps aux 查看系统进程时,第六列即 RSS列显示的就是进程使用的物理内存。
ps -a Select all processes -u userlist Select by effective user ID (EUID) or name. ...
- background-size的应用情景:当给出的背景图片大于实际网页需要布局的图片大小时
网页需求是:50*50 如果只设置 width:50px;height:50px;background-image("images/XXX.png"); 效果如下: 添加设置:b ...
- scala基础题--100以内的数求和,求出当和第一次大于20的当前数【for】
import util.control.Breaks._ object work01 { def main(args: Array[String]): Unit = { //方式一 var sum:I ...
- 初级SQL开发汇总指南
汇总部分内容来自网络(作者 :zhtbs),比较基础的东西,能够了解比较基础的一些东西. Select语句概要 数据库中数据的提取(查询)使用select 语法,主要有以下几点作用 l 提取的数据 ...
- java虚拟机的内存模型
一.为什么要了解java虚拟机的内存模型 java虚拟机作为java代码运行的平台,是java技术的基石.了解java虚拟机的内存模型也就变得十分必要.它能帮助我们更好的了解java代码的运行机制,更 ...
- Java 虚拟机的内存结构
Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的J ...
- JVM探秘:Java内存区域
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 概述 Java 虚拟机为程序员分担了很多内存管理的工作,不再像 C/C++ 那样容易出 ...
- HBase基准测试
执行命令: hbase org.apache.hadoop.hbase.PerformanceEvaluation 返回信息: [root@node1 /]# hbase org.apache.had ...
随机推荐
- php流程管理练习
今天我们做一个流程管理: 1.流程管理的用法是什么样的? 2.怎么发起想要的流程? 3.审批的人要是怎么审批通过? 4.流程审核是不是要挨个走过? 一. 做这个流程管理肯定要有数据库: 二.数据库结束 ...
- 【学习笔记】TCP通信的细节及TCP连接对HTTP事务处理性能影响
从三次握手的细节说起 刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的"三次握手",socket作 ...
- Linux云自动化运维第五课
Linux云自动化运维第五课 一.进程定义 进程就是cpu未完成的工作 二.ps命令 ps a ###关于当前环境的所有进程 x ###与当前环境无关的所有进程 f ###显示进程从属关系 e ### ...
- CSS左侧固定宽 右侧自适应(兼容所有浏览器)
左侧固定宽,右侧自适应屏幕宽: 左右两列,等高布局: 左右两列要求有最小高度,例如:200px;(当内容超出200时,会自动以等高的方式增高) 要求不用JS或CSS行为实现: 仔细分析试题要求,要达到 ...
- 学习了php之后再来看php怎样学java
我用了一天时间学会了php,真的.我现在已经可以流畅的用thinkphp框架开发php了.学习过程是这样的:我接了个php的项目,包括两个部分:老系统添加功能和优化,再新做一个系统.已经答应给人家做了 ...
- 第4章Zabbix监控实践
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...
- js原生的轮播图
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- String类的实现(4)写时拷贝浅析
由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间.这种方法就是写时拷贝.这也是一种 ...
- RBAC打造通用WEB权限
RBAC不用给用户单个分配权限,只用指向对应的角色就会有对应的权限,而且分配权限和收回权限都很方便 5个关系对应5张表 五张表设计 CREATE TABLE `user` ( `id` ) unsig ...
- java实现截屏
import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit ...