linux统计所有进程总共占用多少内存?

xiaoxiao2021-02-28  62

原文地址:http://linuxperf.com/?p=143 很多人通过累加 “ps  aux” 命令显示的 RSS 列来统计全部进程总共占用的物理内存大小,这是不对的。RSS(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方法会重复计算共享内存,得到的结果是偏大的。 正确的方法是累加 /proc/[1-9]*/smaps 中的 Pss 。/proc/<pid>/smaps 包含了进程的每一个内存映射的统计值,详见proc(5)的手册页。Pss(Proportional Set Size)把共享内存的Rss进行了平均分摊,比如某一块100MB的内存被10个进程共享,那么每个进程就摊到10MB。这样,累加Pss就不会导致共享内存被重复计算了。 命令如下: $ grep Pss /proc/[1-9]*/smaps | awk ‘{total+=$2}; END {print total}’ 需要注意的是,全部进程占用的内存并不等于 free 命令所显示的 “used memory”,因为“used memory”不仅包含了进程所占用的内存,还包含cache/buffer以及kernel动态分配的内存等等。 # grep Pss /proc/[1-9]*/smaps | awk '{total+=$2}; END {print total}' 2296454   # free -k               total        used        free      shared  buff/cache   available Mem:        3809036     2441052      248504      183808     1119480      861748 Swap:       4063228      866856     3196372 有人提出【MemTotal = MemFree + buff/cache + slab + 全部进程占用的内存】。这是不对的,原因之一是:进程占用的内存包含了一部分page cache,换句话说,就是进程占用的内存与page cache发生了重叠。比如进程的mmap文件映射同时也统计在page cache中。我们用一个实验来证明,下面的小程序调用mmap()映射了一个大文件,等我们检查内存状态之后,再读取文件使它真正进入内存,我们将最后的内存状态与之前的进行对比: #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>   intmain() {     char*addr,c;     intfd,i;     structstatsb;     size_tlength;     ssize_ts;       fd=open("/tmp/BIGFILE",O_RDONLY);     if(fd==-1){         fprintf(stderr,"open failed\n");         exit(EXIT_FAILURE);     }       if(fstat(fd,&sb)==-1)          /* To obtain file size */     {         fprintf(stderr,"fstat failed\n");         exit(EXIT_FAILURE);     }       length=sb.st_size;       addr=mmap(NULL,length,PROT_READ,MAP_PRIVATE,fd,0);       if(addr==MAP_FAILED){         fprintf(stderr,"mmap failed\n");         exit(EXIT_FAILURE);     }       printf("After check /proc/meminfo and /proc/<pid>/smaps\nPlease press any key to scan the mmap...\n");     getchar();       for(i=0;i<length;i++){         c=addr[i];     }       printf("After check /proc/meminfo and /proc/<pid>/smaps\nPlease press any key to exit...\n");     getchar();       exit(EXIT_SUCCESS); } 测试结果是这样的: // mmap之后,读取文件之前: # less /proc/meminfo ... Cached:          859888kB ...   # less /proc/6892/smaps ... 7fab335f8000-7fab35f7a000r--p0000000008:01202                        /tmp/BIGFILE Size:              42504kB Rss:                  0kB Pss:                  0kB ...   // 读取文件之后: // 注意cache和进程的Rss/Pss同时增大 # less /proc/meminfo ... Cached:          902396kB ...   # less /proc/6892/smaps ... 7fab335f8000-7fab35f7a000r--p0000000008:01202                        /tmp/BIGFILE Size:              42504kB Rss:              42504kB Pss:              42504kB ... 可以看到,page cache的大小和进程的/RssPss同时变大了,而且增加的大小也吻合,证明进程占用的内存与page cache的统计是有重叠的。

转载请注明原文地址: https://www.6miu.com/read-77836.html

最新回复(0)