菜单

Linux 查看过程消耗内存意况总计

2018年12月19日 - LINUX

 

LINUX进程内存占用查看方
(1)top
能够平昔拔取top命令后,查看%MEM的情节。可以接纳以进程查看或依据用户查看,如想查oracle用户之长麦纳麦存以状态的讲话能够使如下的命:
$ top -u oracle

每当Linux中,有无数令或工具查看内存以意况,前几天我们来瞧哪查看过程消耗、占用的内存意况,Linux的内存管理及系概念一经较Windows复杂一些。以前,我们用精晓一下Linux系统下边关于内存的专用名词和专业术语概念:

(2)pmap
可按照进程查看过程有关新闻占用的内存情状,(进程号可以通过ps查看)如下所示:
$ pmap -d 14596

 

 

 

(3)ps
正如例所示:
$ ps -e -o ‘pid,comm,args,pcpu,rsz,vsz,stime,user,uid’
其中rsz是是实际上内存
$ ps -e -o ‘pid,comm,args,pcpu,rsz,vsz,stime,user,uid’ | grep oracle |
sort -nrk5
内rsz为实际内存,上例实现准内存排序,由好到有些

物理内存和虚拟内存

 

 

(4)free -m

大体内存:就是系硬件提供的内存大小,是实在的内存,一般叫内存条。也被随机存取存储器(random
access memory,RAM)又曰“随机存储器”,是与CPU直接交换数据的里存储器,也为主存(内存)。

查内存以状态

 

 

虚拟内存:相对于物理内存,在Linux下还出一个虚拟内存的概念,虚拟内存就是为了满足物理内存的贫使提出的策略,它是行使磁盘空间虚拟出的同样片逻辑内存,用作虚拟内存的磁盘空间被称交流空间(Swap
Space)。Linux会在大体内存不足时,使用虚拟内存,内核会将小不要的外存块音信写到虚拟内存,这样大体内存就拿走了放,这块儿内存就足以用于其他目的,而需要用到那么些情节之上,那个信就是会让再一次打虚拟内存读入物理内存。

 

 

Linux的buffers与cached

 

在Linux中时时发现没事的内存很少,似乎具有的内存都于吃殆尽了,表面上看是内存不够用了,很多新手看到内存为“消耗了”分外令人不安,其实是是为Linux系统将空闲之外存用来开磁盘文件数量的休息存。这么些导致您的系看起处于内存异常迫切的情景。可是事实上不是这般。这么些分为Windows的内存管理。Linux会利用空暇的内存来进行cached
& buffers。

 

 

buffers是乘用来叫块设备进行的苏冲大小(块设备的读写缓冲区),它仅仅记录文件系统的metadata以及
tracking in-flight pages.

 

Buffers
are associated with a specific block device, and cover caching of
filesystem metadata as well as tracking in-flight pages. The cache only
contains parked file data. That is, the buffers remember what’s in
directories, what file permissions are, and keep track of what memory is
being written from or read to for a particular block device. The cache
only contains the contents of the files themselves.

 

  

cached是当做page
cache的内存,
文件系统的cache。你念写文件之时节,Linux内核为了增强读写性能和速,会用文件于内存中开展缓存,这有的内存就是Cache
Memory(缓存内存)。即便你的程序运行截至晚,Cache
Memory也不汇合活动释放。这便谋面招您于Linux系统中先后往往读写文件后,你谋面发觉可用物理内存会很少。其实这缓存内存(Cache
Memory)在公需要动用内存的时节会自动释放,所以你不用担心没有内存可用

 

Cached
is the size of the page cache. Buffers is the size of in-memory block
I/O buffers. Cached matters; Buffers is largely irrelevant.

 

Cached
is the size of the Linux page cache, minus the memory in the swap cache,
which is represented by SwapCached (thus the total page cache size is
Cached + SwapCached). Linux performs all file I/O through the page
cache. Writes are implemented as simply marking as dirty the
corresponding pages in the page cache; the flusher threads then
periodically write back to disk any dirty pages. Reads are implemented
by returning the data from the page cache; if the data is not yet in the
cache, it is first populated. On a modern Linux system, Cached can
easily be several gigabytes. It will shrink only in response to memory
pressure. The system will purge the page cache along with swapping data
out to disk to make available more memory as needed.

Buffers
are in-memory block I/O buffers. They are relatively short-lived. Prior
to Linux kernel version 2.4, Linux had separate page and buffer caches.
Since 2.4, the page and buffer cache are unified and Buffers is raw disk
blocks not represented in the page cache—i.e., not file data. The
Buffers metric is thus of minimal importance. On most systems, Buffers
is often only tens of megabytes.

 

 

