一次生产环境服务器内存不足的排查经过

   今天发现有一台线上的服务器内存报警,最近报警发现有好几次了,慎是恼火,想一探究竟,看了一下是一台16G内存的服务器,free 了一下看了一下确实是没有多少内存可用了,再看了一下都跑了一些什么应用,结果发现只跑了一个数据库跟一个跨服,当时心里就感觉16G内存不可能用完,

[root@hqg-222-99. logs]#ps aux|awk '{sum=sum + $6};END {print sum/1024"M"}'
4363.01M  
才使用了4g多一点

#也可以通过这段在网上找到的脚本查看
#/bin/bash                                                                                                               
for PROC in `ls  /proc/|grep "^[0-9]"`
do
  if [ -f /proc/$PROC/statm ]; then
      TEP=`cat /proc/$PROC/statm | awk '{print ($2)}'`
      RSS=`expr $RSS + $TEP`
  fi
done
RSS=`expr $RSS \* 4`
echo $RSS"KB"

再看看cache也没有占用多少,那内存去哪了呢?

下载nmon 进行内存查看:


wget ## http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz 
直接./nmon  
按m显示内存的使用情况
这个是我释放了后的截图

wKioL1fOap-zCzt3AAAvguWclXk625.png-wh_50

当时看着free只有几百M了,slab 占用了10G slab是什么呢,经过查询资料后的解释是

slab是Linux操作系统的一种内存分配机制。其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内存碎片,而且处理速度也太慢。而slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符就是一类),每当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统,从而避免这些内碎片。slab分配器并不丢弃已分配的对象,而是释放并把它们保存在内存中。当以后又要请求新的对象时,就可以从内存直接获取而不用重复初始化。

查看了一下内存信息如下:

[root@hqg-222-99. logs]#cat /proc/meminfo 
MemTotal:       16100652 kB
MemFree:          254236 kB
Buffers:          169600 kB
Cached:           186728 kB
SwapCached:        10064 kB
Active:          3806092 kB
Inactive:        1064960 kB
Active(anon):    3566956 kB
Inactive(anon):   948732 kB
Active(file):     239136 kB
Inactive(file):   116228 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        511992 kB
SwapFree:         446100 kB
Dirty:                32 kB
Writeback:            72 kB
AnonPages:       4504536 kB
Mapped:            21212 kB
Shmem:               964 kB
Slab:           10621812 kB    #slab占用的内存大小10G
SReclaimable:   10590404 kB    #slab可回收的内存大小
SUnreclaim:        31408 kB    #slab不可回收的内存大小
KernelStack:        2680 kB
PageTables:        15184 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8562316 kB
Committed_AS:    7259324 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       65132 kB
VmallocChunk:   34359627272 kB
HardwareCorrupted:     0 kB
AnonHugePages:   4325376 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        8176 kB
DirectMap2M:    33546240 kB

#可以通过
slabtop  查看具体是什么占用了内存,

可以统计slab内存的大小,看看是不是吻合
[root@hqg-222-99. dingmh]#echo `cat /proc/slabinfo |awk 'BEGIN{sum=0;}{sum=sum+$3*$4;}END{print sum/1024/1024}'` MB
4917.96 MB

slab可以回收的内存是可以通过触发来自动回收的

[root@hqg-222-99. logs]#sysctl  -a |grep free
vm.min_free_kbytes = 67584   #意思是说只有在系统内存不满足这个值的时候才能触发,但是等到真的到这个值的时候,基本上看不到了
vm.extra_free_kbytes = 0

[root@hqg-222-99. logs]#sysctl -w vm.min_free_kbytes=1048576  
vm.min_free_kbytes = 1048576
设置成1G后,系统立马从slab上释放了5g内存

具体slab是被什么应用占用了这么大的内存,等我排查完后再做详细的记录

