关于Linux性能调优中网络I/O的一些笔记

Posted 山河已无恙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Linux性能调优中网络I/O的一些笔记相关的知识,希望对你有一定的参考价值。

写在前面


  • 和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门

  • 博文内容结合《Linux性能优化》读书笔记整理

  • 涉及内容包括

    • 常用的优化工具(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)。
  • 理解不足小伙伴帮忙指正

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波


学习网络调优工具之前,简单温习一下网络I/O相关的知识

涉及名词解释

带宽(传输速率):数据传输的过程中,两个设备之间数据流动的物理速度称为传输速率,单位为bps(Bits Per Second,每秒比特数),传输速率不是指单位数据流动的速度,而是指单位时间内传输的数据量有多少。传输速率有被称之为带宽(Bandwidth),带宽越大网络传输能力就越强。

吞吐量:主机之间的实际的传输速率被称为吞吐量,单位与带宽相同,吞吐量还衡量CPU处理能力,网络的拥堵程度,报文中数据字段的占有份额。

网卡:网络接口卡,也称网络适配器,网卡,LAN卡。联网时必须使用。

路由器:在OSI模型的第3层-网络层面上连接两个网络(路由寻址,类似送快递)、并对分组报文进行转发的设备。涉及路由控制表(静态路由,动态路由OSPF,默认路由)

交换机:在OSI模型的第2层-数据链路层上连接局域网的主要设备,交换机能够根据以太网帧中目标地址智能的转发数据,涉及地址转发表(通过MAC地址学习记录实际的MAC地址本身)

包,数据帧,数据报,段,消息:包为全能性术语,帧表示数据链路层中包的单位,而数据报是IP和UDP 等网络层以上的分层中包的单位,段则表示TCP数据中流的信息,消息是指应用协议中数据的单位。

网络I/O介绍

Linux和其他主流操作系统中的网络流量被抽象(协议分层与OSI参考模型)为一系列的硬件和软件层次。在每个分层上,发送端添加首部包装信息,经过路由器,接受端分离首部恢复数据。当然路由器的传递也涉及网络层和链路层的首部分离和添加。简单回顾下

分层描述
应用层应用层涉及协议比较多TELNET,SSH,HTTP,SMTP,POP,SSL/TLS,FTP,MIME,html,SNMP,MIB……,主要负责声明目标地址(请求头)以及写入内容(请求报文)
表示层表示层负责将机器特定的数据格式转化为网络标准的传输格式发送出去
会话层会话层决定采用那种连接方式?同时标记数据包的发送顺序
传输层传输层即进行建立连接或者断开连接,在两个主机之间创建逻辑上的通信连接,确保数据是否到达,没到达重发,保证数据的可靠性,涉及到的协议包括 TCP,UDP,DCDC
网络层网络层将数据从发送端主机发送到接收端主机。涉及到的协议包括ARP,IPv4,IPv6,ICMP(ping),IPsec
链路层包括以太网,无线LAN,PPP,数据链路层负责实现每一个区间内的通信。通信实际上是通过物理的传输介质实现的,数据链路层在传输介质互连的设备进行数据处理。
物理层硬件层,物理层将数据的01转换为电压和脉冲光传输给物理的传输介质,相互直连的设备通过MAC(Media Access Control,介质访问控制)实现传输。物理层将MAC地址信息的首部附加到从网络层转发过来的数据上,将其发送到网络

在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<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
cali13a4549bf1e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
cali45e02b0b21e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
cali5a282a7bbb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
cali86e7ca9e9c2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
calicb34164ec79: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
tunl0: flags=193<UP,RUNNING,NOARP>  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<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        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<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
        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

关于部分参数的说明

说明
RX packets设备已接收的数据包数
TX packets设备已发送的数据包数
errors发送或接收时的错误数
dropped发送或接收时丢弃的数据包数
overruns网络设备没有足够的缓冲区来发送或接收一个数据包的次数
frame底层以太网帧错误的数量
carrier由于链路介质故障(如故障电缆)而丢弃的数据包数量

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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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代表发送。

说明
bytes发送或接收的字节数
packets发送或接收的数据包数
errors发送或接收时发生的错误数
dropped由于网卡缺少资源,导致未发送或接收的数据包数
overruns网络没有足够的缓冲区空间来发送或接收更多数据包的次数
mcast已接收的多播数据包的数量
carrier由于链路介质故障(如故障电缆)而丢弃的数据包数量
collsns传送时设备发生的冲突次数。当多个设备试图同时使用网络时就会发生冲突

sar

sar提供了链路级的网络性能数据。但是,它同时还提供了一些关于传输层打开的套接字数量的基本信息。sar使用如下命令行来收集网络统计信息:

sar[-n DEV | EDEV | SOCK | FULL ] [DEVICE] [linterval][count]
选项说明
-n DEV显示每个设备发送和接收的数据包数和字节数信息
-n EDEV显示每个设备的发送和接收错误信息
-n SoCK显示使用套接字(TCP、UDP和RAW)的总数信息
-n FULL显示所有的网络统计信息
interval采样间隔时长
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]
└─$
说明
rxpck/s数据包接收速率
txpck/s数据包发送速率
rxkB/skb接收速率
txkB/skb发送速率
rxcmp/s压缩包接收速率
txcmp/s压缩包发送速率
rxmcst/s多播包接收速率

显示每个设备的发送和接收错误信息

┌──[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]
└─$
说明
rxerr/s接收错误率
txerr/s发送错误率
co11/s发送时的以太网冲突率
rxdrop/s由于Linux内核缓冲区不足而导致的接收帧丢弃率
txdrop/s由于Linux内核缓冲区不足而导致的发送帧丢弃率
txcarr/s由于载波错误而导致的发送帧丢弃率
rxfram/s由于帧对齐错误而导致的接收帧丢弃率
rxfifo/s由于FIFO错误而导致的接收帧丢弃率
txfifo/s由于FIFO错误而导致的发送帧丢弃率

显示使用套接字(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]
└─$
说明
totsck当前正在被使用的套接字总数
tcpsck当前正在被使用的TCP套接字总数
udpsck当前正在被使用的UDP套接字总数
rawsck当前正在被使用的RAW套接字总数
ip-fragIP分片的总数

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 <minutes>]

如果调用iptraf时不带参数,就会显示一个菜单,让你选择监控界面以及想要监控的信息类型。这些选项用于观察特定接口或网络服务上的网络流量。

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

观察所有接口的网络流量信息

选项说明
-d interface接口的详细统计信息,包括:接收信息、发送信息以及错误率信息
-s interface关于接口上哪些IP端口正在被使用,以及有多少字节流经它们的统计信息
-tiptraf退出前运行的分钟数
┌──[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
选项说明
-p给出打开每个被显示套接字的PID/程序名
-c每秒持续更新显示信息
–interfaces=显示指定接口的网络统计信息
-statistics/ -sIP/UDP/ICMP/TCP统计信息
–tcp / -t仅显示TCP套接字相关信息
–udp / -u仅显示UDP套接字相关信息
-raw / -w仅显示RAW套接字相关信息(IP和ICMP)
┌──[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

以上是关于关于Linux性能调优中网络I/O的一些笔记的主要内容,如果未能解决你的问题,请参考以下文章

关于Linux性能调优中磁盘IO调优的一些笔记

关于Linux性能调优中磁盘IO调优的一些笔记

关于Linux性能调优中系统CPU监测信息统计的一些笔记

关于Linux性能调优中系统CPU监测信息统计的一些笔记

Linux性能调优中内存调优工具的一些笔记整理

Linux性能调优中内存调优工具的一些笔记整理