這裡還是按照場景來吧,畢竟場景是最能體驗實用性的。首先說下伺服器配置以及環境 阿裡雲ECS雲主機,8G記憶體,4核的CPU,20M帶寬,20G系統盤+200G數據盤,CentOS6.564位,安裝的一件集成lnmp環境 ...
這裡還是按照場景來吧,畢竟場景是最能體驗實用性的。首先說下伺服器配置以及環境
阿裡雲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 3828 SYN_SENT 1 FIN_WAIT1 107 FIN_WAIT2 27 ESTABLISHED 661 SYN_RECV 23 CLOSING 15 LAST_ACK 284
乖乖,TIME_WAITE很高,這裡務必說下TIME_WAITE的含義:TIME_WAIT:另一邊已初始化一個釋放。這個是啥意思呢?意思就是伺服器已經主動關閉了,在等待客戶端給一個回應,如果客戶端一直沒有回應就會出現等待,這個值就會增加。很顯然,這個時候我們需要減少TIME_WAIT的值。
這裡只需要修改sysctl.conf的一些參數即可,編輯/etc/sysctl.conf文件,檢查
是否是這樣的設置,如果找不到對應的,在文件最後加上即可。保存後執行
/sbin/sysctl -p
配置即可生效。
20分鐘後繼續查看nginx連接數,結果
TIME_WAIT 87 SYN_SENT 1 FIN_WAIT1 60 FIN_WAIT2 19 ESTABLISHED 477 SYN_RECV 12 CLOSING 2 LAST_ACK 100
恢復正常,網路帶寬也降下來了。
但是好景不長,第二次整點開始搶紅包的時候又出現了502。查看進程發現mysqld的CPU占用率很高,導致CPU滿載,伺服器崩潰。修改mysql配置文件,調整max_connection為30000。其他相關參數進行了調整優化,情況有所緩解,但是短短幾分鐘之內CPU又滿載了。
詭異!於是查看mysql中的進程,發現頻繁的sql查詢,而所查詢的幾個表數據量均在10萬左右,判斷是因為沒有設置索引導致。咨詢後端開發,果然是只設置了主鍵。立刻修改,提交上去五分鐘後CPU降下來,穩定在10%左右,也沒有出現過502了。