记一次内存占用过高的分析

客户给我反应,他们的PostgreSQL服务器的内存占用率高达99%,只有一点内存可以分配了,让我帮忙看看。

 

没有问题,虽然剩余内存很少了,只有500M左右,但是其中cache的内存很多,应用可分配的内存依然有50G,不用担心。

 

 

首先看看/proc/meminfo内容:

xxxx:~ # cat /proc/meminfo 

MemTotal:       65786904 kB    所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)
MemFree:          515316 kB    LowFree与HighFree的总和,被系统留着未使用的内存  这里503M左右
MemAvailable:   47765096 kB   应用可分配内存 echo "47765096/1024/1024"|bc = 45G
Buffers:            2180 kB   用来给文件做缓冲大小
Cached:         46499916 kB   被高速缓冲存储器(cache memory)用的内存的大小(等于 diskcache minus SwapCache )
SwapCached:          456 kB   被高速缓冲存储器(cache memory)用的交换空间的大小,已经被交换出来的内存,但仍然被存放在swapfile中。用来在需 要的时候很快的被替换而不需要再次打开I/O端口。
Active:         35838856 kB   在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用.
Inactive:       22011252 kB   在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径.

 

 再看看free:

xxxx:~ # free
             total       	used       		free       shared      buffers    cached
Mem:      65786904     65271240            515664     4846584       2180   52825696
-/+ buffers/cache:     12443364   	       53343540
Swap:     16779260      5324                16773936


第1行 Mem: total:表示物理内存总量。
used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free:未被分配的内存。
shared:共享内存,一般系统不会用到,这里也不讨论。
buffers:系统分配但未被使用的buffers 数量。
cached:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。 total = used + free 第2行 -/+ buffers/cached: used:也就是第一行中的used - buffers-cached 也是实际使用的内存总量。 
free:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。 free 2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行
echo "(515664+2180+52825696)"|bc=53343540=50G

 

Linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free -m方式查看内存占用情况(兆为单位)。而系统实际可用内存是不是free部分呢,不是的,系统实际内存占用以及可用内存有如下几个加减法: 

  • used=total-free  total=used+free
  • 实际内存占用:used-buffers-cached 即 total-free-buffers-cached
  • 实际可用内存:buffers+cached+free

                   total       used       free     shared    buffers     cached
Mem:            128        119           8          0            1               22
-/+ buffers/cache:        95          32
swap:          255            0         255 

第1行Mem数据: 

  • total 内存总数: 128 
  • used 已经使用的内存数: 119 
  • free 空闲的内存数: 8 
  • shared 当前已经废弃不用,总是0 
  • buffers Buffer Cache内存数: 1 
  • cached Page Cache内存数: 22

第2行-/+ buffers/cache: 

  • -buffers/cache 的内存数:95 (等于第1行的 used - buffers - cached) 
  • +buffers/cache 的内存数: 32 (等于第1行的 free + buffers + cached)

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。 

第三行数据是交换分区SWAP的,也就是我们通常所说的虚拟内存。 

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。 

感兴趣的可以进一步参考文件/proc/meminfo,free命令就是根据它的信息生成的。free命令的源码可从procps-xxx-.src.rpm获取,xxx为版本号,比如procps-3.2.3-5.3.src.rpm。 

系统管理员必须维护他们服务器的健康运行。其中一个重要的部分就是内存。当服务器内存使用率过高时,它会降低服务器的性能。Linux有一个称为 free 的工具,来监控内存使用率。

 

 

 

与上面/proc/meminfo中的MemAvailable:   47765096 kB有差别,大概5G左右的误差,该依照谁的?

 

再看看top:

xxxx:~ # top 

top - 14:31:15 up 31 days, 20:12,  3 users,  load average: 0.43, 0.42, 0.38
Tasks: 927 total,   1 running, 925 sleeping,   0 stopped,   1 zombie
%Cpu(s):  1.5 us,  1.1 sy,  0.0 ni, 97.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  65786904 total, 65275224 used,   511680 free,     2180 buffers
KiB Swap: 16779260 total,     5324 used, 16773936 free. 52825968 cached Mem

  

从top中也可以看到大概,虽然free很少,但是cached Mem很大,swap很少,从侧面反应内存还是够的,所以,free和top的结果比较一致,memento中的则有一点差距,我们来看看MemAvailable的解释:

MemAvailable = MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2)) 

file占用的内存是可以释放的,但是释放的过多,会导致swap发生,减去部分内存的目的是避免swap 

检查/proc/meminfo文件,通过将“MemFree + Buffers+ Cached”相加,预估有多少可用内存,这在十年前是可以,但是在今天肯定是不对的。
因为缓存包含存不能释放的page cache,例如shared memory segments、tmpfs、ramfs,它不包括可收回的slab内存,比如在大多数空闲的系统中,存在很多文件时,它会占用大量的系统内存。在系统没有发生交换时,预估需要多少available内存才可以启动新的应用程序。这个available字段不同于cache或free字段所提供的数据,它除了要考虑到page cache,还要考虑到当项目在使用时,并不是所有的slabs都能被回收这一情况。

 

所以,更加靠谱的是MEMAvailable,客户的内存完全不用担心,Linux的内存有个特点,只要内存够,就不会将部分内存交换出来,这样来提高系统性能。就算内存满了,也会优先往swap中交换。当然数据库应用应当尽量减少内存的交换,尤其是频繁的swap交换时,应当考虑优化服务器或者数据库参数,提高系统性能。

 

posted @ 2018-12-11 15:23  狂神314  阅读(2455)  评论(0编辑  收藏  举报