背景
- 某業(yè)務(wù)應(yīng)用,為發(fā)新品做準(zhǔn)備,進(jìn)行一次壓測(cè)
- 應(yīng)用鏈路:域名 -> 業(yè)務(wù)nginx pod ->業(yè)務(wù)app pod(app有配置HPA)
- 業(yè)務(wù)nginx對(duì)uptream上游是短連接
- 業(yè)務(wù)nginx pod數(shù)小于業(yè)務(wù)app pod數(shù)
現(xiàn)象
- 壓測(cè)期間觸發(fā)了HPA自動(dòng)擴(kuò)容,但是新擴(kuò)出來(lái)的業(yè)務(wù)app新pod流量很低,而之前的pod流量是均勻
- 初步假設(shè)是否nginx是否配置了會(huì)話保持,或者某種原因?qū)е耼ginx命中了某種緩存
排查
- 簡(jiǎn)單判斷:
(1)查看nginx配置文件負(fù)載均衡算法
(2)查看業(yè)務(wù)app pod壓測(cè)前,流量是否均勻
(3)查看業(yè)務(wù)app pod新增副本后,原來(lái)的副本的流量是否junyun
(4)最終查看nginx日志和ipvs記錄的連接數(shù),nginx配置文件無(wú)異常,舊pod流量均勻,不均勻值發(fā)生在新的pod上
(5)懷疑是否大流量下nginx的負(fù)載均衡算法失效,但是根據(jù)步驟3的結(jié)果,暫時(shí)把這個(gè)可能性排查
(6)剩下的可能性是nginx命中了某種緩存(來(lái)源ip或者來(lái)源端口),下面簡(jiǎn)單抓包查看,確定流量轉(zhuǎn)發(fā)有什么規(guī)律 - 查看ipvs連接數(shù)
ipveadm -Ln
查看活躍連接數(shù)和非活躍連接與舊pod是否相差很大
- 查看業(yè)務(wù)nginx的tcp狀態(tài)
ss -s
查看確認(rèn)timewait較多,確實(shí)是短連接
3, 從ningx pod網(wǎng)卡上抓包
> tcpdump -i any -w your_capture.pcap 'host 192.168.1.100'
> tshark -r your_capture.pcap -Y "tcp" -T fields -e tcp.srcport -e frame.time_relative \
| awk '{
port = $1;
time = $2;
if (last_time[port] != "") {
delta = time - last_time[port];
print "Port " port " reused after " delta " seconds";
}
last_time[port] = time;
}'
最終結(jié)果觀察端口確實(shí)出現(xiàn)了重用,而且重用時(shí)間隔都小于2min
規(guī)律的時(shí)間間隔肯定不是意外,似乎確定了方向
查看當(dāng)前內(nèi)核,大于 4.4+,MSL等于30秒,所以發(fā)送重用是正常的
- 上一步發(fā)現(xiàn)重用時(shí)間隔都小于2min,但是大于1min,因?yàn)閗8s集群內(nèi)使用的是lvs,通過(guò)google搜尋對(duì)應(yīng)的案例,發(fā)現(xiàn)ipvs中的連接hash表會(huì)記錄各連接狀態(tài),做緩存超時(shí)
ipvsadm -lcn
#查看 IPVS 已建立的連接及剩余時(shí)間 -》命令執(zhí)行后的結(jié)果
IPVS connection entries
pro expire state (此處為對(duì)client的連接狀態(tài)) source virtual destination
ipvs 查看文檔,只支持tcp、tcpfin、udp三個(gè)imeout的修改
默認(rèn)timewait默認(rèn)timewait是2min,這個(gè)2min剛好與上面2min吻合
- 端口重用為什么會(huì)影響流量分布
- 首先明確,ipvs滿足下面兩個(gè)條件,才會(huì)重新選擇一個(gè)新的后端
(1)新的tcp連接,不是新的http
(2)詞tcp連接沒(méi)有命中連接hash表 [這里的命中指的是tcp連接的源端口和源IP能夠匹配到連接hash表的某條記錄](méi)
- 后續(xù)縮小內(nèi)核port_range參數(shù)在測(cè)試環(huán)境驗(yàn)證,復(fù)現(xiàn)此現(xiàn)象
總結(jié)
- 短連接+大流量場(chǎng)景下,端口復(fù)用+ipvs連接hash表會(huì)可能會(huì)導(dǎo)致流量轉(zhuǎn)發(fā)不均
解決方案:
- nginx與業(yè)務(wù)app采用長(zhǎng)連接,應(yīng)用側(cè)配置主動(dòng)斷開(kāi)
- 擴(kuò)容nginx pod到足夠數(shù)量,目的是降低端口重用概率
- 修改內(nèi)核fd和ip_local_port_range參數(shù),增加端口的可用數(shù)