服務器內存占用導致死機原因
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,然後把下面的代碼貼進去,保存。
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
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
提問交流,分享資源。
服務器內存占用導致死機原因