查看linux的进程到底用了多少内存

简介: 1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有   (1). ps aux:     其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存。

1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有

   (1). ps aux:


     其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存。

           RSS列 表示, 程序占用了多少物理内存。

           虚拟内存可以不用考虑,它并不占用实际物理内存。

   (2). top 命令也可以

     其中  VIRT(或VSS)列  表示,程序占用了多少虚拟内存。 同 ps aux 中的 VSZ列

           RES列 表示, 程序占用了多少物理内存。同 ps aux 中的RSS列

           

2.在linux下, 查看当前系统占用了多少内存, 一般的命令是  free

其中, free就是系统还有多少内存可以使用。

但由于 linux 系统对内存使用有一个原则, 就是, 内存是宝贵的, 能使用多少就使用多少。 所以, linux会把已经调用过的包缓存起来,放在内存里。

这样,实际上,可以使用的内存,就可以理解为, free+buffers+cached


3.当你了解完这些命令以后, 再去使用ps aux 命令去查看的时候, 会发现一个奇怪的现象。

 所有的  RSS 列的数据,加起来, 比物理内存的数要大很多。

 比如, 物理内存为2G, 而RSS列的数据加起来,可能有5个G之多, 这是怎么回事了?

 

 这是因为RSS列的值骗了我们。 

 

 linux的内存机制是这样的:

 在运行一个程序时, linux会调用该程序依赖的链接库, 如lib.xx.so。 首先看该链接库是否被映射进内存中,如果没有被映射,则将代码段与数据段映射到内存中,否则只是将其加入进程的地址空间。

 

 这样,当N个程序,依赖到lib.xx.so的时候, 实际上,内存中只有一个lib.xx.so ,而不是N个。 

 

 而RSS在显示一个程序占用的实际物理内存时, 将lib.xx.so也算了进来。

 

 比如, X程序, 本身占用内存为5M, lib.xx.so 占用内存2M,lib.xx.so被N个程序共享依赖。 则RSS显示为,X程序运行,占用内存为7M。 实际上, X程序占用了5M空间。 多余的2m被讨入到RSS中了。

 

 当你在用ps aux显示内存占用情况时, N个共享依赖lib.xx.so的N个程序,都把这2m空间,算在自己的RSS中了, 这样RSS的sum值,就比实际物理内存多了。

 

 当然, linux的内存使用机制很复杂, 不是一句两句能说清楚的。这里只是简单的说明了一下, ps aux中的RSS值, 并不能真实反映物理内存的使用情况。

 

4. 如果查看更详细的内存使用情况, 可用以下几种方法, 或者几种方法结合使用:

这几种方法,都需要root账户的权限


(1). pmap -d $pid 

$pid 是正在运行的程序的pid


(2). cat /proc/$pid/smaps

  smaps的数据比较详细,可简单的归纳一下,归纳的命令如下:

  cat /proc/$pid/smaps  | awk '/Size|Rss|Pss|Shared|Private|Referenced|Swap/{val_name=gensub(/([a-zA-Z_]*).*/,"\\1",1,$1); list[val_name]+=$2; }END{for(val in list)print val,list[val];}'                     

(3). cat /proc/$pid/maps


(4). cat /proc/$pid/statm

输出解释

第一列  size:任务虚拟地址空间大小
第二列  Resident:正在使用的物理内存大小
第三列  Shared:共享页数
第四列  Trs:程序所拥有的可执行虚拟内存大小
第五列  Lrs:被映像倒任务的虚拟内存空间的库的大小
第六列  Drs:程序数据段和用户态的栈的大小
第七列 dt:脏页数量

(5). vmstat

这个命令据说也可以提供一些参考信息,具体还未研究

 

5.作为phper,尝试过使用php的函数memory_get_usage(), 该函数也不能得到php当前运行的程序,实际的,真正占用的内存数量。

  如果真想得到,php真正占用的内存, 大概只能在, 程序运行的开始,执行一次memory_get_usage().

  在程序运行结束,执行一次memory_get_usage()。 将两者的值相减,得到的值, 应该是一个相对比较准确的,内存占用数量了。

  这个方法还没有测试, 考虑到, 得到这个数量,也没有实际意义, 加上平时又比较忙,懒得试了。

  

  也许php还有一个方法, 是使用shm_* 系列函数, 这也我也未深入研究,详见这篇文章(http://duckweeds.blog.sohu.com/166663796.html)

  

 6.另外还有一些文章可以参考,如下:

 (1)一个C程序员, 眼中的Linux内存使用详解,写的比较详细,比较细致,也比较专业。

 (2)对 /proc/pid/statm的详细说明

 (3)简单解读linux的/proc下的statm、maps、memmap 内存信息文件分析

 (4)php 共享内存的使用

 (5)Memory Usage with smaps

 (6)Capturing Process Memory Usage Under Linux,这篇文章似乎是对一个产品的广告,但里面对USS,PSS,RSS 这几个概念有详细的解释

 (7) ELC: How much memory are applications really using,跟(6)一样,是对同一个产品的广告,文章里有一些东西可以参考

(8) Linux Check Memory Usage,文章对 free, vmstat,top , gnome-system-monitor等命令有一些介绍

(9)Console Monitoring Tools for SUSE Linux,对top,free,uptime,pmap,smartctl,iostat,strace等命令有所介绍,并且介绍的比较详细,目前只是粗略的看了一下,有时间还要再看看。 

(10)Solaris 9 Enhanced pmap,比较详细的介绍了pmap的应用,不过是基于Solaris 9的

目录
相关文章
|
1月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
169 2
|
13天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
42 4
linux进程管理万字详解!!!
|
4天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
38 8
|
10天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
12天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
45 4
|
13天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
15天前
|
消息中间件 存储 Linux
|
16天前
|
存储 缓存 监控
|
21天前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
22 1
|
1月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
20 1