有時會發(fā)生網(wǎng)絡(luò)丟包現(xiàn)象,此處的丟包有兩種,真正意義上的丟包和邏輯丟包(此處以tcp協(xié)議棧丟包為例)。之前falcon-agent也上報了相應(yīng)的指標(biāo),在此處對一些疑問給出盡量詳細(xì)的解釋。
linux系統(tǒng)pakcet接收的過程過程簡單概括為
網(wǎng)卡收到包以后通過DMA傳至ring buffer
網(wǎng)卡觸發(fā)硬件中斷,中斷處理函數(shù)調(diào)用包接受軟中斷(softirq)
Softirq檢測各cpu的網(wǎng)卡poll list,并輪詢相應(yīng)網(wǎng)卡的ring buffer
包從相應(yīng)packet desciptor 中移到更上一層處理,并把該packet descriptor重置
真實(shí)的丟包就是說這三個階段的任一階段收到了包,但因?yàn)槟承┰虬阉鼇G棄了。
發(fā)生真實(shí)丟包的原因
當(dāng)ring buffer滿了并且kernel softirq并不能及時處理后續(xù)的進(jìn)來的包,那就會導(dǎo)致丟包。可以通過ethtool -G eth1 rx number增大receive buffer的值可以緩解丟包,同理也可以設(shè)置transfer buffer。
當(dāng)socket backlog滿了導(dǎo)致丟包,可以設(shè)置/proc/sys/net/ipv4/tcp_max_syn_backlog來增加tcp syn隊(duì)列的長度。
真實(shí)丟包判斷
可以通過ethtool、ifconfig、netstat命令查看丟包統(tǒng)計,也可以直接查看/proc/net/dev、/sys/class/net/dev_name查看,如ifconfig eth0
第三行,第四行表示收包和發(fā)包的情況,errors,dropped,overruns,frame不為0即表示發(fā)生了真正的丟包。
RX errors: 表示總的收包的錯誤數(shù)量,這包括 too-long-frames 錯誤,Ring Buffer 溢出錯誤,crc 校驗(yàn)錯誤,幀同步錯誤,fifo overruns 以及 missed pkg 等等。
RX dropped: 表示數(shù)據(jù)包已經(jīng)進(jìn)入了 Ring Buffer,但是由于內(nèi)存不夠等系統(tǒng)原因,導(dǎo)致在拷貝到內(nèi)存的過程中被丟棄。
RX overruns: 表示了 fifo 的 overruns,這是由于 Ring Buffer(aka Driver Queue) 傳輸?shù)?IO 大于 kernel 能夠處理的 IO 導(dǎo)致的,而 Ring Buffer 則是指在發(fā)起 IRQ 請求之前的那塊 buffer。很明顯,overruns 的增大意味著數(shù)據(jù)包沒到 Ring Buffer 就被網(wǎng)卡物理層給丟棄了,而 CPU 無法即使的處理中斷是造成 Ring Buffer 滿的原因之一,上面那臺有問題的機(jī)器就是因?yàn)?interruprs 分布的不均勻(都壓在 core0),沒有做 affinity 而造成的丟包
RX frame: 表示 misaligned 的 frames。
對于 TX 的來說,出現(xiàn)上述 counter 增大的原因主要包括 aborted transmission, errors due to carrirer, fifo error, heartbeat erros 以及 windown error,而 collisions 則表示由于 CSMA/CD 造成的傳輸中斷。
邏輯意義上的丟包
相信大家多少都了解tcp協(xié)議棧,tcp協(xié)議棧中有超時重傳算法,此處的邏輯丟包指的是接收方?jīng)]有在發(fā)出ack后收到正確序號范圍的packet
邏輯意義上的丟包原因及判斷方法
原因很可能是發(fā)生了網(wǎng)絡(luò)問題,具體包括如網(wǎng)絡(luò)擁塞、網(wǎng)線松動、網(wǎng)絡(luò)不穩(wěn)定及其他線路故障,也有可能是網(wǎng)絡(luò)流量突增,但是我們做監(jiān)控的不能去實(shí)時的拿著線路檢測儀去檢查線路,當(dāng)前擬定使用如下指標(biāo),來源/proc/net/netstat:
TcpExt.TCPLoss,tcp協(xié)議棧丟失數(shù)據(jù)包而進(jìn)行恢復(fù)的次數(shù),此時falcon-agent所在主機(jī)為接收方
TcpExt.TCPTimeouts tcp數(shù)據(jù)在指定時間內(nèi)沒有受到應(yīng)答ack而超時的次數(shù),此時falcon-agent所在主機(jī)為發(fā)送方
TcpExt.TCPLossFailures,tcp協(xié)議棧丟失數(shù)據(jù)包進(jìn)行恢復(fù)失敗的次數(shù)
TcpExt.TcpFastRetrans,tcp快速重傳的次數(shù)