科技鼻祖系列
原文鏈接:
前言
之前有記錄并處理過由于LVS網(wǎng)卡流量負(fù)載過低導(dǎo)致軟中斷導(dǎo)致丟包的問題。 RPS和RFS網(wǎng)卡的多隊列性能調(diào)優(yōu)實踐[1],雖然對于普通人來說壓力不高,雖然遇到的概率也不高。 這次我要分享的主題是如何排查常見的服務(wù)器網(wǎng)卡丟包現(xiàn)象。 如果你想了解點對點丟包的解決方案,可能會涉及到很廣泛的想法。 大家不妨參考一下之前的文章《如何使用MTR診斷網(wǎng)絡(luò)問題[2]》,對于Linux中常用的網(wǎng)卡丟失分析工具自然是很熟悉了。
用于查看和更改網(wǎng)絡(luò)設(shè)備(尤其是有線以太網(wǎng)設(shè)備)的驅(qū)動程序參數(shù)和硬件設(shè)置。 您可以根據(jù)需要修改以太網(wǎng)卡的參數(shù),包括手動協(xié)商、速度、雙工、網(wǎng)絡(luò)喚醒等參數(shù)。 通過配置以太網(wǎng)卡,您的計算機可以通過網(wǎng)絡(luò)進(jìn)行有效的通信。 該工具提供了有關(guān)連接到 Linux 系統(tǒng)的以太網(wǎng)設(shè)備的大量信息。
1.了解接收數(shù)據(jù)包的過程
以下是美團技術(shù)團隊的分析,在此謝謝
接收數(shù)據(jù)包是一個復(fù)雜的過程,涉及到很多底層技術(shù)細(xì)節(jié),但一般需要以下步驟:
NIC 接收數(shù)據(jù)包。
將數(shù)據(jù)包從 NIC 硬件緩存?zhèn)鬏數(shù)椒?wù)器視頻內(nèi)存。
通知內(nèi)核進(jìn)行處理。
通過TCP/IP契約逐層處理。
應(yīng)用程序通過 read() 讀取數(shù)據(jù)。
將網(wǎng)卡收到的數(shù)據(jù)包傳輸?shù)街鳈C顯存(網(wǎng)卡與驅(qū)動交互)
網(wǎng)卡收到數(shù)據(jù)包后,首先需要將數(shù)據(jù)同步到內(nèi)核,中間的橋梁就是。 它是網(wǎng)卡和驅(qū)動程序共享的區(qū)域。 事實上,存儲的并不是實際的數(shù)據(jù),而是一個描述符。 該描述符指向其真實的存儲地址。 具體流程如下:
驅(qū)動程序在顯存中分配一個緩沖區(qū)來接收數(shù)據(jù)包,稱為;
將上述緩沖區(qū)(即接收描述符)的地址和大小添加到中。 描述符中的緩沖區(qū)地址是DMA使用的數(shù)學(xué)地址;
驅(qū)動程序通知網(wǎng)卡有新的描述符;
網(wǎng)卡從中取出描述符,然后就知道緩沖區(qū)的地址和大小;
網(wǎng)卡收到新的數(shù)據(jù)包;
網(wǎng)卡通過DMA直接向網(wǎng)絡(luò)發(fā)送新的數(shù)據(jù)包。
當(dāng)驅(qū)動程序的處理速度跟不上網(wǎng)卡的數(shù)據(jù)包接收速率時,驅(qū)動程序來不及分配緩沖區(qū),網(wǎng)卡接收到的數(shù)據(jù)包無法及時上報,就會形成堆積。 當(dāng)網(wǎng)卡內(nèi)部緩沖區(qū)已滿時,其中一些將被丟棄。 數(shù)據(jù),導(dǎo)致丟包。 這部分丟包表現(xiàn)為/proc/net/dev中f??ifo數(shù)組的下降,以及.
通知系統(tǒng)內(nèi)核進(jìn)行處理(驅(qū)動與Linux內(nèi)核交互)
此時,數(shù)據(jù)包已經(jīng)傳輸?shù)?。 前面提到,這是驅(qū)動程序在顯存中分配的緩沖區(qū),并且是通過DMA寫入的。 這些方法不依賴CPU直接將數(shù)據(jù)傳輸?shù)斤@存,這意味著對于內(nèi)核來說,雖然它不知道顯存中已經(jīng)有新的數(shù)據(jù)。 那么如何讓內(nèi)核知道有新數(shù)據(jù)進(jìn)來了呢? 答案就是中斷,它通過中斷告訴內(nèi)核有新的數(shù)據(jù)進(jìn)來了,需要進(jìn)行后續(xù)的處理。
說到中斷,就涉及到硬中斷和軟中斷。 首先,您需要簡單了解一下它們的區(qū)別:
當(dāng)網(wǎng)卡通過DMA將數(shù)據(jù)包復(fù)制到內(nèi)核緩沖區(qū)時,網(wǎng)卡立即發(fā)起硬件中斷。 CPU收到后,首先進(jìn)入上部。 網(wǎng)卡中斷對應(yīng)的中斷處理程序是網(wǎng)卡驅(qū)動的一部分,然后它發(fā)起軟中斷,進(jìn)入下層,開始消費數(shù)據(jù),交給契約棧處理。
只有通過中斷我們才能快速及時的響應(yīng)網(wǎng)卡數(shù)據(jù)請求,但是如果數(shù)據(jù)量很大的話,這會造成大量的中斷請求,CPU大部分時間都會忽略處理中斷物理網(wǎng)卡mac怎么修改,而效率很低。 為了解決這個問題,當(dāng)今的內(nèi)核和驅(qū)動程序使用一種稱為NAPI()的方法來進(jìn)行數(shù)據(jù)處理。 原理可以簡單理解為中斷+尋址。 返回數(shù)據(jù)包數(shù)量以防止多次中斷。
2. 解釋
[root@localhost?~]
eth0:?flags=4163?mtu?1500
inet?192.168.1.135?netmask?255.255.255.0?broadcast?192.168.1.255
inet6?fe80::20c:29ff:fe9b:52d3?prefixlen?64?scopeid?0x20<link>
ether?00:0c:29:9b:52:d3?txqueuelen?1000?(Ethernet)
RX?packets?833?bytes?61846?(60.3?KiB)
RX?errors?0?dropped?0?overruns?0?frame?0
TX?packets?122?bytes?9028?(8.8?KiB)
TX?errors?0?dropped?0?overruns?0?carrier?0?collisions?0
(1) 接收端
表示接收到的數(shù)據(jù)包錯誤總數(shù),包括too-long-、Ring 錯誤、crc校驗錯誤、幀同步錯誤、fifo和pkg等。
(2) 接收端
表示數(shù)據(jù)包已經(jīng)進(jìn)入Ring,但由于顯存不足等系統(tǒng)原因,在復(fù)制到顯存的過程中被丟棄。
(3) 接收
表示fifo,這是因為Ring(又稱Queue)傳輸?shù)腎O小于可以處理的IO,而Ring指的是發(fā)起IRQ請求之前的塊。 顯然,數(shù)據(jù)包的減少意味著數(shù)據(jù)包在到達(dá)環(huán)之前就被網(wǎng)卡的化學(xué)層丟棄了,而CPU無法處理中斷是環(huán)滿的原因之一。 里面有問題的機器是由于分布不均勻(全部壓在core0上),不做造成的丟包。
(4)接收幀
表達(dá)。
三、網(wǎng)卡工作原理
如果覺得接收數(shù)據(jù)包的過程還不夠詳細(xì),可以閱讀明文解釋
網(wǎng)卡接收數(shù)據(jù)包
網(wǎng)絡(luò)線路上的數(shù)據(jù)首先由網(wǎng)卡獲取,網(wǎng)卡會檢測CRC校驗以保證完整性,然后去掉報頭得到幀。 網(wǎng)卡會檢測MAC數(shù)據(jù)包中的目的MAC地址,如果與網(wǎng)卡的MAC地址不同,則將其丟棄(混雜模式除外)。
網(wǎng)卡將幀復(fù)制到網(wǎng)卡內(nèi)部的FIFO緩沖區(qū),并觸發(fā)硬件中斷。 (如果有網(wǎng)卡有環(huán),好像可以先將幀存入環(huán)中,然后觸發(fā)軟件中斷(上一篇文章會詳細(xì)講解Linux中幀的方向),環(huán)是共享的由網(wǎng)卡和驅(qū)動程序組成,它是設(shè)備中的顯存,它對于運行系統(tǒng)來說是可見的,因為linux內(nèi)核源碼中的網(wǎng)卡驅(qū)動程序是用來分配空間的,所以環(huán)通常有上限,另外,應(yīng)該表示可以存儲的幀數(shù),而不是字節(jié)大小。另外,有些系統(tǒng)命令不能通過改變ring來設(shè)置ring的大小,不知道為什么,可能是驅(qū)動不支持。)
通過硬中斷處理函數(shù)建立網(wǎng)卡驅(qū)動,將幀從網(wǎng)卡FIFO復(fù)制到顯存skb,然后交給內(nèi)核處理。 (支持napi的網(wǎng)卡應(yīng)該直接放在環(huán)中,不觸發(fā)硬中斷,直接使用軟中斷,復(fù)制環(huán)中的數(shù)據(jù),直接發(fā)送到下層處理。每個網(wǎng)卡可以處理一幀1個軟中斷處理流程)
在此過程中,網(wǎng)卡芯片對幀進(jìn)行MAC過濾,以減輕系統(tǒng)負(fù)載。 (不僅僅是混雜模式)
網(wǎng)卡分包
網(wǎng)卡驅(qū)動程序在IP數(shù)據(jù)包中添加14字節(jié)的MAC頭,形成幀(暫時沒有CRC)。 幀(目前沒有 CRC)富含發(fā)送方和接收方的 MAC 地址。 因為驅(qū)動程序創(chuàng)建了MAC頭,所以可以隨意輸入地址,還可以進(jìn)行主機偽裝。
驅(qū)動程序?qū)ú粠RC)復(fù)制到網(wǎng)卡芯片內(nèi)部的緩沖區(qū),由網(wǎng)卡處理。
網(wǎng)卡芯片將要發(fā)送的不完整幀(不帶CRC)重新封裝,即添加腹同步信息和CRC校準(zhǔn),然后扔到網(wǎng)線上,完成一條IP報文的發(fā)送。 NIC 可以看到這一點。
網(wǎng)卡中斷處理程序
每個引起中斷的設(shè)備都有一個相應(yīng)的中斷處理程序,它是設(shè)備驅(qū)動程序的一部分。 每個網(wǎng)卡都有一個中斷處理程序,用于通知網(wǎng)卡已經(jīng)收到中斷,并將網(wǎng)卡緩沖區(qū)中的數(shù)據(jù)包復(fù)制到顯存中。
當(dāng)網(wǎng)卡收到來自網(wǎng)絡(luò)的數(shù)據(jù)包時,需要通知內(nèi)核數(shù)據(jù)包已經(jīng)到達(dá)。 NIC 立即發(fā)出中斷。 內(nèi)核通過執(zhí)行網(wǎng)卡已注冊的中斷處理函數(shù)來響應(yīng)。 中斷處理程序開始執(zhí)行,通知硬件,將最新的網(wǎng)絡(luò)數(shù)據(jù)包復(fù)制到顯存,然后從網(wǎng)卡讀取更多的數(shù)據(jù)包。
這都是重要、緊急、與硬件相關(guān)的工作。 內(nèi)核一般需要快速將網(wǎng)絡(luò)數(shù)據(jù)包復(fù)制到系統(tǒng)顯存,因為網(wǎng)卡接收網(wǎng)絡(luò)數(shù)據(jù)包的緩沖區(qū)大小是固定的,但比系統(tǒng)顯存小很多。 因此,一旦上述的復(fù)制動作被延遲,必然會導(dǎo)致網(wǎng)卡 FIFO 緩沖區(qū)溢出——傳入的數(shù)據(jù)包占用了網(wǎng)卡的緩沖區(qū),后續(xù)的數(shù)據(jù)包只能被丟棄,這也應(yīng)該是根源的數(shù)據(jù)。
當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包被復(fù)制到系統(tǒng)內(nèi)存時,中斷的任務(wù)就被認(rèn)為完成了,然后將控制權(quán)返回給系統(tǒng)中斷之前正在運行的程序。
緩沖區(qū)訪問
網(wǎng)卡的內(nèi)核緩沖區(qū)在PC顯存中,由內(nèi)核控制,而網(wǎng)卡有一個FIFO緩沖區(qū)或環(huán),應(yīng)該區(qū)分兩者。 FIFO比較小,如果上面有數(shù)據(jù)物理網(wǎng)卡mac怎么修改,它會嘗試將數(shù)據(jù)存儲到內(nèi)核緩沖區(qū)中。
網(wǎng)卡中的緩沖區(qū)既不屬于內(nèi)核空間也不屬于用戶空間。 屬于硬件緩沖區(qū),允許網(wǎng)卡和操作系統(tǒng)之間有一個緩沖區(qū);
內(nèi)核緩沖區(qū)位于內(nèi)核空間,在顯存中,供內(nèi)核程序使用,作為從硬件讀取或?qū)懭胗布臄?shù)據(jù)緩沖區(qū);
用戶緩沖區(qū)位于用戶空間,在顯存中,供用戶程序使用,作為從硬件讀取或?qū)懭氲臄?shù)據(jù)緩沖區(qū);
另外,為了促進(jìn)數(shù)據(jù)交互,可以將內(nèi)核緩沖區(qū)映射到用戶空間,以便內(nèi)核程序和用戶程序可以同時訪問該區(qū)域。
對于帶ring的網(wǎng)卡,ring是驅(qū)動和網(wǎng)卡共享的,因此內(nèi)核可以直接訪問ring,通常會將復(fù)制的副本復(fù)制到自己的內(nèi)核空間進(jìn)行處理(到下層合約,然后每個skb 是根據(jù) skb 指針傳遞的,直到用戶獲得數(shù)據(jù),所以,對于環(huán)網(wǎng)卡來說,當(dāng)幀從環(huán)傳遞到內(nèi)核控制的計算機顯存時,會發(fā)生大量的副本)。
4.丟包排查思路
網(wǎng)卡工作在數(shù)據(jù)鏈路層和數(shù)據(jù)量鏈路層,會做一些校準(zhǔn),封裝成幀。 我們可以查看校準(zhǔn)是否錯誤,并確定傳輸是否存在問題。 然后從軟件層面看是否因為緩沖區(qū)太小而丟包。
首先檢查硬件
一臺機器經(jīng)常收到丟包的報告,首先檢查底層是否有問題:
(1)檢查工作模式是否正常
[root@localhost?~]#?ethtool?eth0?|?egrep?'Speed|Duplex'
Speed:?1000Mb/s
Duplex:?Full
(2)檢查檢查是否正常
[root@localhost?~]#?ethtool?-S?eth0?|?grep?crc
rx_crc_errors:?0
Speed、、CRC之類的都可以,化學(xué)干擾基本可以排除。
和尺寸
for?i?in?`seq?1?100`;?do?ifconfig?eth2?|?grep?RX?|?grep?overruns;?sleep?1;?done
RX?packets:346547657?errors:0?dropped:0?overruns:35345?frame:0
-g???–show-ringQueries?the?specified?ethernet?device?for?rx/tx?ring?parameter?information.
-G???–set-ringChanges?the?rx/tx?ring?parameters?of?the?specified?ethernet?device.
ethtool?-g?eth0
[root@localhost?~]
Ring?parameters?for?eth0:
Pre-set?maximums:
RX:?4096
RX?Mini:?0
RX?Jumbo:?0
TX:?4096
Current?hardware?settings:
RX:?256
RX?Mini:?0
RX?Jumbo:?0
TX:?256
ethtool?-G?eth0?rx?2048
ethtool?-G?eth0?tx?2048
[root@localhost?~]
[root@localhost?~]
[root@localhost?~]
Ring?parameters?for?eth0:
Pre-set?maximums:
RX:?4096
RX?Mini:?0
RX?Jumbo:?0
TX:?4096
Current?hardware?settings:
RX:?2048
RX?Mini:?0
RX?Jumbo:?0
TX:?2048
紅帽官方解決方案
問題
為什么是of-S?
$?ethtool?-S??|?grep?-i?error
?????rx_error_bytes:?0
?????tx_error_bytes:?0
?????tx_mac_errors:?0
?????tx_carrier_errors:?0
?????rx_crc_errors:?9244
?????rx_align_errors:?0
電纜。
查看。
卡片。
根本原因
大多數(shù)時候, 的值意味著 位于模型的第 1 層。
當(dāng)它出現(xiàn)時,它會進(jìn)行數(shù)據(jù)檢查,即檢查。如果檢查失敗,則為。
網(wǎng)卡處于半模式。 告訴 NIC 進(jìn)入完整模式有問題。
腳步
檢查沙子找到水滴和的位置。