Linux共享内存

 

共享内存是过程之中通信中极简便的点子有。共享内存允许两独或重复多进程看同一块内存,就不啻
malloc()函数为不同进程重返了靠于与一个大体内存区域的指针。当一个经过改变了这块地点被之始末之时段,另外进程都谋面发现到之。其实所谓共享内存,就是大半只经过之中共地使用相同段物理内存空间,它是透过将同样段子物理内存映射到不同进程的杜撰空间来实现之。由于映射到不同进程的虚拟空间被,不同进程可以平素选用,不待像音信队列这样举办复制,所以共享内存的频率特别高。共享内存可以由此mmap()映射普通文书编制来实现,也足以System
V共享内存机制来兑现,System
V是经过照射特殊文件系统shm中的文件落实进程之中的共享内存通信,也就是说每个共享内存区域对许相当文件系统shm中之一个文书。

 

 

其余,我们尚非得领会RSS、PSS、USS等息息相关概念:

 

     VSS

Virtual Set Size 虚拟耗用内存(包含一块享库占用的内存)

     

RSS –
Resident Set Size 事实上行使物理内存(包含一块享库占用的内存)

     

PSS –
Proportional Set Size
实际应用的物理内存(比例分红共享库占用的内存)

     

USS –
Unique Set Size 进程独自占用的大体内存(不含一块享库占用的内存)

 

RSS(Resident
set
size),使用top命令可以查询到,是极常用的内存目的,表示经过占用的大体内存大小。然则,将每进程的RSS值相加,经常会胜出整个体系的内存消耗,这是因RSS中包含了各进程之中共享的内存。

 

PSS(Proportional
set
size)所有应用有旅享库的主次都分该联合享库占用的内存时,每个过程占用的内存。分明有进程的PSS之与不畏是系统的内存使用量。它会合重确切一些,它用共享内存的轻重举行平均后,再分摊到每进程上。

 

USS(Unique
set size
)进程独自占用的内存,它是PSS中自己的一些,它只是算了经过独自占用的内存大小,不包含其他共享的部分。

     

          

之所以下介绍的下令,有些查看过程的虚拟内存使用,有些是查过程的RSS或实际物理内存。在描述的上,我们会标注这多少个音讯。

 

 

 

top命令查看

 

推行top命令后,执行SHIFT
+F ,能够接纳按照某列排序,例如选拔n后,就相会按字段%MEM排序

 

图片 1

 

 

自为堪下shift+m
或深写键M
让top命令按字段%MEM来排序,当然你吗可以遵照VIRT(虚拟内存)、SWAP(进程使的SWAP空间)、RES(实际使用物理内存,当然这里由于涉及共享内存缘故,你看到底实际上内存十分很)

 

 

%MEM
— Memory usage (RES)

 

     A task’s currently
used share of available physical memory

     

VIRT
— virtual memory 

   

    The  total  amount  of virtual memory
used by the task. 
It includes all code, data and shared libraries plus pages that
have been swapped out. (Note: you can define the STATSIZE=1 environment
variable and the VIRT will be calculated from the /proc/#/state VmSize
field.)

 

    VIRT = SWAP +
RES

 

SWAP  —  Swapped size
(kb)

 

   The swapped out
portion of a task’s
total virtual memory image.

 

RES  —  Resident size
(kb)

       

    RES = CODE +
DATA.

 

         

 

是否有人会当意外,为啥%MEM这无异排的值加起来会压倒100吧?
这一个是以此地总计的时刻包含了共享内存的由来,此外是因为共享内存的由来,你看看进程使VIRT或RES都深大。由于大部分的情理内存平时在多单应用程序之间共享,名吧实际应用物理内存(RSS,对承诺top命令中的RES)的这一个正式的内存耗用衡量目的会大大高估内存耗用状态。

 

图片 2

 

 

 

ps命令查看

 

 

 

运ps命令找有占用内存资源最多之20只经过(数量得以肆意设置)

 

 

# ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

oracle   32147 11.0 51.2 13252080 12666320 ?   Rs   Aug24 163:16 ora_s000_SCM2

oracle   32149 14.2 50.9 13250344 12594264 ?   Ss   Aug24 210:41 ora_s001_SCM2

oracle   32153  4.2 49.6 13250820 12279432 ?   Ss   Aug24  62:27 ora_s003_SCM2

