有东西占用了我服务器上的所有内存,但这不是文件系统缓存

有东西占用了我服务器上的所有内存,但这不是文件系统缓存

我曾多次收到监控系统关于内存占用 98% 的通知。我运行 top并计算了一下,内存占用只有 60% 左右,如果我总结一下记忆列。几个小时后,内存使用率恢复正常(~70%)。我怀疑是 fs 缓存,但free -m无法证明这一点。

有什么想法吗?服务器:x86-64、ubuntu 12.04、8Gb RAM

# free -m

             total       used       free     shared    buffers     cached
Mem:          7958       7835        123          0          8         39
-/+ buffers/cache:       7787        171
Swap:          975        975          0

#top

top - 10:11:48 up 179 days, 14:25,  1 user,  load average: 1.99, 1.81, 1.59
Tasks: 143 total,   1 running, 142 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.8%us,  0.6%sy,  0.0%ni, 82.8%id, 13.6%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8149424k total,  8017556k used,   131868k free,     6708k buffers
Swap:   999420k total,   999372k used,       48k free,    37952k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND        
30562 mysql     20   0 6033m 2.6g 3160 S   14 32.9  74:37.56 mysqld         
10898 www-data  20   0 25.3g 2.0g 1560 S   16 25.6  19:44.10 java           
 9570 rabbitmq  20   0 2611m 166m 1540 S    6  2.1 628:08.96 beam.smp       
13166 redis     20   0 94276  72m  584 S    0  0.9  23:24.47 redis-server   
 3798 root      20   0  348m  29m  988 S    0  0.4 167:36.37 cimprovagt     
 7614 root      20   0 51468  28m 1256 S    0  0.4   0:02.59 bash           
 3677 root      20   0 4706m  26m    0 S    0  0.3 110:47.59 java           
 3458 bind      20   0  668m 5328 1488 S    0  0.1   0:23.38 named          
 7595 root      20   0 85380 2956  880 S    0  0.0   0:00.25 sshd           
 2061 root      10 -10  4996 2948 2104 S    0  0.0  13:39.72 iscsid         
  632 syslog    20   0  244m 2404  360 S    0  0.0   7:12.39 rsyslogd       
 5855 newrelic  20   0  107m 1852 1248 S    0  0.0 128:23.28 nrsysmond      
    1 root      20   0 24340 1516  736 S    0  0.0   0:29.96 init           
 2741 root      20   0 17340 1308  944 R    0  0.0   0:00.04 top            
 4214 root      20   0 45336 1264 1020 S    0  0.0   6:12.72 cdm            
 4235 root      20   0 12428 1108  908 S    0  0.0  10:55.38 processes      
 4178 root      20   0 19124 1064  856 S    0  0.0   7:20.07 controller     
 5853 ntp       20   0 37772 1036  872 S    0  0.0   7:40.35 ntpd           
 4179 root      20   0 86044 1024  848 S    0  0.0   9:55.54 spooler        
 4008 root      20   0 4090m  980  756 S    0  0.0   0:08.70 console-kit-dae
 3790 root      20   0  422m  952  668 S    0  0.0  89:21.80 cimprovagt     
 3629 root      20   0 50032  868  752 S    0  0.0   1:17.44 sshd           
 4075 root      20   0  182m  844  408 S    0  0.0   0:02.90 polkitd        
27661 root      20   0  101m  776  772 S    0  0.0   0:00.02 mysql          
18465 root      20   0  101m  732  732 S    0  0.0   0:00.04 mysql          
 3436 root      20   0 19112  716  636 S    0  0.0   0:11.25 cron           
 3783 root      20   0 1009m  716  432 S    0  0.0   0:04.83 cimserver      
26239 root      20   0 22092  700  696 S    0  0.0   0:00.03 bash           
 4181 root      20   0 13196  696  596 S    0  0.0   4:18.57 hdb            
 3406 root      20   0 14744  664  660 S    0  0.0   0:00.00 getty          
 3410 root      20   0 14744  664  660 S    0  0.0   0:00.00 getty          
 3428 root      20   0 14744  664  660 S    0  0.0   0:00.00 getty          
 3429 root      20   0 14744  664  660 S    0  0.0   0:00.00 getty          
 3432 root      20   0 14744  664  660 S    0  0.0   0:00.00 getty          
 3972 root      20   0 14744  664  660 S    0  0.0   0:00.00 getty          
18452 root      20   0 22076  620  620 S    0  0.0   0:00.00 bash           
  361 root      20   0 22104  568  568 S    0  0.0   0:00.04 udevd          
 3441 root      20   0 15980  560  464 S    0  0.0  26:28.16 irqbalance     
  654 messageb  20   0 23948  516  324 S    0  0.0   0:01.98 dbus-daemon    
  676 root      20   0 21188  504  504 S    0  0.0   0:00.00 bluetoothd     
 3665 root      20   0  4400  492  488 S    0  0.0   0:00.00 sh             
 5546 rabbitmq  20   0  7672  488  308 S    0  0.0   1:04.49 epmd           
26238 root      20   0 26092  476  476 S    0  0.0   0:00.24 screen         
 2060 root      20   0  4504  440  400 S    0  0.0   3:18.60 iscsid         

答案1

緩衝器文件系统缓存。

缓冲区与特定块设备相关联,并涵盖文件系统元数据的缓存以及跟踪正在传输的页面。缓存仅包含停放的文件数据。也就是说,缓冲区会记住目录中的内容、文件权限,并跟踪特定块设备正在从哪些内存写入或读取的内容。缓存仅包含文件本身的内容。

https://stackoverflow.com/a/12547130/636573

Top 还显示您提供给我们的快照上有 13% 的 IOWAIT。在我看来,这看起来像是 OLTP 数据库没有获得所需的足够磁盘 IOPS。升级您的存储子系统。

答案2

好的,首先返回并确保你的顶部输出是按内存使用情况(RES标识大小)排序的,如果不是,请继续使用以下方法更新你的问题输出。然后您实际上就能够看到哪些东西占用了您的 RAM。

其次,忘记%MEM列。那个特定的蛋糕是假的(由于四舍五入)。
专注于RES程序的标识大小(如果你关心交换,则关注VIRT实际大小)——求和那些列和数字将与您在free&top输出中看到的内容相匹配。


从顶部输出来看,您有一个巨大的(2.6G)MySQL 进程和一个巨大的(2.0G)Java 进程——我怀疑这两个进程是消耗所有 RAM 的同谋(无论该特定 Java 进程要求 MySQL 做什么,都会生成巨大的结果集或中间数据)。Java
进程也有 25G 的虚拟大小(!!)——显然它在内部泄漏了垃圾收集器未释放的内存(或者它正在低效地处理一个巨大的结果集)。

我敢打赌,在“正常情况下”,您的系统可能使用 4-5G 的 RAM 就能顺利运行,而当这两个进程一起运行时,它们会占用剩余的 RAM(甚至更多),最终导致您陷入困境。
找出它们在做什么,修复它,您的问题就会消失。

相关内容