在Linux中,有许多命令或工具可以查看内存使用情况。今天,我们将看一下如何查看进程消耗和占用的内存。 Linux的内存管理和相关概念比Windows复杂。在此之前,我们需要了解与Linux系统中的内存相关的特定术语和技术术语概念:
物理内存:它是系统硬件提供的内存大小。它是真实的内存,通常称为记忆棒。也称为随机存取存储器(random access memory,RAM),也称为“随机存取存储器”,是直接与CPU交换数据的内部存储器,也称为主存储器(内存)。
虚拟内存:与物理内存相比,Linux下有一个虚拟内存的概念。虚拟内存是一种为应对物理内存不足而提出的策略。它是一块逻辑内存,通过使用磁盘空间进行虚拟化并用作。虚拟内存的磁盘空间称为交换空间(Swap Space)。当物理内存不足时,Linux将使用虚拟内存。内核会将临时未使用的内存块信息写入虚拟内存,以便释放物理内存。该内存可以用于其他目的,这是必需的。当内容存在时,信息将再次从虚拟内存中读取到物理内存中。
Linux缓冲区和缓存
通常在Linux中发现可用内存很少。似乎所有的内存都用光了。从表面上看,内存不足。许多新手在看到内存“耗尽”时会非常紧张。实际上,这是因为Linux系统使用空闲内存作为磁盘文件数据的缓存。这会导致您的系统似乎处于内存严重不足的情况。但这种情况并非如此。这与Windows的内存管理不同。 Linux将把可用内存用于缓存和缓冲区。
缓冲区是指用于块设备的缓冲区大小(块设备的读取和写入缓冲区)。它仅记录文件系统的元数据并跟踪运行中的页面。
缓冲区与特定的块设备关联,并且覆盖文件系统元数据的缓存以及跟踪运行中的页面。缓存仅包含驻留的文件数据。也就是说,缓冲区记住目录中的内容,文件权限,并跟踪正在为特定块设备写入或读取的内存。缓存仅包含文件本身的内容。
Cached用作页面缓存(文件系统的缓存)的内存。当您读写文件时,Linux内核会将文件缓存在内存中,以提高读写性能和速度。内存的这部分是高速缓存。即使您的程序完成后,缓存也不会自动释放。这将导致您在Linux系统中频繁读写文件,您会发现可用的物理内存会很小。实际上,当您需要使用缓存时,缓存会自动释放,因此您不必担心没有可用的内存
Cached是页面缓存的大小。缓冲区是内存中块I / O缓冲区的大小。缓存的事项;缓冲区在很大程度上无关紧要。
Cached是Linux页面缓存的大小减去交换缓存中的内存,它由SwapCached表示(因此总页面缓存大小为Cached + SwapCached)。 Linux通过页面缓存执行所有文件I / O。写操作的实现是简单地将页面高速缓存中的相应页面标记为脏。然后,刷新程序线程会定期将所有脏页写回到磁盘。通过从页面缓存中返回数据来实现读取。如果数据尚未存储在高速缓存中,则将首先填充该数据。在现代Linux系统上,“缓存”可以轻松达到数GB。它仅在响应内存压力时才会收缩。系统将清除页面缓存,并将数据交换到磁盘上,以根据需要提供更多的内存。
缓冲区是内存中的块I / O缓冲区。他们是相对短暂的。在Linux内核版本2. 4之前,Linux具有单独的页面和缓冲区高速缓存。从2. 4开始,页面和缓冲区高速缓存是统一的,而缓冲区是页面高速缓存中未表示的原始磁盘块,即不是文件数据。因此,“缓冲区”度量标准具有最低的重要性。在大多数系统上,缓冲区通常只有几十兆字节。
Linux共享内存
共享内存是在进程之间进行通信的最简单方法之一。共享内存允许两个或多个进程访问同一块内存,就像malloc()函数将指向同一物理内存区域的指针返回到不同进程一样。当一个进程更改该地址的内容时,其他进程将意识到这一点。实际上,所谓的共享内存是指多个进程之间对相同物理内存空间的共同使用。它是通过将相同的物理内存映射到不同进程的虚拟空间来实现的。由于它映射到不同进程的虚拟空间,因此可以直接使用不同进程,并且不需要像消息队列一样进行复制,因此共享内存的效率非常高。共享内存可以通过mmap()映射公用文件机制或System V共享内存机制来实现。系统V通过映射特殊文件系统shm中的文件来实现进程之间的共享内存通信,也就是说,每个共享的内存区域对应于特殊文件系统shm中的文件。
此外,我们还必须了解RSS,PSS,USS和其他相关概念:
VSS –虚拟集大小的虚拟内存消耗(包括共享库占用的内存)
RSS –居民集大小实际使用的物理内存(包括共享库占用的内存)
PSS –实际使用的物理内存的比例集大小(共享库占用的内存的比例分配)
USS –仅由唯一集大小进程占用的物理内存(不包括共享库占用的内存)
可以使用top命令查询的
RSS(常驻集大小)是最常用的内存指示符,它指示进程占用的物理内存的大小。但是,添加每个进程的RSS值通常会超出整个系统的内存消耗,因为RSS包含进程之间共享的内存。
PSS(比例设置大小)当所有使用共享库的程序均等地划分共享库占用的内存时,即每个进程占用的内存。显然,所有进程的PSS之和就是系统的内存使用量。它将更加准确,它将平均共享内存的大小,然后将其分配给每个进程。
仅USS(唯一集大小)进程占用的内存是PSS自身的一部分。它仅计算单独进程占用的内存大小,而没有任何共享部分。
因此,下面介绍的一些命令用于查看进程的虚拟内存使用情况,而某些命令用于查看进程的RSS或实际物理内存。告诉时,我们会标记此信息。
顶部命令视图
执行完top命令后,执行SHIFT + F,您可以选择按某一列排序,例如,选择n后,将按%MEM字段进行排序