$?ethtool?-S??|?grep?-i?error
?????rx_error_bytes:?0
?????tx_error_bytes:?0
?????tx_mac_errors:?0
?????tx_carrier_errors:?0
?????rx_crc_errors:?9244??>>>>>>
?????rx_align_errors:?0
檢查一下。
ethtool?p1p1
Settings?for?p1p1:
?Supported?ports:?[?FIBRE?]
?Supported?link?modes:???10000baseT/Full
?Supported?pause?frame?use:?Symmetric
?Supports?auto-negotiation:?No
?Supported?FEC?modes:?Not?reported
?Advertised?link?modes:??10000baseT/Full
?Advertised?pause?frame?use:?Symmetric
?Advertised?auto-negotiation:?No
?Advertised?FEC?modes:?Not?reported
?Speed:?10000Mb/s
?Duplex:?Full
?Port:?FIBRE
?PHYAD:?0
?Transceiver:?internal
?Auto-negotiation:?off
?Supports?Wake-on:?d
?Wake-on:?d
?Current?message?level:?0x00000007?(7)
??????????drv?probe?link
?Link?detected:?yes
顯示p1p1的類型、連接模式、速度等信息,以及當(dāng)前是否連接網(wǎng)線(如果是網(wǎng)線口則顯示TP,如果是光纖則顯示Fiber) ,這是接下來的三個重要關(guān)鍵字
端口:[光纖]
速度:/秒
鏈接:是的
ethtool?-S?p1p1?|?grep?-i?error
?????rx_errors:?0
?????tx_errors:?0
?????rx_over_errors:?0
?????rx_crc_errors:?0
?????rx_frame_errors:?0
?????rx_fifo_errors:?0
?????rx_missed_errors:?0
?????tx_aborted_errors:?0
?????tx_carrier_errors:?0
?????tx_fifo_errors:?0
?????tx_heartbeat_errors:?0
?????rx_length_errors:?0
?????rx_long_length_errors:?0
?????rx_short_length_errors:?0
?????rx_csum_offload_errors:?0
ethtool?-p?
ethtool?-p?eth0
ethtool?-i?p1p1
driver:?ixgbe
version:?5.1.0-k-rh7.6
firmware-version:?0x80000960,?18.3.6
expansion-rom-version:
bus-info:?0000:04:00.0
supports-statistics:?yes
supports-test:?yes
supports-eeprom-access:?yes
supports-register-dump:?yes
supports-priv-flags:?yes
ethtool?-s?eth0?speed?100
參考文章
[3]
對于Linux[4]
為什么我看進(jìn)去了? [5]
Ping請求錯誤分析[6]
命令解釋[7]
命令解釋[8]
解決網(wǎng)卡丟包嚴(yán)重及網(wǎng)卡原理[9]
頁腳
[1]
RPS和RFS網(wǎng)卡多隊列性能調(diào)優(yōu)實踐:
[2]
如何使用MTR診斷網(wǎng)絡(luò)問題:
[3]
:
[4]
對于Linux:
[5]
為什么我看到?:
[6]
Ping請求錯誤分析:
[7]
命令解釋:
[8]
命令解釋:
[9]
解決網(wǎng)卡丟包嚴(yán)重及網(wǎng)卡原理:
你可能還喜歡
點擊下圖閱讀
太棒了,這個利器可以在幾分鐘內(nèi)將多個合并為一個!
云原生是一種信念
