为何我的LINUX服务器内存利用率很高?正确理解LINUX内存使用机制

Posted blackangeldsf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为何我的LINUX服务器内存利用率很高?正确理解LINUX内存使用机制相关的知识,希望对你有一定的参考价值。

今天有人告诉我说linux服务器上的内存快不够用了,128G的内存,马上要用光了。我吓了一跳,这台服务器上的应用现在负载很小啊,怎么利用率会很高呢。先用ZABBIX看了下,内存剩余空间还是很大的,还有117G的空余啊。然后又登陆到服务器上用再看下:

[[email protected] ~]$ top
top - 11:41:03 up 415 days,  1:06,  2 users,  load average: 0.17, 0.12, 0.28
Tasks: 847 total,   1 running, 846 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  0.7%sy,  0.0%ni, 98.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  132035736k total, 130251764k used,  1783972k free,   679012k buffers
Swap: 16777212k total,   448004k used, 16329208k free, 120309904k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                            
 48069 oracle    20   0 59.1g 299m 213m S  7.2  0.2  23205:25 oracle                                                                                              
  5197 root      RT   0  756m  88m  57m S  3.6  0.1  36032:42 osysmond.bin                                                                                        
  5376 root      RT  -5  693m 154m  63m S  2.3  0.1  11577:02 ologgerd                                                                                            
  5924 grid      -2   0 1306m  14m  12m S  1.6  0.0   9131:12 oracle                                                                                              
 48055 oracle    -2   0 59.0g  17m  15m S  1.6  0.0   9306:15 oracle                                                                                              
  6283 root      20   0  968m  28m  12m S  1.3  0.0   5426:41 orarootagent.bi                                                                                     
  4563 root      20   0 1914m  55m  14m S  1.0  0.0   3451:22 ohasd.bin                                                                                           
 48109 oracle    20   0 59.0g 813m 808m S  1.0  0.6   5880:06 oracle                                                                                              
 86867 root      20   0 2273m 240m  10m S  1.0  0.2 458:42.00 ds_am                                                                                               
146406 oracle    20   0 15568 1844  932 R  1.0  0.0   0:00.22 top                                                                                                 
  5183 root      20   0 1763m  39m  14m S  0.7  0.0   3144:21 orarootagent.bi     

看了MEM项中,果然是利用率很高,free的不多了。再用free命令看下:

[[email protected] ~]$ free
             total       used       free     shared    buffers     cached
Mem:     132035736  130258872    1776864   59092256     679016  120313028
-/+ buffers/cache:    9266828  122768908
Swap:     16777212     448004   16329208
[[email protected]-sjk1 ~]$ 

也是如此。于是乎,翻开万能的度娘,在网上找到了相关资料。在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

以下是原文内容:

最近有个月经问题,老有人问为何开机后,还没有其他服务,mem就被用完了?是不是内存泄露?是否要重启服务?只能说不要看现象,要看本质才能找到问题的根源。
往往给出这样的结果,怀疑内存用了90%:
Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

这样怀疑很普遍,因为很多人用惯了Windows。Windows下,可以使用任务管理器查看当前进程对于内存的消耗情况。在我看来,Windows物理内存总是留下一定的空间,就算此时物理内存有空闲时,也会让某些程序去使用虚拟内存,目的是在Windows下启动新程序时,直接分配空闲的物理内存,这样子新程序启动速度就较快,而Linux则不然。

而在Linux下,使用top命令看到内存占用情况:

Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached


这里的结果显示使用了3.8G的used,占用率达到90%。看看free的结果你还可以对比一下:
$ free -m
total used free shared buffers cached
Mem: 4049 3784 265 0 208 2939
-/+ buffers/cache: 636 3413
Swap: 2588 0 2588

虽然MEM显示了3.7G左右的used,但是(-/+ buffers/cache)减去buffers和cache的结果可以看到,当前进程实际占用内存是636M,而可用空闲(free)内存为3.4G。


可以这么理解:在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

如上面的例子:使用了4G的内存,3.7G被占用,但是buuffer和cached部分作为缓存,可以使用命中率的方式提高使用效率,而且这部分缓存是根据指令随时可以释放的,我们可以认为这部分内存没有实际被使用,也可以认为它是空闲的。

因此查看目前进程正在实际被使用的内存,是used-(buffers+cache),也可以认为如果swap没有大量使用,mem还是够用的,只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的。

根据上述内容,自己算了下,确实剩余内存不少。原来zabbix还是可信的,造成我紧张的原因还是由于自己对linux内存分配机制不清楚导致的。

 




























以上是关于为何我的LINUX服务器内存利用率很高?正确理解LINUX内存使用机制的主要内容,如果未能解决你的问题,请参考以下文章

为何我的电脑CPU占用率是100%?

[转帖]Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践

Java内存CPU占用率过高

正确计算linux系统内存使用率

linux cpu占用率很高

IIS 工作进程对同一服务器上的相同站点的内存使用率很高