服务器内存占用导致死机原因

最近,服务器经常死机。

1.第一步,登录服务器用top命令查看。内存占满了。
2.第二步,观察,一共16G的内存,内存占用,每天增加6G.
3.第三步,缓存区的内存占比很大。

用命令
free -g 5 或
free -m 5
即每5秒观察内存情况。

为了永久释放该内存。我编辑了这个文件。
在/etc/sysctl.conf文件中配置:vm.drop_caches=1/2/3,然后sysctl -p生效!

然后再写了一个定时脚本。(应该是写了这个脚本就不用改上面的配置,但为了保险,我还是两种方法都用上了。如有不对,请高人留言指点)

定时(每小时)清理一下缓存区的内存。

1.释放内存脚本:
在/data/sh/下创建releasememory.sh,然后把下面的代码贴进去,保存。
该脚本作用是:查询free内存比例,少于20%就清空缓存。

vi releasememory.sh

#!/bin/bash
mem_total=`free -m | awk 'NR==2' | awk '{print $2}'`
mem_free=`free -m | awk 'NR==2' | awk '{print $4}'`
mem_used=`free -m | grep Mem | awk '{print  $3}'`

echo "===========================" >> /var/log/mem.log
date >> /var/log/mem.log
echo "Memory usage | [Total:${mem_total}MB][Free:${mem_free}MB][Used:${mem_used}MB]" >> /var/log/mem.log

if (($mem_used != 0)); then
mem_per=0`echo "scale=2;$mem_free/$mem_total" | bc`
DATA="$(date -d "today" +"%Y-%m-%d-%H-%M") free percent is : $mem_per"
echo $DATA >>/var/log/mem_detect.log
mem_warn=0.40
mem_now=`expr $mem_per \> $mem_warn`
if (($mem_now == 0)); then
sync
echo 3 > /proc/sys/vm/drop_caches
echo "OK" >> /var/log/mem.log
fi
fi
  1. 给脚本执行权限

#chmod +x releasememory.sh

  1. 把脚本添加到系统定时任务:

以下命令是把定时任务放到cron配置文件里,作用是每天1小时执行releasememory.sh脚本。
crontab -e
编辑:
服务器内存占用导致死机原因

4.重新加载cron配置和重启cron服务

#service crond reload
#service crond restart

5.查看log:

/var/log/mem.log
/var/log/mem_detect.log

当然,我也检查了一下程序代码(ThinkPHP框架的),
发现有一个定时任务是每分钟执行。
而执行的方法是一个循环更新表。即
foreach中写了对数据库的update.
虽然那个数据库中目前只有5条记录。但每执行一次就要消耗:4,896.46kb内存。一天下来有6G,可能这个也有影响的。
然后我把这段程序改写了一下,foreach中用Model而不是Db。
我们的定时任务,还有一个每5分钟同步网站代码到另一服务器(这个就没有动了,这个写很久了,之前也没引起死机)。

尽量减少可能的原因,给出解决的方案。

总之,现在这样就好了!

本文参考了:
Linux中top命令输出指标详解
https://www.jianshu.com/p/af584c5a79f2

inux下的缓存机制及清理buffer/cache/swap的方法梳理
https://www.cnblogs.com/kevingrace/p/5991604.html

linux top显示的各个符号参数意义详解
https://blog.csdn.net/junmuzi/article/details/49103429

cron定时任务+释放内存脚本释放服务器缓存
https://blog.csdn.net/eric0000000/article/details/77749087

如果您遇到同样的问题,采用以上方法还没有解决。欢迎加入PHP技术问题群:QQ群号:292626152提问交流,分享资源。

相关文章
相关标签/搜索