内存

1、核心概念

物理内存:就是系统硬件提供的内存大小,是真正的内存,一般叫做内存条,是与CPU直接交换数据的内部存储器,也叫主存(内存)。

虚拟内存:相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。Linux会在物理内存不足时,使用虚拟内存,内核会把暂时不用的内存块信息写到虚拟内存,这样物理内存就得到了释放,这块儿内存就可以用于其他目的,而需要用到这些内容的时候,这些信息就会被重新从虚拟内存读入物理内存。

一般来说,如果系统要用到了虚拟内存,那表明系统的内存资源存在瓶颈了。

共享内存:就是多个进程间共同地使用同一物理内存空间,它是通过将同一段物理内存映射到不同进程的虚拟空间来实现的,是进程间通信中最简单的方式之一。

2.命令查看系统内存和进程内存

【系统内存】通常使用free命令查看操作系统整体的内存使用状况,如下是centos7的示意图。

 

 buff/cache:被buffer和cache使用的物理内存大小。

buffers是指用来给块设备做的缓冲大小(块设备的读写缓冲区),它只记录文件系统的metadata以及tracking in-flight pages。

cached是作为page cache的内存,文件系统的cache。你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓冲,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。其实这缓冲内存(Cache Memory)在你需要使用内存的时候回自动释放,所以你不必担心没有内存可用。

available:还可以被用用程序使用的物理内存大小。

强调:不是free很少了就代表内存不足了!!!

在Linux中经常发现空闲的内存很少,似乎所有的内存都被消耗殆尽了,表面上看是内存不够用了,很多新手看到内存被“消耗殆尽”非常紧张,其实这个是因为Linux系统将空闲的内存用来做磁盘文件数据的缓存。这个导致你的系统看起来处于内存非常紧急的状况。但是实际上不是这样。这个区别于Windows的内存管理。Linux会充分利用空闲的内存来做cached&buffers。

在 上面的centos7中的free 命令的输出中,有一个 available 列, available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,真正还可以用的内存是available包括free 、部分的buffer、  部分的cache。

评判标准:

  应用程序可用内存/系统物理内存>80%时,表示系统内存资源非常充足,不影响系统性能。

  应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存。

  20%<应用程序可用内存/系统物理内存<80%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能。

【进程内存】

在知道了系统如果存在内存资源瓶颈后,如何进一步定位到底是哪个进程导致的内存问题呢?通常采用top和ps aux命令即可。

top命令,输出如下

Mem:1882000 total,822160 used,并不是代表你的应用程序已经使用了822160的内存,这里包含了:应用内存+缓冲+缓存的内存的。

所以不能简单的通过这个来评判系统内存资源是否充足。

VIRT:进程占用的虚拟内存值。

VIRT=SWAP+RES

虚拟内存是一个假象的内存空间,在程序运行过程中虚拟内存空间中需要被访问的部分会被映射到物理内存空间中。

虚拟内存空间大只能表示程序运行过程中可访问的空间比较大,不代表物理内存空间占用也大。

注意:这里的虚拟内存和最上面介绍的使用磁盘作为swap的虚拟内存是不一样的概念,注意区别!

RES:进程占用的物理内存值。

RES=CODE+DATA

CODE可执行代码占用的物理内存大小,单位kb

DATA  可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb  

RES就是进程实实在在占用的物理内存。一般我们所讲的进程占用了多少内存,其实就是说的占用了多少驻留内存而不是多少虚拟内存。SHR:进程使用的共享内存值,譬如一些外部动态库(.so) 

所以某个进程占用的内存除了和别的进程共享的内存之外就是自己的独占内存了,要计算进程独占内存的大小只要用RES的值减去SHR值即可。

 %MEM:该进程占用的物理内存和总内存的百分比。 %MEM这一列的值加起来会大于100呢?这个是因为这里计算的时候包含了共享内存的缘故,另外由于共享内存的缘故,你看到进程使用VIRT或RES都非常高。由于大部分的物理内存通常在多个应用程序之间共享,将各进程的RES值相加,通常会超出整个系统的内存消耗,这是因为RES中包含了各进程间共享的内存。 

 

 ps aux方式可以查看进程的内存消耗情况。

VSZ(或VSS)列 表示,程序占用了多少虚拟内存,类似top的VIRT列。

RSS列 表示, 程序占用了多少物理内存,类似top的RES列。 

所以平时看到很多内存相关的英文缩写,给人感觉好复杂,其实很多都指的是同一个东西。 另外,可以使用一下命令查使用内存最多的5个进程ps -aux | sort -k4nr | head 5

3、知识扩展

1、占用内存的测量测量一个进程占用了多少内存,linux为我们提供了一个很方便的方法,/proc目录为我们提供了所有的信息,实际上top等工具也通过这里来获取相应的信息。所以如果是自己写代码的方式完全可以从这些源头获取数据。/proc/meminfo 机器的内存使用信息/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。/proc/pid/statm 进程所占用的内存 

2、释放系统缓存情况说明:centos系统,buff/cache占用过高,导致服务器内存居高不下,但是通过top查看系统进程并无过多占用内存。处理步骤:

1)执行sync命令;

sync

2)执行释放内存命令:

echo 3 > /proc/sys/vm/drop_caches

命令解释:

sync 指令会将存于 buffer 中的资料强制写入硬盘中,避免丢失数据。
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象

(包括目录项缓存和inode缓存)。

echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。

 

posted on 2020-07-20 17:29  星空6  阅读(485)  评论(0编辑  收藏  举报

导航