今天有一朋友問我為什麼linux伺服器記憶體佔用過高呢,有沒有辦法解決這個問題,下面我來給各位同學介紹linux伺服器記憶體佔用過大解決方案,希望此方法對各位同學有協助。
今天到公司按照慣例檢查了下所有伺服器的狀態,發現有台伺服器的記憶體佔用比平常大很多,如
馬上qq上問了下程式開發是否最近這1-2天改了什麼東西,在得知沒有改什麼的情況下,馬上重啟了下php-fpm和nginx,重啟之後看了下,記憶體釋放出了1G,但這還不行,因為這台伺服器是8G記憶體,平時最多使用4G多的樣子,想今天使用到了7G多都快把伺服器記憶體佔用完了,很明顯是不正常的,繼續進行檢查.
在檢查過程中,我使用了top來看到底是哪個進程佔用記憶體最大,看了近1分鐘沒有發現什麼,然後使用命令查看佔用記憶體最大的10個進程:
代碼如下 |
複製代碼 |
ps -aux | sort -k4nr | head -n 10 |
也只是顯示了nginx和php-fpm佔用記憶體最大,但我重啟了這兩個進程,看來跟他們2個無關,我又開始懷疑是不是伺服器被黑了,馬上查看進程ps aux,這一看就發現了問題,有個指令碼在進程裡有很多個產生,馬上執行下面命令進行kill掉:
代碼如下 |
複製代碼 |
kill -9 $(ps aux | grep 進程名 |grep -v grep| awk '{print $2}')
|
現在這看記憶體使用量率,記憶體終於正常了,好了,再觀察幾分鐘,沒有問題退出伺服器了,繼續檢查那個指令碼的問題.
ps:這裡要強調的事,不要根據自己的直覺去隨便以為是什麼的問題,最好是調查清楚了再去執行,比如我這裡就是根據自己的直覺以為是nginx和php-fpm的問題,還好是跟老大打了招呼重啟的,不然後果很嚴重.
再給大家一個查看記憶體佔用最大的進程的命令:
代碼如下 |
複製代碼 |
ps aux| grep -v "USER" |sort -n -r -k 4 |awk 'NR==1{ print $0}' |
我使用的是php指令碼我們這裡在linux中寫了一個linux負載過高時重啟php指令碼
大家可以根據自己伺服器的情況來決定要負載超過多少就重啟php,我這裡只設定了負載到1就重啟php.
系統:centos 5.9 64位
指令碼內容:
vi check-php.sh
代碼如下 |
複製代碼 |
#!/bin/sh TOP_SYS_LOAD_NUM=1 SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'` echo $(date +"%y-%m-%d") `uptime` if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ] then echo "#0#" $(date +"%y-%m-%d %H:%M:%S") "pkill php-fpm" `ps -ef | grep php-fpm | wc -l` /etc/init.d/php-fpm stop sleep 8 pkill php-fpm sleep 8 for i in 1 2 3 do if [ `pgrep php-fpm | wc -l` -le 0 ] then /etc/init.d/php-fpm start sleep 30 echo "#1#" $(date +"%y-%m-%d %H:%M:%S") "start php-fpm" `ps -ef | grep php-fpm | wc -l` fi done else if [ `pgrep php-fpm | wc -l` -le 0 ] then /etc/init.d/php-fpm start sleep 30 echo "#2#" $(date +"%y-%m-%d %H:%M:%S") "start php-fpm" `ps -ef | grep php-fpm | wc -l` fi fi |
定時執行
代碼如下 |
複製代碼 |
*/3 * * * * /root/shell/check-php.sh >>/var/log/check-php.log
|
如果你運行指令碼出現:
代碼如下 |
複製代碼 |
: line 6: bc: command not found : line 6: [: -eq: unary operator expected
|
表示沒有bc命令,centos可以用 yum -y install bc 安裝.