關于Linux性能調優網絡I/O的一些筆記(linux網絡性能優化)

      網友投稿 1005 2022-05-30

      寫在前面

      和小伙伴分享一些Linux網絡優化的筆記,內容很淺,可以用作入門

      博文內容結合《Linux性能優化》讀書筆記整理

      涉及內容包括

      常用的優化工具(mii-tool,ethtool,ifconfig,ip,sar,iptraf,netstat)使用Demo及對應的輸出解釋

      具體的調優策略步驟

      寫在前面

      和小伙伴分享一些Linux網絡優化的筆記,內容很淺,可以用作入門

      和小伙伴分享一些Linux網絡優化的筆記,內容很淺,可以用作入門

      博文內容結合《Linux性能優化》讀書筆記整理

      博文內容結合《Linux性能優化》讀書筆記整理

      涉及內容包括

      常用的優化工具(mii-tool,ethtool,ifconfig,ip,sar,iptraf,netstat)使用Demo及對應的輸出解釋

      具體的調優策略步驟

      涉及內容包括

      常用的優化工具(mii-tool,ethtool,ifconfig,ip,sar,iptraf,netstat)使用Demo及對應的輸出解釋

      具體的調優策略步驟

      食用方式:

      需要了解Linux基礎,網絡分層相關知識

      沒有完整的調優Demo,只是提供的一些方向。關于調優工具,你可以學習到

      確定系統內以太網設備的帶寬和雙工設置(mii-tool、ethtool)。

      確定流經每個以太網接口的網絡流量(ifconfig、sar、iptraf、netstat)。

      確定流入和流出系統的IP流量的類型(iptraf、netstat)。

      確定流入和流出系統的每種類型的IP流量(iptraf)。

      確定是哪個應用程序產生了IP流量(netstat -p)。

      食用方式:

      需要了解Linux基礎,網絡分層相關知識

      沒有完整的調優Demo,只是提供的一些方向。關于調優工具,你可以學習到

      確定系統內以太網設備的帶寬和雙工設置(mii-tool、ethtool)。

      確定流經每個以太網接口的網絡流量(ifconfig、sar、iptraf、netstat)。

      確定流入和流出系統的IP流量的類型(iptraf、netstat)。

      確定流入和流出系統的每種類型的IP流量(iptraf)。

      確定是哪個應用程序產生了IP流量(netstat -p)。

      理解不足小伙伴幫忙指正

      理解不足小伙伴幫忙指正

      「 理性的人尋求的不是快樂,而是沒有痛苦。--------王小波」

      學習網絡調優工具之前,簡單溫習一下網絡I/O相關的知識

      涉及名詞解釋

      帶寬(傳輸速率):數據傳輸的過程中,兩個設備之間數據流動的物理速度稱為傳輸速率,單位為bps(Bits Per Second,每秒比特數),傳輸速率不是指單位數據流動的速度,而是指單位時間內傳輸的數據量有多少。傳輸速率有被稱之為帶寬(Bandwidth),帶寬越大網絡傳輸能力就越強。

      吞吐量:主機之間的實際的傳輸速率被稱為吞吐量,單位與帶寬相同,吞吐量還衡量CPU處理能力,網絡的擁堵程度,報文中數據字段的占有份額。

      網卡:網絡接口卡,也稱網絡適配器,網卡,LAN卡。聯網時必須使用。

      路由器:在OSI模型的第3層-網絡層面上連接兩個網絡(路由尋址,類似送快遞)、并對分組報文進行轉發的設備。涉及路由控制表(靜態路由,動態路由OSPF,默認路由)

      交換機:在OSI模型的第2層-數據鏈路層上連接局域網的主要設備,交換機能夠根據以太網幀中目標地址智能的轉發數據,涉及地址轉發表(通過MAC地址學習記錄實際的MAC地址本身)

      包,數據幀,數據報,段,消息:包為全能性術語,幀表示數據鏈路層中包的單位,而數據報是IP和UDP 等網絡層以上的分層中包的單位,段則表示TCP數據中流的信息,消息是指應用協議中數據的單位。

      網絡I/O介紹

      Linux和其他主流操作系統中的網絡流量被抽象(協議分層與OSI參考模型)為一系列的硬件和軟件層次。在每個分層上,發送端添加首部包裝信息,經過路由器,接受端分離首部恢復數據。當然路由器的傳遞也涉及網絡層和鏈路層的首部分離和添加。簡單回顧下

      在OSI分層中,鏈路層包含網絡硬件,如以太網設備。在傳送網路流量時,這一層并不區分流量類型,而僅僅以盡可能快的速度發送和接收數據包(或幀)。

      鏈路層的上面是網絡層。使用互聯網協議(IP)和網際控制報文協議(ICMP)在機器間尋址并路由數據包。IP/ICMP盡其最大努力嘗試在機器之間傳遞數據包,但是它們不能保證數據包是否能真正達到其目的地。

      網絡層的上面是傳輸層,它定義了傳輸控制協議(TCP)和用戶數據報協議(UDP)。

      TCP是一個可靠協議,它可以保證消息通過網絡送達,如果消息無法送達它就會產生一個錯誤。

      TCP的同級協議UDP,則是一個不可靠協議,它無法保證信息能夠送達(為了獲得最高的數據傳輸速率)。

      UDP和TCP為IP增加了服務的概念。UDP和TCP接收有編號端口的消息。按照慣例,每個類型的網絡服務都被分配了不同的編號即端口。

      超文本傳輸協議(HTTP)通常為端口80

      安全外殼(SSH)通常為端口22

      文件傳輸協議(FTP)通常為端口23。

      ┌──[root@vms81.liruilongs.github.io]-[~] └─$cat /etc/services | grep -E "^http\s|^ssh\s|^ftp\s" | sort ftp 21/sctp # FTP ftp 21/tcp ftp 21/udp fsp fspd http 80/sctp # HyperText Transfer Protocol http 80/tcp www www-http # WorldWideWeb HTTP http 80/udp www www-http # HyperText Transfer Protocol ssh 22/sctp # SSH ssh 22/tcp # The Secure Shell (SSH) Protocol ssh 22/udp # The Secure Shell (SSH) Protocol ┌──[root@vms81.liruilongs.github.io]-[~] └─$

      在Linux系統中,文件/etc/services定義了全部的端口以及它們提供的服務類型。

      傳輸層層上面為應用層。這一層包含了各種應用程序,它們使用下面各層在網絡上傳輸數據包。

      Linux內核實現或控制的是最低三層(鏈路層、網絡層和傳輸層)。內核可以提供每層的性能統計信息,包括數據流經每一層時的帶寬使用情況信息和錯誤計數信息。

      鏈路層的網絡流量

      Linux可以偵測到流經鏈路層的數據流量的速率。

      鏈路層,通常是以太網,以幀序列的形式將信息發送到網絡上。不管應用層的交互方式是什么,鏈路層也會將它們分割為幀,再發送到網絡上。數據幀的最大尺寸被稱為最大傳輸單位(MTU)。可以使用網絡配置工具,如ip或ifconfig來設置MTU。

      k8s集群機器所有有好多Calico虛擬網卡

      ┌──[root@vms81.liruilongs.github.io]-[~] └─$ifconfig | grep mtu cali12cf25006b5: flags=4163 mtu 1480 cali13a4549bf1e: flags=4163 mtu 1480 cali45e02b0b21e: flags=4163 mtu 1480 cali5a282a7bbb0: flags=4163 mtu 1480 cali86e7ca9e9c2: flags=4163 mtu 1480 calicb34164ec79: flags=4163 mtu 1480 docker0: flags=4099 mtu 1500 ens32: flags=4163 mtu 1500 lo: flags=73 mtu 65536 tunl0: flags=193 mtu 1480 ┌──[root@vms81.liruilongs.github.io]-[~] └─$

      就以太網而言,最大大小一般為1500字節,雖然有些硬件支持的巨型幀可以高達9000字節。MTU的大小對網絡效率有直接影響。

      鏈路層上的每一個幀都有一個小容量的頭部,因此,使用大尺寸的MTU就提高了用戶數據對開銷(頭部)的比例。但是,使用大尺寸的MTU,每個數據幀被損壞或丟棄的幾率會更高。

      對單一物理鏈路來說,大尺寸MTU通常會帶來更好的性能,因為它需要的開銷更小;反之,對嘈雜的鏈路(鏈路聚合)來說,更小的MTU則通常會提升性能,因為,當單個幀被損壞時,它要重傳的數據更少。

      在物理層,幀流經物理網絡,Linux內核可以收集大量有關幀數量和類型的不同統計數據:

      發送/接收:如果一個幀成功地流出或流入機器,那么它就會被計為一個已發送或已接收的幀。

      錯誤:有錯誤的幀(可能是因為網絡電纜壞了,或雙工不匹配)。

      丟棄:被丟棄幀的(很可能是因為內存或緩沖區容量小)。

      溢出:由于內核或網卡有過多的幀,因此被網絡丟棄的幀。通常這種情況不應該發生。

      幀:由于物理級問題導致被丟棄的幀。其原因可能是循環冗余校驗(CRC)錯誤或其他低級別的問題(這個分類有些搞不懂?)。

      多播: 這些幀不直接尋址到當前系統,而是同時廣播到一組節點。

      壓縮:一些底層接口,如點對點協議(PPP)或串行線路網際協議(SLIP)設備在把幀發送到網絡上之前,會對其進行壓縮。該值表示的就是被壓縮幀的數量。

      有些Linux網絡性能工具能夠顯示通過每一個網絡設備的每一種類型的幀數。這些工具通常需要設備名,因此,熟悉Linux如何對網絡設備命名以便搞清楚哪個名字代表了哪個設備是很重要的。

      以太網設備被命名為ethN,正常,eth0指的是第一個設備,ethl指的是第二個設備,以此類推。與以太網設備命名方式相同,PPP設備被命名為pppN。環回設備,用于與本機聯網,被命名為lo。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$ifconfig lo lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1 (Local Loopback) RX packets 10250705 bytes 2227288333 (2.0 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 10250705 bytes 2227288333 (2.0 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      協議層(傳輸層)網絡流量

      對TCP或UDP流量而言,Linux使用套接字/端口來抽象兩臺機器的連接。當與遠程機器連接時,本地應用程序用一個網絡套接字來打開遠程機器上的一個端口。

      Linux網絡性能工具可以跟蹤流經特定網絡端口的數據量。由于每個服務的端口號具有唯一性,因此有可能確定流向特定服務的物理流量。

      網絡性能工具

      mii-tool(媒體無關接口工具)

      mii-tool是以太網專用硬件工具,主要用于設置以太網設備,但它也可以提供有關當前設置的信息。諸如鏈接速度和雙工設置,對于追蹤性能不佳設備的成因是非常有用。

      mii-tool已經過時了,推薦使用ethtool,一般也不會怎么使用,書里有講,我們簡單看下

      ┌──[root@vms81.liruilongs.github.io]-[~] └─$man mii-tool | grep obsolete This program is obsolete. For replacement check ethtool. ┌──[root@vms81.liruilongs.github.io]-[~] └─$

      我這里是CentOS 7虛機,所以網卡為eth32 系統上eth32的配置信息。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$mii-tool -v ens32 ens32: negotiated 1000baseT-FD flow-control, link ok product info: Yukon 88E1011 rev 3 basic mode: autonegotiation enabled basic status: autonegotiation complete, link ok capabilities: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD advertising: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD link partner: 1000baseT-HD 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD

      mi-tool提供了關于如何配置以太網設備物理層的底層信息。

      ethtool

      在配置和顯示以太網設備統計數據方面,ethtool提供了與mii-tool相似的功能。不過,ethtool更加強大,包含了更多配置選項和設備統計信息。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$ethtool ens32 Settings for ens32: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: No Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: on MDI-X: off (auto) Supports Wake-on: d Wake-on: d Current message level: 0x00000007 (7) drv probe link Link detected: yes

      通過上面的配置我們可以看大,帶寬為 Speed: 1000Mb/s 千兆,雙工模式為 Duplex: Full 全雙工 ,網卡是否連接網線:Link detected: yes

      ifconfig(接口配置)

      ifconfig的主要工作就是在Linux機器上安裝和配置網絡接口。它還提供了系統中所有網絡設備的基本性能統計信息。ifconfig幾乎在所有聯網的Linux機器上都是可用的。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$ifconfig ens32 ens32: flags=4163 mtu 1500 inet 192.168.26.81 netmask 255.255.255.0 broadcast 192.168.26.255 inet6 fe80::20c:29ff:fead:e393 prefixlen 64 scopeid 0x20 ether 00:0c:29:ad:e3:93 txqueuelen 1000 (Ethernet) RX packets 507331 bytes 69923393 (66.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 556567 bytes 308574743 (294.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      關于部分參數的說明

      ifconfig提供的統計數據顯示的是自系統啟動開始的累計數值。如果你將一個網絡設備下線,之后又讓其上線,其統計數據也不會重置。如果你按規律的間隔來運行ifconfig,就可以發現各種統計數據的變化率。這一點可以通過watch命令或shell腳本來自動實現,

      ┌──[root@vms81.liruilongs.github.io]-[~] └─$watch -d -n 1 ifconfig ens32

      ip

      一些網絡工具,如ifconfig,正在被淘汰,取而代之的是新的命令:ip,ip不僅可以讓你對Linux聯網的多個不同方面進行配置,還可以顯示每個網絡設備的性能統計信息。

      ┌──[root@vms81.liruilongs.github.io]-[~] └─$ip -s -s link ls ens32 2: ens32: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 00:0c:29:ad:e3:93 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 127977457 756138 0 0 0 0 RX errors: length crc frame fifo missed 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 438259866 814226 0 0 0 0 TX errors: aborted fifo window heartbeat transns 0 0 0 0 8 ┌──[root@vms81.liruilongs.github.io]-[~] └─$

      部分字段說明,RX代表接收,TX代表發送。

      sar

      sar提供了鏈路級的網絡性能數據。但是,它同時還提供了一些關于傳輸層打開的套接字數量的基本信息。sar使用如下命令行來收集網絡統計信息:

      sar[-n DEV | EDEV | SOCK | FULL ] [DEVICE] [linterval][count]

      「顯示每個設備發送和接收的數據包數和字節數信息」

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$sar -n DEV 1 1 Linux 3.10.0-693.el7.x86_64 (vms81.liruilongs.github.io) 2022年05月14日 _x86_64_ (2 CPU) 22時46分16秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 22時46分17秒 ens32 1.00 1.00 0.11 0.09 0.00 0.00 0.00 22時46分17秒 cali86e7ca9e9c2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時46分17秒 cali13a4549bf1e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時46分17秒 cali5a282a7bbb0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時46分17秒 cali12cf25006b5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時46分17秒 cali45e02b0b21e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時46分17秒 lo 224.00 224.00 27.57 27.57 0.00 0.00 0.00 22時46分17秒 calicb34164ec79 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時46分17秒 tunl0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時46分17秒 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 平均時間: ens32 1.00 1.00 0.11 0.09 0.00 0.00 0.00 平均時間: cali86e7ca9e9c2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali13a4549bf1e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali5a282a7bbb0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali12cf25006b5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali45e02b0b21e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: lo 224.00 224.00 27.57 27.57 0.00 0.00 0.00 平均時間: calicb34164ec79 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: tunl0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$

      「顯示每個設備的發送和接收錯誤信息」

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$sar -n EDEV 1 1 Linux 3.10.0-693.el7.x86_64 (vms81.liruilongs.github.io) 2022年05月14日 _x86_64_ (2 CPU) 22時53分07秒 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s 22時53分08秒 ens32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 cali86e7ca9e9c2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 cali13a4549bf1e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 cali5a282a7bbb0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 cali12cf25006b5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 cali45e02b0b21e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 calicb34164ec79 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 tunl0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22時53分08秒 docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s 平均時間: ens32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali86e7ca9e9c2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali13a4549bf1e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali5a282a7bbb0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali12cf25006b5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: cali45e02b0b21e 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: calicb34164ec79 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: tunl0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 平均時間: docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$

      「顯示使用套接字(TCP、UDP和RAW)的總數信息」

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$sar -n SOCK 1 3 Linux 3.10.0-693.el7.x86_64 (vms81.liruilongs.github.io) 2022年05月14日 _x86_64_ (2 CPU) 22時56分23秒 totsck tcpsck udpsck rawsck ip-frag tcp-tw 22時56分24秒 3487 245 9 0 0 163 22時56分25秒 3487 245 9 0 0 165 22時56分26秒 3487 245 9 0 0 167 平均時間: 3487 245 9 0 0 165 ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$

      iptraf

      iptraf是一個實時網絡監控工具。它提供了相當多的模式來監控網絡接口和流量。iptraf是一種控制臺應用程序,但其用戶界面則是基于光標的一組菜單和窗口。

      iptraf可以提供有關每個網絡設備發送幀速率的信息。同時,它還能夠顯示TCP/IP數據包的類型和大小信息,以及·。

      需要裝包

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$yum -y install iptraf ................ Running transaction 正在安裝 : iptraf-ng-1.1.4-7.el7.x86_64 1/1 驗證中 : iptraf-ng-1.1.4-7.el7.x86_64 1/1 已安裝: iptraf-ng.x86_64 0:1.1.4-7.el7 完畢!

      iptraf用如下命令行調用:

      iptraf[-d interface][-s interface][-t ]

      如果調用iptraf時不帶參數,就會顯示一個菜單,讓你選擇監控界面以及想要監控的信息類型。這些選項用于觀察特定接口或網絡服務上的網絡流量。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$iptraf-ng

      觀察所有接口的網絡流量信息

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$iptraf-ng -d ens32 -t 1

      這條命令指定iptraf顯示以太網設備ets32 的詳細信息并在運行1分鐘后退出。我們可以看到,當前網絡設備接收速率為6.13kbps,發送速率為42.81kbps

      iptraf顯示每個UDP和TCP端口上的網絡流量信息。通過端口我們可以看到每個端口對應的服務處理了多少流量,下圖我們可以看到,有278kb的流量被22端口接收,有362kb的ssh數據從當前網卡發送出去

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$iptraf-ng -s ens32 -t 10

      netstat

      netstat是一種基本的網絡性能工具,它幾乎出現在每一個聯網的Linux機器上(當然我們也可以使用ss命令),可以用它抽取的信息包括:

      當前正在使用的網絡套接字的數量和類型,

      有關流入和流出當前系統的UDP和TCP數據包數量的特定接口統計數據。

      能將一個套接字回溯到其特定進程或PID,這在試圖確定哪個應用程序要對網絡流量負責時是很有用的。

      netstat [-p][-c] [-interfaces=cname>][-s][-t][-u] I-w]

      如果netstat 調用時不帶任何參數,它將顯示系統范圍內的套接字使用情況以及Internet域和UNIX域套接字的信息。(UNIX域套接字用于本機的進程通信。)為了能檢索所有其可以顯示的統計信息,需要從根目錄運行netstat。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$netstat | sed -n '20,30p' tcp 0 0 localhost:2379 localhost:51396 ESTABLISHED tcp 0 0 localhost:2379 localhost:33432 ESTABLISHED tcp 0 0 localhost:2379 localhost:33392 ESTABLISHED tcp 0 0 localhost:35008 localhost:9099 TIME_WAIT tcp 0 0 localhost:51154 localhost:2379 ESTABLISHED tcp 0 0 localhost:51390 localhost:2379 ESTABLISHED tcp 0 0 vms81.liruilongs.:53982 10.96.0.1:https ESTABLISHED tcp 0 0 localhost:51266 localhost:2379 ESTABLISHED tcp 0 0 localhost:51482 localhost:2379 ESTABLISHED tcp 0 0 localhost:2379 localhost:52920 ESTABLISHED tcp 0 0 localhost:2379 localhost:traceroute ESTABLISHED

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$netstat -p | sed -n '20,30p' tcp 0 0 localhost:2379 localhost:51396 ESTABLISHED 2025/etcd tcp 0 0 localhost:2379 localhost:33432 ESTABLISHED 2025/etcd tcp 0 0 localhost:2379 localhost:33392 ESTABLISHED 2025/etcd tcp 0 0 localhost:35008 localhost:9099 TIME_WAIT - tcp 0 0 localhost:51154 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 localhost:51390 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 vms81.liruilongs.:53982 10.96.0.1:https ESTABLISHED 108260/calico-node tcp 0 0 localhost:51266 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 localhost:51482 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 localhost:2379 localhost:52920 ESTABLISHED 2025/etcd tcp 0 0 localhost:2379 localhost:traceroute ESTABLISHED 2025/etcd

      然后我們看一個日常的運維腳本

      function network() { #獲取網卡流量信息,接收|發送的數據流量,單位為字節(bytes) net_monitor=$(cat /proc/net/dev | tail -n +3 | awk 'BEGIN{ print "網卡名稱 入站數據流量(bytes) 出站數據流量(bytes)"} {print ,,}' | column -t) #獲取暴露端口信息 ip_port=$(ss -ntulpa) #本地IP地址列表 localip=$(ip a s | awk '/inet /{print }' ) echo -e "\n3[32m################## 網絡 相關 ############3[0m\n" echo -e "|本地IP地址列表:" echo -e "3[31m$localip 3[0m" echo -e "3[32m------------------------------------3[0m" echo -e "|獲取網卡流量信息:" echo -e "3[31m$net_monitor 3[0m" echo -e "3[32m------------------------------------3[0m" echo -e "|獲取暴露端口信息:" echo -e "3[31m$ip_port 3[0m" echo -e "3[32m------------------------------------3[0m" }

      優化網絡IO使用情況

      當知道網絡發生了問題時,Linux提供了一組工具來確定哪些應用程序涉及其中。但是,在與外部機器連接時,對網絡問題的修復就不完全由你控制了。

      網絡設備發送/接收量接近理論極限了嗎?

      要做的第一件事就是用ethtool來確定每個Ethernet設備設置的硬件速度是多少。通過下面的配置文件我們可以看到,設置當前網卡帶寬為1000Mb/s

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$ethtool ens32 Settings for ens32: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: No Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: on MDI-X: off (auto) Supports Wake-on: d Wake-on: d Current message level: 0x00000007 (7) drv probe link Link detected: yes

      如果有這些信息的記錄,就可以調查是否有網絡設備處于飽和狀態。Ethernet設備和/或交換機容易被誤配置,ethtool顯示每個設備認為其應運行的速度。在確定了每個Ethernet設備的理論極限后,使用iptraf(甚至是ifconfig)來明確流經每個接口的流量。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$ifconfig ens32 ens32: flags=4163 mtu 1500 inet 192.168.26.81 netmask 255.255.255.0 broadcast 192.168.26.255 inet6 fe80::20c:29ff:fead:e393 prefixlen 64 scopeid 0x20 ether 00:0c:29:ad:e3:93 txqueuelen 1000 (Ethernet) RX packets 628172 bytes 109448643 (104.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 674109 bytes 362438519 (345.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      如果有任何網絡設備表現出飽和,轉到下面兩個節點。我們可以看到當前網卡接收的數據量為104M,發送的數據量為345M。這里我們可以通過watch監聽的方式看計算每秒的流量數據。

      也可以使用iptraf來實現,下面的命令統計流量的進出速率

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$iptraf-ng -d ens32 -t 1

      網絡設備產生了大量錯誤嗎?

      網絡流量減緩的原因也可能是大量的網絡錯誤。用ifconfig來確定是否有接口產生了大量的錯誤。大量錯誤可能是不匹配的Ethernet卡/Ethernet交換機設置的結果。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$ifconfig ens32 | grep err RX errors 0 dropped 0 overruns 0 frame 0 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$

      如果特定設備正在服務大量的數據,使用iptraf可以跟蹤該設備發送和接收的流量類型。當知道了設備處理的流量類型后,轉到下面的節點

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$iptraf-ng -s ens32 -t 10

      關于Linux性能調優中網絡I/O的一些筆記(linux網絡性能優化)

      接下來,我們想要確定是否有特定進程要為這個流量負責。使用netstat的 -p 選項來查看是否有進程在處理流經網絡端口的類型流量。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$netstat -p | grep 2379 tcp 0 0 localhost:33354 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 localhost:33416 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 localhost:51498 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 localhost:53062 localhost:2379 ESTABLISHED 14196/kube-apiserve tcp 0 0 localhost:2379 localhost:52520 ESTABLISHED 2025/etcd

      如果有應用程序要對此負責,轉到[流量是哪個遠程系統發送的]節點。如果沒有這樣的程序,則轉到[哪個應用程序套接字要為流量負責]。

      如果沒有應用程序應對這個流量負責,那么就可能是網絡上的某些系統用無用的流量攻擊了你的系統。要確定是哪些系統發送了這些流量,要使用iptraf或etherape。

      如果可能的話,請與系統所有者聯系,并嘗試找出發生這種情況的原因。如果所有者無法聯系上,可以在Linux內核中設置ipfilters,永久丟棄這個特定的流量,或者是在遠程機與本地機之間建立防火墻來攔截該流量。

      確定使用了哪個套接字要分兩步。這部分完全看不懂,先記錄下,

      第一步,用strace -e trace=file跟蹤應用程序所有的I/0系統調用。這能顯示進程是從哪些文件描述符進行讀寫的。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$yum -y install strace

      跟蹤執行kubectl get nodes涉及到的文件讀寫

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$kubectl get nodes NAME STATUS ROLES AGE VERSION vms81.liruilongs.github.io Ready control-plane,master 153d v1.22.2 vms82.liruilongs.github.io Ready 153d v1.22.2 vms83.liruilongs.github.io NotReady 153d v1.22.2 ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$strace -e trace=file kubectl get nodes execve("/usr/bin/kubectl", ["kubectl", "get", "nodes"], 0x7ffc888b4e40 /* 22 vars */) = 0 openat(AT_FDCWD, "/sys/kernel/mm/transparent_hugepage/hpage_pmd_size", O_RDONLY) = -1 ENOENT (沒有那個文件或目 錄) readlinkat(AT_FDCWD, "/proc/self/exe", "/usr/bin/kubectl", 128) = 16 openat(AT_FDCWD, "/usr/bin/kubectl", O_RDONLY|O_CLOEXEC) = 6 --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- --- SIGURG {si_signo=SIGURG, si_code=SI_TKILL, si_pid=22013, si_uid=0} --- openat(AT_FDCWD, "/root/.kube/cache/discovery/192.168.26.81_6443/policy/v1beta1/serverresources.json", O_RDONLY|O_CLOEXEC) = 6 ..........

      第二步,通過查看proc文件系統,將這些文件描述符映射回套接字。/proc//fd/中的文件是從文件描述符到實際文件或套接字的符號鏈接。該目錄下的1s-1a會顯示特定進程全部的文件描述符。名字中帶有socket的是網絡套接字。之后就可以利用這些信息來確定程序中的哪個套接字產生了這些通信。

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$ps -elF | grep etcd 4 S root 2025 2004 2 80 0 - 2803899 futex_ 96656 1 5月14 ? 00:33:14 etcd --advertise-client-urls=https://192.168.26.81:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://192.168.26.81:2380 --initial-cluster=vms81.liruilongs.github.io=https://192.168.26.81:2380 --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://192.168.26.81:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://192.168.26.81:2380 --name=vms81.liruilongs.github.io --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt 4 S root 14196 14020 10 80 0 - 311578 futex_ 445044 0 5月14 ? 01:54:30 kube-apiserver --advertise-address=192.168.26.81 --allow-privileged=true --token-auth-file=/etc/kubernetes/pki/liruilong.csv --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key 0 S root 24735 24319 0 80 0 - 28170 pipe_w 980 0 02:08 pts/1 00:00:00 grep --color=auto etcd ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$

      ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$cd /proc/2025/fd/ ┌──[root@vms81.liruilongs.github.io]-[/proc/2025/fd] └─$ls 0 102 109 116 121 126 131 136 18 22 27 31 36 40 45 5 54 59 64 71 78 83 9 95 1 103 11 117 122 127 132 14 19 23 28 32 37 41 46 50 55 6 65 73 79 84 90 97 .......

      當你看到這里的時候,你的問題可能得到也可能沒有得到解決,但是,你會獲取大量描述它的信息。在搜索引擎上看看他們是如何解決問題的。嘗試一個解決方案,并觀察系統或應用程序的行為是否發生了變化。每次嘗試新方案時,請轉到流程最開始重新開始系統診斷,因為,每一個修復都可能會讓應用程序的行為發生變化。

      如果涉及到網絡配置,也可用個通過NetworkManager服務來配置網絡相關的管理,網卡方面,可以通過nmcli dev status命令用來查看所有網絡設備的當前狀態。這部分感興趣小伙伴可以看看我之前的博文

      ┌──[root@liruilongs.github.io]-[~] └─$nmcli dev status DEVICE TYPE STATE CONNECTION privbr0 bridge connected privbr0 virbr0 bridge connected virbr0 eth0 ethernet connected eth0 vnet0 tun connected vnet0 vnet1 tun connected vnet1 lo loopback unmanaged -- virbr0-nic tun unmanaged --

      通過show命令 nmcli device show eth0可以查看網卡詳細信息

      ┌──[root@servera.lab.example.com]-[~] └─$nmcli device show eth0 GENERAL.DEVICE: eth0 GENERAL.TYPE: ethernet GENERAL.HWADDR: 52:54:00:00:FA:0A GENERAL.MTU: 1500 GENERAL.STATE: 100 (connected) GENERAL.CONNECTION: Wired connection 1 GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/1 WIRED-PROPERTIES.CARRIER: on IP4.ADDRESS[1]: 172.25.250.10/24 IP4.GATEWAY: 172.25.250.254 IP4.ROUTE[1]: dst = 172.25.250.0/24, nh = 0.0.0.0, mt = 100 IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 172.25.250.254, mt = 100 IP4.DNS[1]: 172.25.250.254 IP6.ADDRESS[1]: fe80::984:87d2:dba7:1007/64 IP6.GATEWAY: -- IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 100 IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255 ┌──[root@servera.lab.example.com]-[~] └─$

      相關的命令

      ┌──[root@servera.lab.example.com]-[~] └─$nmcli device connect disconnect lldp monitor set status delete help modify reapply show wifi

      man 幫助文檔

      DEVICE MANAGEMENT COMMANDS nmcli device {status | show | set | connect | reapply | modify | disconnect | delete | monitor | wifi | lldp} [ARGUMENTS...] Show and manage network interfaces. status Print status of devices. This is the default action if no command is specified to nmcli device. show [ifname] Show detailed information about devices. Without an argument, all devices are examined. To get information for a specific device, the interface name has to be provided. set [ifname] ifname [autoconnect {yes | no}] [managed {yes | no}] Set device properties. connect ifname Connect the device. NetworkManager will try to find a suitable connection that will be activated. It will also consider connections that are not set to auto connect. If no compatible connection exists, a new profile with default settings will be created and activated. This differentiates nmcli connection up ifname "$DEVICE" from nmcli device connect "$DEVICE" If --wait option is not specified, the default timeout will be 90 seconds. reapply ifname Attempt to update device with changes to the currently active connection made since it was last applied. modify ifname {option value | [+|-]setting.property value}... Modify the settings currently active on the device. This command lets you do temporary changes to a configuration active on a particular device. The changes are not preserved in the connection profile. See nm-settings(5) for the list of available properties. Please note that some properties can t be changed on an already connected device. You can also use the aliases described in PROPERTY ALIASES section. The syntax is the same as of the nmcli connection modify command. disconnect ifname... Disconnect a device and prevent the device from automatically activating further connections without user/manual intervention. Note that disconnecting software devices may mean that the devices will disappear. If --wait option is not specified, the default timeout will be 10 seconds. delete ifname... Delete a device. The command removes the interface from the system. Note that this only works for software devices like bonds, bridges, teams, etc. Hardware devices (like Ethernet) cannot be

      Linux TCP/IP 應用性能調優 網絡

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:23篇大數據系列(三)sql基礎知識(史上最全,建議收藏)(sql數據庫基礎知識筆記)
      下一篇:【人人都懂密碼學】一篇最易懂的Java密碼學入門教程(上) 【人人都懂密碼學】一篇最易懂的Java密碼學入門教程(中) 【人人都懂密碼學】一篇最易懂的Java密碼學入門教程(下)(JAVA密碼)
      相關文章
      亚洲精品福利网泷泽萝拉| 久久乐国产精品亚洲综合| 亚洲精品无码久久一线| 亚洲AV网一区二区三区| 久久久久亚洲精品日久生情 | 亚洲第一福利视频| 亚洲成a人片在线观看无码 | 中文字幕亚洲综合久久综合| 国产成人精品日本亚洲直接| 亚洲中文字幕人成乱码| 亚洲一级毛片免费在线观看| 亚洲国产品综合人成综合网站| 亚洲最大黄色网站| 亚洲一级毛片视频| 亚洲私人无码综合久久网| 亚洲精品无码中文久久字幕| 亚洲精品无码中文久久字幕| 香蕉视频亚洲一级| 亚洲日本一区二区一本一道 | 亚洲精品无码永久在线观看| 亚洲爽爽一区二区三区| 在线亚洲精品自拍| 国产亚洲真人做受在线观看| 国产成人亚洲综合无码精品| 亚洲第一AAAAA片| 亚洲自偷自拍另类图片二区| 亚洲毛片一级带毛片基地| 亚洲三级在线播放| 亚洲乱妇熟女爽到高潮的片| 老子影院午夜伦不卡亚洲| 亚洲精品乱码久久久久久蜜桃| 久久精品国产亚洲一区二区三区| 亚洲中文字幕无码一区| 亚洲av最新在线网址| 亚洲精品免费在线视频| 亚洲情A成黄在线观看动漫软件| 亚洲色大成网站www永久男同 | 在线观看亚洲精品专区| 亚洲伊人成无码综合网| 亚洲VA中文字幕无码毛片| 亚洲视频在线免费观看|