oracle   32155  2.5 48.6 13250268 12040732 ?   Ss   Aug24  38:21 ora_s004_SCM2

oracle   32157  1.2 44.5 13250296 11011708 ?   Ss   Aug24  18:31 ora_s005_SCM2

oracle   32151  2.7 39.7 13350436 9829944 ?    Ss   Aug24  41:18 ora_s002_SCM2

oracle   32159  0.5 38.9 13250704 9625764 ?    Ss   Aug24   8:18 ora_s006_SCM2

oracle   32161  0.2 26.3 13250668 6507244 ?    Ss   Aug24   3:38 ora_s007_SCM2

oracle   32129  0.0 25.5 13299084 6324644 ?    Ss   Aug24   1:25 ora_dbw0_SCM2

oracle   32181  0.0 15.8 13250152 3913260 ?    Ss   Aug24   0:56 ora_s017_SCM2

oracle   32145  2.7 15.3 13255256 3786456 ?    Ss   Aug24  40:11 ora_d000_SCM2

oracle   32127  0.0 15.2 13248996 3762860 ?    Ss   Aug24   0:05 ora_mman_SCM2

oracle   32163  0.0 14.2 13250108 3525160 ?    Ss   Aug24   1:04 ora_s008_SCM2

oracle   32165  0.0  8.1 13250172 2007704 ?    Ss   Aug24   0:37 ora_s009_SCM2

oracle   32169  0.0  6.6 13250060 1656864 ?    Ss   Aug24   0:08 ora_s011_SCM2

oracle   32177  0.0  6.0 13250148 1498760 ?    Ss   Aug24   0:12 ora_s015_SCM2

oracle   32187  0.0  5.1 13250084 1267384 ?    Ss   Aug24   0:06 ora_s020_SCM2

oracle   32179  0.0  5.1 13250584 1280156 ?    Ss   Aug24   0:05 ora_s016_SCM2

oracle   32167  0.0  5.0 13250060 1248668 ?    Ss   Aug24   0:08 ora_s010_SCM2

oracle   32175  0.0  3.4 13250596 857380 ?     Ss   Aug24   0:03 ora_s014_SCM2

 

 

#ps
-eo pmem,pcpu,rss,vsize,args | sort -k 1 -n -r | less

 

翻看过程占用的其实物理内存(与smem看到实际物理内存大小有出入,这里解释一下:SIZE:
进程使的地点空间, 假若进程映射了100M的内存,
进程的地址空间将报为100M内存. 事实上,
这些尺寸非是一个主次实际用的内存数.
所以这里看的内存跟smem看到底大小来出入)

 

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |cut -d "" -f2 | cut -d "-" -f1

 

图片 3

 

 

ps
aux  | awk
‘{print $6/1024 ” MB\t\t” $11}’  | sort -n

 

 

 

 

smem命令查看

 

 

有关smem命令,这里不做牵线,直接参考链接Linux监控工具介绍体系——smem

 

 

#smem
-rs pss

 

图片 4

** 

** 

** 

** 

pmap命令查看

 

 

#
ps -ef | grep tomcat

#
pmap 32341

 

图片 5

 

# pmap -x  32341

 

The
-x option can be used to provide information about the memory allocation
and mapping types per mapping. The amount of resident, non-shared
anonymous, and locked memory is shown for each mapping。

 

图片 6

 

 

 

 

python脚本查看

 

 

网上有只python脚论总计程序要进程的内存以情形,地址位于https://raw.githubusercontent.com/pixelb/ps\_mem/master/ps\_mem.py

 

python
ps_mem.py

 

图片 7

 

 

[root@mylnx03 ~]# python ps_mem.py -h

Usage: ps_mem [OPTION]...

Show program core memory usage

 

  -h, -help                   Show this help

  -p <pid>[,pid2,...pidN]     Only show memory usage PIDs in the specified list

  -s, --split-args            Show and separate by, all command line arguments

  -t, --total                 Show only the total value

  -d, --discriminate-by-pid   Show by process rather than by program

  -S, --swap                  Show swap information

  -w <N>                      Measure and show process memory every N seconds

[root@mylnx03 ~]# python ps_mem.py  -p 32341

 Private  +   Shared  =  RAM used       Program

 

411.2 MiB + 184.0 KiB = 411.4 MiB       java

---------------------------------

                        411.4 MiB

=================================

 

参考资料:

 

 

https://stackoverflow.com/questions/131303/how-to-measure-actual-memory-usage-of-an-application-or-process

http://www.cnblogs.com/kerrycode/p/5079319.html

https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图