本文共 1782 字,大约阅读时间需要 5 分钟。
最近,服务器经常死机。
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/bashmem_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.logdate >> /var/log/mem.logecho "Memory usage | [Total:${mem_total}MB][Free:${mem_free}MB][Used:${mem_used}MB]" >> /var/log/mem.logif (($mem_used != 0)); thenmem_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.logmem_warn=0.40mem_now=`expr $mem_per \> $mem_warn`if (($mem_now == 0)); thensyncecho 3 > /proc/sys/vm/drop_cachesecho "OK" >> /var/log/mem.logfifi
#chmod +x releasememory.sh
以下命令是把定时任务放到cron配置文件里,作用是每天1小时执行releasememory.sh脚本。
crontab -e编辑:4.重新加载cron配置和重启cron服务
#service crond reload
#service crond restart5.查看log:
/var/log/mem.log
/var/log/mem_detect.log当然,我也检查了一下程序代码(ThinkPHP框架的),
发现有一个定时任务是每分钟执行。而执行的方法是一个循环更新表。即foreach中写了对数据库的update.虽然那个数据库中目前只有5条记录。但每执行一次就要消耗:4,896.46kb内存。一天下来有6G,可能这个也有影响的。然后我把这段程序改写了一下,foreach中用Model而不是Db。我们的定时任务,还有一个每5分钟同步网站代码到另一服务器(这个就没有动了,这个写很久了,之前也没引起死机)。尽量减少可能的原因,给出解决的方案。
总之,现在这样就好了!
本文参考了:
Linux中top命令输出指标详解inux下的缓存机制及清理buffer/cache/swap的方法梳理
linux top显示的各个符号参数意义详解
cron定时任务+释放内存脚本释放服务器缓存
如果您遇到同样的问题,采用以上方法还没有解决。
欢迎加入PHP技术问题群:QQ群号:292626152提问交流,分享资源。转载于:https://blog.51cto.com/phpervip/2155879