1.異常分析:
haproxy叢集作為負載代理,底層挂着多個服務程式,20w個使用者同時并發請求,在100%請求協定為http情況下服務良好,無異常;當請求為websocket 75% http30%情況下,出現大量503服務不可以異常。 首先檢視底層伺服器,底層伺服器運作平穩,壓力未滿,對應的503請求未發送到底層伺服器,檢視haproxy日志,發現大量如下日志: >> - 503 625990 use 0.000304s
haproxy完全未将請求發送給底層伺服器,haproxy接到這個請求後立馬就傳回503。神奇的現象,首先可以判斷為haproxy問題; 到底是什麼問題導緻了haproxy在底層伺服器健康并且壓力低的情況下任性的傳回503呢,開啟糾結之旅,排查伺服器配置: [[email protected] ~]# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 515033
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 627680
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 60240
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
這配置應對如此量的請求完全無壓力況且100% http請求的情況下無問題,突然腦袋一霎被神光照亮,websocket為長連接配接,http連接配接會釋放,難道是haproxy允許最大連接配接數配置限制了?開啟驗證之旅
2.問題處理及驗證:
檢視haproxy配置:maxconn 30000 so funny 3W連接配接,雖然是haproxy叢集,但是請求分發一不均衡,單台超過3w長連接配接那不就是搞笑麼。沒話說,調整maxconn到10w,完美解決,不廢話了,直接上圖,單台haproxy在運作情況下有出現連接配接超過3w的情況:
public | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Queue | Sessions | Bytes | Denied | Errors | Warnings | Server | ||||||||||||||||||
Cur | Max | Limit | Cur | Max | Limit | Total | LbTot | In | Out | Req | Resp | Req | Conn | Resp | Retr | Redis | Status | Wght | Act | Bck | Chk | Dwn | Dwntme | Thrtle |
Frontend | 18214 | 18214 | 100000 | 36935 | 14534490 | 4419713 | 157 | OPEN | ||||||||||||||||
ipdb | local 0 | redirect 0 |