新聞中心
網(wǎng)絡(luò)丟包指的是在數(shù)據(jù)傳輸過程中丟失了部分?jǐn)?shù)據(jù)包,這可能會(huì)導(dǎo)致網(wǎng)絡(luò)性能下降、網(wǎng)絡(luò)延遲增加和數(shù)據(jù)傳輸失敗等問題。作為一種常見的問題,網(wǎng)絡(luò)丟包在Linux系統(tǒng)中也經(jīng)常會(huì)出現(xiàn)。本文將介紹。

站在用戶的角度思考問題,與客戶深入溝通,找到崇信網(wǎng)站設(shè)計(jì)與崇信網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋崇信地區(qū)。
一、查看網(wǎng)絡(luò)丟包情況
1. 使用 ping 命令
Ping命令是一種檢測(cè)網(wǎng)絡(luò)連接情況的簡(jiǎn)單工具,它可以用來測(cè)試網(wǎng)絡(luò)延遲和丟包情況。
在Linux中,使用以下命令來測(cè)試網(wǎng)絡(luò)連接并查看網(wǎng)絡(luò)丟包:
“`
ping -c 100
“`
其中,-c 表示發(fā)送的ping請(qǐng)求包數(shù)量,可以根據(jù)需要進(jìn)行調(diào)整。這條命令的輸出結(jié)果將顯示ping的情況,包括失去的分組數(shù)量、分組丟失的百分比和平均響應(yīng)時(shí)間等,從而讓我們了解網(wǎng)絡(luò)丟包情況和網(wǎng)絡(luò)延遲情況。
2. 查看網(wǎng)絡(luò)接口情況
在Linux中,我們可以使用ifconfig命令來查看各種網(wǎng)絡(luò)接口的配置情況。該命令輸出的內(nèi)容包括網(wǎng)卡名稱、MAC地址、IP地址、網(wǎng)絡(luò)掩碼、廣播地址等信息,可以通過查看這些信息來了解網(wǎng)絡(luò)設(shè)備的實(shí)際狀態(tài)。
ping命令檢測(cè)不出來的問題都可以通過ifconfig命令來查找。
二、解決網(wǎng)絡(luò)丟包問題
1. 優(yōu)化網(wǎng)絡(luò)設(shè)置
網(wǎng)絡(luò)設(shè)置對(duì)于網(wǎng)絡(luò)丟包問題起到了至關(guān)重要的作用。在Linux中,我們可以通過配置一些網(wǎng)絡(luò)參數(shù)來優(yōu)化網(wǎng)絡(luò)性能,并減少網(wǎng)絡(luò)丟包。
以下是一些可以優(yōu)化網(wǎng)絡(luò)設(shè)置的方法:
(1)TCP和UDP緩沖區(qū)大?。和ㄟ^增加TCP和UDP緩沖區(qū)大小,可以幫助你緩解網(wǎng)絡(luò)擁塞和丟包問題。在Linux中,可以通過修改/etc/sysctl.conf文件中的網(wǎng)絡(luò)參數(shù)來調(diào)整TCP和UDP緩沖區(qū)大?。?/p>
“`
net.ipv4.tcp_rmem=4096 87380 67108864
net.ipv4.tcp_wmem=4096 87380 67108864
net.ipv4.udp_rmem_min=8192
net.ipv4.udp_wmem_min=8192
“`
(2)修改MTU值:MTU(Maximum Tranission Unit)是數(shù)據(jù)包能夠傳輸?shù)母蟠笮 T贚inux中,我們可以通過修改MTU值來減少網(wǎng)絡(luò)丟包問題??梢酝ㄟ^以下方式設(shè)置MTU值:
“`
ifconfig eth0 mtu 1200
“`
(3)禁用IPv6:如果您不需要IPv6功能或您的網(wǎng)絡(luò)沒有IPv6支持,那么禁用IPv6可能會(huì)解決一些網(wǎng)絡(luò)丟包問題??梢酝ㄟ^以下方式禁用IPv6:
“`
echo “net.ipv6.conf.all.disable_ipv6=1” > /etc/sysctl.d/disableipv6.conf
“`
2. 升級(jí)驅(qū)動(dòng)程序和固件
驅(qū)動(dòng)程序和固件是網(wǎng)絡(luò)系統(tǒng)的關(guān)鍵組件,如果它們過時(shí)或不穩(wěn)定,就會(huì)導(dǎo)致網(wǎng)絡(luò)丟包問題。為了解決這個(gè)問題,可以考慮升級(jí)驅(qū)動(dòng)程序和固件。
在Linux中,我們可以通過以下方式檢查并升級(jí)驅(qū)動(dòng)程序和固件:
(1)檢查設(shè)備信息
使用以下命令檢查設(shè)備信息:
“`
lspci | grep -i net
“`
該命令將輸出有關(guān)您的網(wǎng)絡(luò)適配器的詳細(xì)信息。
(2)查找驅(qū)動(dòng)程序和固件
一旦確定了您的網(wǎng)絡(luò)適配器型號(hào),就可以找到適合的驅(qū)動(dòng)程序和固件。您可以從制造商的網(wǎng)站上下載它們,或者查看Linux社區(qū)是否提供了支持。
(3)安裝驅(qū)動(dòng)程序和固件
一旦找到了適合的驅(qū)動(dòng)程序和固件,就可以安裝它們。
三、
相關(guān)問題拓展閱讀:
- ethtool原理介紹和解決網(wǎng)卡丟包排查思路
ethtool原理介紹和解決網(wǎng)卡丟包排查思路
之前記錄過處理因?yàn)長VS網(wǎng)卡流量負(fù)載過高導(dǎo)致軟中斷發(fā)生丟包的問題, RPS和RFS網(wǎng)卡多隊(duì)列性能調(diào)優(yōu)實(shí)踐 ,對(duì)一般人來說壓力不大的情況下其實(shí)碰見的概率并不高。這次想分享的話題是比較常見服務(wù)器網(wǎng)卡丟包現(xiàn)象排查思路,如果你是想了解點(diǎn)對(duì)點(diǎn)的丟包解決思路涉及面可能就比較廣,不妨先參考之前的文章 如何使用MTR診斷網(wǎng)絡(luò)問題 ,對(duì)于Linux常用的網(wǎng)卡丟包分析工具自然是ethtool。
2023年06月22日 – 初稿
閱讀原文 –
ethtool – utility for controlling network drivers and hardware
ethtool is the standard Linux utility for controlling network drivers and hardware, particularly for wired Ethernet devices. It can be used to:
Most features are dependent on support in the specific driver. See the manual page for full information.
ethtool 用于查看和修改網(wǎng)絡(luò)設(shè)備(尤其是有線以太網(wǎng)設(shè)備)的驅(qū)動(dòng)參數(shù)和硬件設(shè)置。你可以根據(jù)需要更改以太網(wǎng)卡的參數(shù),包括自動(dòng)協(xié)商、速度、雙工和局域網(wǎng)喚醒等參數(shù)。通過對(duì)以太網(wǎng)卡的配置,你的計(jì)算機(jī)可以通過網(wǎng)絡(luò)有效地培禪進(jìn)行通信。該工具提供了許多關(guān)于接駁到你的 Linux 系統(tǒng)的以太網(wǎng)設(shè)備的信息。
接收數(shù)據(jù)包是一個(gè)復(fù)雜的過程,涉及很多底層的技術(shù)細(xì)節(jié),但大致需要以下幾個(gè)步驟:
NIC 在接收到數(shù)據(jù)包之后,首先需要將數(shù)據(jù)同步到內(nèi)核中,這中間的橋梁是 rx ring buffer 。它是由 NIC 和驅(qū)動(dòng)程序共享的一片區(qū)域,事實(shí)上, rx ring buffer 存儲(chǔ)的并不是實(shí)際的 packet 數(shù)據(jù),而是一個(gè)描述符,這個(gè)描述符指向了它真正的存儲(chǔ)地址,具體流程如下:
當(dāng)驅(qū)動(dòng)處理速度跟不上網(wǎng)卡收包速度時(shí),驅(qū)動(dòng)來不及分配緩沖區(qū),NIC 接收到的數(shù)據(jù)包無法及時(shí)寫到 sk_buffer ,就會(huì)產(chǎn)生堆積,當(dāng) NIC 內(nèi)部緩沖區(qū)寫滿后,就會(huì)丟棄部分?jǐn)?shù)據(jù),引起丟包。這部分丟包為 rx_fifo_errors ,在 /proc/net/dev 中體現(xiàn)為 fifo 字段增長,在 ifconfig 中體現(xiàn)為 overruns 指標(biāo)增長。
這個(gè)時(shí)候,數(shù)據(jù)包豎帶已經(jīng)被轉(zhuǎn)移到了 sk_buffer 中。前文提到,這是驅(qū)動(dòng)程序在內(nèi)存中分配的一片緩沖區(qū),并且是通過 DMA 寫入的,這種方式不依賴 CPU 直接將數(shù)據(jù)寫到了內(nèi)存中,意味著對(duì)內(nèi)核來說,其實(shí)并不知道已經(jīng)有新數(shù)據(jù)到了內(nèi)存中。那么如何讓內(nèi)核知道有新數(shù)據(jù)進(jìn)來了呢?答案就是中斷,通過中斷告訴內(nèi)核有新數(shù)據(jù)進(jìn)來了,并需要進(jìn)行后續(xù)處理。
提到中配纖塵斷,就涉及到硬中斷和軟中斷,首先需要簡(jiǎn)單了解一下它們的區(qū)別:
當(dāng) NIC 把數(shù)據(jù)包通過 DMA 復(fù)制到內(nèi)核緩沖區(qū) sk_buffer 后,NIC 立即發(fā)起一個(gè)硬件中斷。CPU 接收后,首先進(jìn)入上半部分,網(wǎng)卡中斷對(duì)應(yīng)的中斷處理程序是網(wǎng)卡驅(qū)動(dòng)程序的一部分,之后由它發(fā)起軟中斷,進(jìn)入下半部分,開始消費(fèi) sk_buffer 中的數(shù)據(jù),交給內(nèi)核協(xié)議棧處理。
通過中斷,能夠快速及時(shí)地響應(yīng)網(wǎng)卡數(shù)據(jù)請(qǐng)求,但如果數(shù)據(jù)量大,那么會(huì)產(chǎn)生大量中斷請(qǐng)求,CPU 大部分時(shí)間都忙于處理中斷,效率很低。為了解決這個(gè)問題,現(xiàn)在的內(nèi)核及驅(qū)動(dòng)都采用一種叫 NAPI(new API)的方式進(jìn)行數(shù)據(jù)處理,其原理可以簡(jiǎn)單理解為 中斷 + 輪詢,在數(shù)據(jù)量大時(shí),一次中斷后通過輪詢接收一定數(shù)量包再返回,避免產(chǎn)生多次中斷。
(1) RX errors
表示總的收包的錯(cuò)誤數(shù)量,這包括 too-long-frames 錯(cuò)誤,Ring Buffer 溢出錯(cuò)誤,crc 校驗(yàn)錯(cuò)誤,幀同步錯(cuò)誤,fifo overruns 以及 missed pkg 等等。
(2) RX dropped
表示數(shù)據(jù)包已經(jīng)進(jìn)入了 Ring Buffer,但是由于內(nèi)存不夠等系統(tǒng)原因,導(dǎo)致在拷貝到內(nèi)存的過程中被丟棄。
(3) 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ù)包沒到 Ring Buffer 就被網(wǎng)卡物理層給丟棄了,而 CPU 無法即使的處理中斷是造成 Ring Buffer 滿的原因之一,上面那臺(tái)有問題的機(jī)器就是因?yàn)?interruprs 分布的不均勻(都?jí)涸?core0),沒有做 affinity 而造成的丟包。
(4) RX frame
表示 misaligned 的 frames。
網(wǎng)線上的packet首先被網(wǎng)卡獲取,網(wǎng)卡會(huì)檢查packet的CRC校驗(yàn),保證完整性,然后將packet頭去掉,得到frame。網(wǎng)卡會(huì)檢查MAC包內(nèi)的目的MAC地址,如果和本網(wǎng)卡的MAC地址不一樣則丟棄(混雜模式除外)。
網(wǎng)卡將frame拷貝到網(wǎng)卡內(nèi)部的FIFO緩沖區(qū),觸發(fā)硬件中斷。(如有ring buffer的網(wǎng)卡,好像frame可以先存在ring buffer里再觸發(fā)軟件中斷(下篇文章將詳細(xì)解釋Linux中frame的走向),ring buffer是網(wǎng)卡和驅(qū)動(dòng)程序共享,是設(shè)備里的內(nèi)存,但是對(duì)操作系統(tǒng)是可見的,因?yàn)榭吹絣inux內(nèi)核源碼里網(wǎng)卡驅(qū)動(dòng)程序是使用kcalloc來分配的空間,所以ring buffer一般都有上限,另外這個(gè)ring buffer size,表示的應(yīng)該是能存儲(chǔ)的frame的個(gè)數(shù),而不是字節(jié)大小。另外有些系統(tǒng)的 ethtool 命令 并不能改變r(jià)ing parameters來設(shè)置ring buffer的大小,暫時(shí)不知道為什么,可能是驅(qū)動(dòng)不支持。)
網(wǎng)卡驅(qū)動(dòng)程序通過硬中斷處理函數(shù),構(gòu)建sk_buff,把frame從網(wǎng)卡FIFO拷貝到內(nèi)存skb中,接下來交給內(nèi)核處理。(支持napi的網(wǎng)卡應(yīng)該是直接放在ring buffer,不觸發(fā)硬中斷,直接使用軟中斷,拷貝ring buffer里的數(shù)據(jù),直接輸送給上層處理,每個(gè)網(wǎng)卡在一次軟中斷處理過程能處理weight個(gè)frame)
過程中,網(wǎng)卡芯片對(duì)frame進(jìn)行了MAC過濾,以減小系統(tǒng)負(fù)荷。(除了混雜模式)
網(wǎng)卡驅(qū)動(dòng)程序?qū)P包添加14字節(jié)的MAC頭,構(gòu)成frame(暫無CRC)。Frame(暫無CRC)中含有發(fā)送端和接收端的MAC地址,由于是驅(qū)動(dòng)程序創(chuàng)建MAC頭,所以可以隨便輸入地址,也可以進(jìn)行主機(jī)偽裝。
驅(qū)動(dòng)程序?qū)rame(暫無CRC)拷貝到網(wǎng)卡芯片內(nèi)部的緩沖區(qū),由網(wǎng)卡處理。
網(wǎng)卡芯片將未完全完成的frame(缺CRC)再次封裝為可以發(fā)送的packet,也就是添加頭部同步信息和CRC校驗(yàn),然后丟到網(wǎng)線上,就完成一個(gè)IP報(bào)的發(fā)送了,所有接到網(wǎng)線上的網(wǎng)卡都可以看到該packet。
產(chǎn)生中斷的每個(gè)設(shè)備都有一個(gè)相應(yīng)的中斷處理程序,是設(shè)備驅(qū)動(dòng)程序的一部分。每個(gè)網(wǎng)卡都有一個(gè)中斷處理程序,用于通知網(wǎng)卡該中斷已經(jīng)被接收了,以及把網(wǎng)卡緩沖區(qū)的數(shù)據(jù)包拷貝到內(nèi)存中。
當(dāng)網(wǎng)卡接收來自網(wǎng)絡(luò)的數(shù)據(jù)包時(shí),需要通知內(nèi)核數(shù)據(jù)包到了。網(wǎng)卡立即發(fā)出中斷。內(nèi)核通過執(zhí)行網(wǎng)卡已注冊(cè)的中斷處理函數(shù)來做出應(yīng)答。中斷處理程序開始執(zhí)行,通知硬件,拷貝最新的網(wǎng)絡(luò)數(shù)據(jù)包到內(nèi)存,然后讀取網(wǎng)卡更多的數(shù)據(jù)包。
這些都是重要、緊迫而又與硬件相關(guān)的工作。內(nèi)核通常需要快速的拷貝網(wǎng)絡(luò)數(shù)據(jù)包到系統(tǒng)內(nèi)存,因?yàn)榫W(wǎng)卡上接收網(wǎng)絡(luò)數(shù)據(jù)包的緩存大小固定,而且相比系統(tǒng)內(nèi)存也要小得多。所以上述拷貝動(dòng)作一旦被延遲,必然造成網(wǎng)卡FIFO緩存溢出 – 進(jìn)入的數(shù)據(jù)包占滿了網(wǎng)卡的緩存,后續(xù)的包只能被丟棄,這也應(yīng)該就是ifconfig里的overrun的來源。
當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包被拷貝到系統(tǒng)內(nèi)存后,中斷的任務(wù)算是完成了,這時(shí)它把控制權(quán)交還給被系統(tǒng)中斷前運(yùn)行的程序。
網(wǎng)卡的內(nèi)核緩沖區(qū),是在PC內(nèi)存中,由內(nèi)核控制,而網(wǎng)卡會(huì)有FIFO緩沖區(qū),或者ring buffer,這應(yīng)該將兩者區(qū)分開。FIFO比較小,里面有數(shù)據(jù)便會(huì)盡量將數(shù)據(jù)存在內(nèi)核緩沖中。
網(wǎng)卡中的緩沖區(qū)既不屬于內(nèi)核空間,也不屬于用戶空間。它屬于硬件緩沖,允許網(wǎng)卡與操作系統(tǒng)之間有個(gè)緩沖;
內(nèi)核緩沖區(qū)在內(nèi)核空間,在內(nèi)存中,用于內(nèi)核程序,做為讀自或?qū)懲布臄?shù)據(jù)緩沖區(qū);
用戶緩沖區(qū)在用戶空間,在內(nèi)存中,用于用戶程序,做為讀自或?qū)懲布臄?shù)據(jù)緩沖區(qū);
另外,為了加快數(shù)據(jù)的交互,可以將內(nèi)核緩沖區(qū)映射到用戶空間,這樣,內(nèi)核程序和用戶程序就可以同時(shí)訪問這一區(qū)間了。
對(duì)于有ring buffer的網(wǎng)卡,ring buffer是由驅(qū)動(dòng)與網(wǎng)卡共享的,所以內(nèi)核可以直接訪問ring buffer,一般拷貝frames的副本到自己的內(nèi)核空間進(jìn)行處理(deliver到上層協(xié)議,之后的一個(gè)個(gè)skb就是按skb的指針傳遞方式傳遞,直到用戶獲得數(shù)據(jù),所以,對(duì)于ring buffer網(wǎng)卡,大量拷貝發(fā)生在frame從ring buffer傳遞到內(nèi)核控制的計(jì)算機(jī)內(nèi)存里)。
網(wǎng)卡工作在數(shù)據(jù)鏈路層,數(shù)據(jù)量鏈路層,會(huì)做一些校驗(yàn),封裝成幀。我們可以查看校驗(yàn)是否出錯(cuò),確定傳輸是否存在問題。然后從軟件層面,是否因?yàn)榫彌_區(qū)太小丟包。
一臺(tái)機(jī)器經(jīng)常收到丟包的報(bào)警,先看看更底層的有沒有問題:
(1) 查看工作模式是否正常
(2) 查看檢驗(yàn)是否正常
Speed,Duplex,CRC 之類的都沒問題,基本可以排除物理層面的干擾。
Why rx_crc_errors incrementing in the receive counter of ethtool -S output?
Check ethtool -S output and find where are the drops and errors.
Check the numbers corresponding to rx_crc_errors .
顯示了p1p1 的接口類型,連接模式,速率等等信息,以及當(dāng)前是否連接了網(wǎng)線(如果是網(wǎng)線Supported ports 就是TP,如果是光纖則顯示Fiber),這里例舉下3個(gè)重要關(guān)鍵詞
Supported ports:
Speed: 10000Mb/s
Link detected: yes
ethtool
Counters Troubleshooting for Linux Driver
Why do I see rx_crc_errors in ethtool output?
ping請(qǐng)求錯(cuò)誤分析
ifconfig 命令詳解
ethtool 命令詳解
ethtool 解決網(wǎng)卡丟包嚴(yán)重和網(wǎng)卡原理
關(guān)于linux網(wǎng)卡丟包查看的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站欄目:如何在Linux中查看和解決網(wǎng)絡(luò)丟包問題(linux網(wǎng)卡丟包查看)
當(dāng)前URL:http://www.dlmjj.cn/article/cocjipg.html


咨詢
建站咨詢
