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