linux top中rss和res的差别

linux top中rss和res的差别,第1张

pa aux和free中的内存概念,很复杂, http://blogread.cn/it/article/6264?f=wb#original中介绍到RSS.resident set size 也就是每个进程用了具体的多少页的内存。由于linux系统采用的是虚拟内存,进程的代码,库,堆和栈使用的内存都会消耗内存,但是申请出来的内存,只要没真正touch过,是不算的,因为没有真正为之分配物理页面。RES:resident memory usage 即应用程序实际使用的内存,但未包含SWAP,以及未包含共享的内存

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

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

(2)。

top命令也可以其中VIRT(或VSS)列表示,程序占用了多少虚拟内存。

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

同psaux中的RSS列2.在linux下,查看当前系统占用了多少内存,一般的命令是free其中,free就是系统还有多少内存可以使用。

但由于linux系统对内存使用有一个原则,就是,内存是宝贵的,能使用多少就使用多少。

所以,linux会把已经调用过的包缓存起来,放在内存里。

这样,实际上,可以使用的内存,就可以理解为,free+buffers+cached3.当了解完这些命令以后,再去使用psaux命令去查看的时候,会发现一个奇怪的现象。

所有的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中了。

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

当然,linux的内存使用机制很复杂,不是一句两句能说清楚的。

这里只是简单的说明了一下,psaux中的RSS值,并不能真实反映物理内存的使用情况。

4.如果查看更详细的内存使用情况,可用以下几种方法,或者几种方法结合使用:这几种方法,都需要root账户的权限(1)。

pmap-d$pid$pid是正在运行的程序的pid(2)。

cat/proc/$pid/smapssmaps的数据比较详细,可简单的归纳一下,归纳的命令如下: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(valinlist)printval,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()。

将两者的值相减,得到的值,应该是一个相对比较准确的,内存占用数量了。

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

一个用户空间的进程,究竟消耗了多少内存。

首先要名确,一个application消耗的内存,一定指得是用户空间的内存。

3g - 4g 的kernal space是共享的,每个进程都有自己用户空间0 - 3G,只要通过系统调用就可以陷入kernal space, 就会从x86的3 rings升级到0 rings, 即陷入到内核空间。

app 调driver的iocrtrl, dirver 的ioctrl 内部通过调用kmalloc/vmalloc申请的内存并不计算在内,因为是通过内核的api申请的,属于内核消耗的。

vss、rss、pss、uss

pidof a.out

pmap a.out

vma的来源

在linux铁三角(二)有过叙述,这里不再赘述。这里直接上图把

MMU给CPU发送page fault的时候,在硬件中有2个寄存器

是否RSS就代表一个进程真正的内存消耗呢?

三个进程,其中2个Bash, 1 个 cat.

那么对应三张页表,每当切换进程,存储页表的 基地址就会却换,从而切换到不同的地址空间中。

中间的是内存条,通过三张页表瓜分物理内存。

104进程内存消耗:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7512275.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-06
下一篇2023-04-06

发表评论

登录后才能评论

评论列表(0条)

    保存