当然,您还可以使用shift + m或大写键M通过%MEM字段对顶部命令进行排序。当然,您还可以按VIRT(虚拟内存),SWAP(进程使用的SWAP空间),RES(使用的实际物理内存),当然,由于涉及共享内存,因此您看到的实际内存非常大)
%MEM-内存使用率(RES)
任务当前使用的可用物理内存份额
VIRT-虚拟内存
任务使用的虚拟内存总量。它包括所有代码,数据和共享库以及已换出的页面。 (注意:您可以定义STATSIZE = 1环境变量,VIRT将从/ proc /#/ state VmSize字段中计算出来。)
VIRT = SWAP + RES
SWAP-交换大小(kb)
任务总虚拟内存映像中换出的部分。
RES-居民人数(kb)
RES =代码+数据。
有人想知道为什么%MEM列中的值加起来大于100吗?这是因为共享内存包含在计算中。此外,由于共享内存,您会看到该进程使用VIRT或RES的频率很高。由于大多数物理内存通常在多个应用程序之间共享,因此称为实际物理内存(RSS,对应于top命令中的RES)的标准内存消耗量度将大大高估内存消耗。

ps命令视图
使用ps命令查找占用内存最多的20个进程(可以任意设置数量)
# ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20USER 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 32175 0.0 3.4 13250596 857380 ? Ss Aug24 0:03 ora_s014_SCM2
#ps -eo pmem,u,rss,vsize,args |排序-k 1 -n -r |少
检查该进程占用的实际物理内存(实际物理内存大小与smem不同,请在此处说明:SIZE:该进程使用的地址空间,如果该进程映射100M的内存,则该地址空间进程将报告为100M内存。实际上,此大小不是程序实际使用的内存量。因此,此处显示的内存与smem看到的内存大小不同
ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf(".2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |cut -d "" -f2 | cut -d "-" -f1

ps aux | awk'{print $ 6/1024“ MB \ t \ t” $ 11}''|排序-n
Smem命令视图
关于smem命令,我不会在这里进行介绍,只需参考链接Linux监控工具介绍series-smem
#smem -rs pss

pmap命令视图
#ps -ef | grep tomcat
#pmap 32341


#pmap -x 32341
-x选项可用于提供有关每个映射的内存分配和映射类型的信息。每个映射都会显示常驻,非共享匿名和锁定内存的数量。

Python脚本视图
Internet上有一个python脚本来计算程序或进程的内存使用情况。地址位于
python ps_mem.py

[root@mylnx03 ~]# python ps_mem.py -hUsage: ps_mem [OPTION]...
Show program core memory usage
-h, -help Show this help
-p[,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
-wMeasure and show process memory every N seconds
[root@mylnx03 ~]# python ps_mem.py -p 32341Private + Shared = RAM used Program
411.2 MiB + 184.0 KiB = 411.4 MiB java
---------------------------------
411.4 MiB
=================================
参考资料:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-372796-1.html
最简单证实的方式
快去操谢作死家的女人去
美国永远是世界爱好和平人民的公敌