本文出自 “脚下的痕迹” 博客,请务必保留此出处http://dingmh.blog.51cto.com/188555/1846883

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
之前在上linux课的时候,老师说,vim使用的好的网络管理员比普通的效率快好多。 合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。撸基础吧。 linux编辑工具 VI VIM EMACS vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。vim的这些优势主要体现在以下几个方面: 易用性 vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。 语法加亮 vim可以用不同的颜色来加亮你的代码。 可视化操作( ESC+V) 就
CentOS 6.8 GRUB加密和破解密码实战指南 案例1:服务器在公共场合,为了防止随便有人进入单用户破解root密码,先对GRUB引导进行加密,为了更加安全对启动内核时也加密 1、编辑grub配置文件 [root@localhost~]#opensslpasswd-1//MD5加密转换Password:Verifying-Password:$1$X8cVMw5v$AH0aUHVNix7Tx6wmHAXsf1[root@localhost~]#vim/etc/grub.conf#grub.confge
故障: 在HP 785G6(服务器有2个集成网卡,4个独立网卡)上装centos6.5后配置网卡信息后,重启网卡报错,提示Bringing uo interface eth0:bnx2 0000:02:03.0:etho:register_cnicfailed Determining if ip address isalready in use for device eth0,网络不通,截图如下 排查经过 :查看配置文件, [root@HGJ0205 ~]# cat /etc/sysconfig/netw
之前的话我们的项目都是跑在windows上,今天我们要将我们的程序跑到linxu机器上。在看linux部署之前,我们先看一下node.js类似于asp.net mvc的过滤器或者叫拦截器。在app.js中我们加入如下代码 varbeforeRequest=function(req,res,next){if(req.originalUrl=='/'||req.originalUrl=='/login'||req.originalUrl=='/config'||req.originalUrl=='/user'

数据库备份mysqldump应用总结 - 2016-09-12 14:09:16

[root@ansible~]#mysqldump-uroot-p123456xxx/opt/xxx.sql#备份数据库xxx[root@ansible~]#egrep-v"#|\*|--|^$"/opt/xxx.sqlDROPTABLEIFEXISTS`test`;CREATETABLE`test`(`id`int(4)NOTNULLAUTO_INCREMENT,`name`char(20)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=7DEF
某电信运营商3G系统与4G系统建立号码核对系统,因为两个系统的号码状态不一致。源端使用Oracle Goldengate软件,目标端使用Kafka自写CUE程序进行解析源端传输过去的Trail文件。目标端不采用Goldengate的复制进程进行解析。 在某系统中创建Oracle Goldengate相关进程mgr,抽取,投递进程之后,发现抽取进程异常终止。且view ggsevt后发现如下报错: 2016-08-17 16:40:57 ERROR OGG-01028 Oracle GoldenGate C
su和su- 切换方式 实例: sudo 提权 sudo的特色功能 sudo命令的常用参数 注意 案例1——允许zhanghe用户执行所有命令: 案例2——仅允许linuxprobe用户以root用户身份执行cat命令。 案例3——允许linuxprobe用户以任意身份执行命令,且每次都不需要密码验证。 su和su- 在工作生产环境中不要去使用root用户身份,因为一旦执行了错误的命令后可能直接让系统崩溃。但因为许多的系统管理命令和服务为了安全所以只有超级用户才可以使用,因此这也无疑让普通用户受到更多的权

Zabbix添加网卡内外流量监控 - 2016-09-05 18:09:00

题外话:zabbix讲究一气呵成,从头到尾没人打扰然后布置。但是干运维难免有人来打扰,这个过来要求布环境,那个要求来买服务器。所以zabbix之路难免走的坑坑洼洼。 现在笔者想对host名单里面的zabbix_server进行网卡的内外流量情况的一个监控,首先登录zabbix之后,configuration---hosts,出现如下的菜单: 现在可以看到这个zabbix_server后面link了很多个模板,正是因为link了很多的模板,所以导致它的items非常多,42个。现在是要在zabbix_ser

远程桌面排错 - 2016-09-05 17:09:01

最近遇到了一个比较棘手的问题,用户远程桌面无法连接,我的博文中之前也写到了一篇远程桌面排错,但是这次的和之前的大不相同 = = 原因排查步骤 1)首先当然是查看报错,这个是我自己机器上截图的,报错信息都一样 2)首先查看服务器是否开启了远程访问 3)查看目标是否可以ping通 4)查看服务是否正常启动 5)如果要正常远程到目标必须可以telnet到目标的远程端口,默认为3389,这个端口不通,我们之前已经将防火墙关闭了 6)本机上telnet 127.0.0.1 3389,这么做的话可以排除外界因素的干扰

Nginx演练(3)配置内容压缩 - 2016-09-05 17:09:51

如果对HTTP熟悉的话,对request-response请求过程应该很熟悉。 比如访问“www.jd.com",一个完整页面的访问,往往会经过很多次的HTTP请求共同完成,这中间会涉及到浏览器并发数。具体片段如图 客户端请求的资源内容有多种,jpg,css,js,html等。不同文件类型,对应不同MIME_TYPE。每个文件都要通过网络传输到客户端,才能被浏览器渲染,进而展现给用户。想必大家都有给朋友发送文件的经历吧,不管是QQ传输,还是Email传送。如果一个文件过大,想节省点传输时间,都会发送文件之