這裡還是按照場景來吧,畢竟場景是最能體驗實用性的。首先說下伺服器配置以及環境
阿里雲ECS雲主機,8G內存,4核的CPU,20M頻寬,20G系統盤+200G數據盤,CentOS6.564位,安裝的一件集成lnmp環境
場景:微信發紅包
這個場景是很常見的,一般客戶會在整點的時候進行一次微信公眾號的廣告推送,這兒時候伺服器的並發大概在3000到5000左右。說起來這其實不算高並發,但伺服器還是崩了,大概要等5分鐘才能恢復正常。這有點不應該啊,分析原因。查看CPU的使用率不高,記憶體使用也很正常,在阿里雲控制面板裡面查看網路出口流量滿載,問題大概是清楚了,網路原因導致。
先查看靜態資源,發現圖片大部分沒有優化,於是脫下來進行無損壓縮,大概省略了1M左右的大小,提交上去後依然崩潰,伺服器頻繁出現502。
再次檢查頁面的靜態資源css和js,把常用的js庫替換成CDN以減少請求數,提交後依然沒有太多變化,502依舊。
於是查看nginx連線數,使用指令
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
結果顯示
TIME_WAIT 3828SYN_SENT 1FIN_WAIT1 107FIN_WAIT2 27ESTABLISHED 661SYN_RECV 23CLOSING 15LAST_ACK 284
乖乖,TIME_WAITE很高,這裡務必說下TIME_WAITE的意思:TIME_WAIT:另一邊已初始化一個釋放。這個是啥意思呢?意思是伺服器已經主動關閉了,在等待客戶端給一個回應,如果客戶端一直沒有回應就會出現等待,這個值就會增加。很顯然,這個時候我們需要減少TIME_WAIT的值。
這裡只需要修改sysctl.conf的一些參數即可,編輯/etc/sysctl.conf文件,檢查
是否是這樣的設置,如果找不到對應的,在文件最後加上即可。儲存後執行
/sbin/sysctl -p
配置即可生效。
20分鐘後繼續查看nginx連線數,結果
TIME_WAIT 87SYN_SENT 1FIN_WAIT1 60FIN_WAIT2 19ESTABLISHED 477SYN_RECV 12CLOSING 2LAST_ACK 100
恢復正常,網路頻寬也降下來了。
但好景不長,第二次整點開始搶紅包的時候又出現了502。查看進程發現mysqld的CPU佔用率很高,導致CPU滿載,伺服器崩潰。修改mysql配置文件,調整max_connection為30000。其他相關參數進行了調整優化,情況有所緩解,但是短短幾分鐘之內CPU又滿載了。
詭異!於是查看mysql中的進程,發現頻繁的sql查詢,而查詢的幾個表資料量均在10萬左右,判斷是因為沒有設定索引導致。諮詢後端開發,果然只設定了主鍵。立刻修改,提交上去五分鐘後CPU降下來,穩定在10%左右,也沒有出現過502了。
以上是如何解決在伺服器維護中處理高並發所導致的一些常見問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!