1. 程式人生 > >服務器內存占用導致死機原因

服務器內存占用導致死機原因

water release restart 定時任務 images 網站 保險 沒有 分鐘

最近,服務器經常死機。

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

  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
提問交流,分享資源。

服務器內存占用導致死機原因