最近,服务器经常死机。
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=0echo "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.20
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
- 给脚本执行权限
#chmod +x releasememory.sh
- 把脚本添加到系统定时任务:
以下命令是把定时任务放到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
提问交流,分享资源。
原文地址:http://blog.51cto.com/phpervip/2155879