Linux网络性能优化

Linux网络性能优化

我们知道,Linux 网络根据 TCP/IP 模型,构建其网络协议栈。TCP/IP 模型由应用层、传输层、网络层、网络接口层等四层组成。而本文将对Linux网络相关性能观测及优化进行分析。

性能指标

我们常用的衡量网络性能的指标有带宽、吞吐量、延时、PPS(Packet Per Second)等

  • 带宽,表示链路的最大传输速率,单位通常为b/s(比特/秒)
  • 吞吐量,表示单位时间内成功传输的数据量,单位通常为b/s(比特/秒)或者B/s(字节/秒)。吞吐量受带宽限制,而吞吐量/带宽即该网络的使用率。
  • 延时,表示从网络请求发出后,直到收到远端响应,所需要的时间延迟。在不同场景中,延时表示的含义可能不同,例如,延时可以表示建立连接需要的时间(TCP握手延时),或一个数据包往返所需的时间(比如RTT)。
  • PPS(Packet Per Second),表示以网络包为单位的传输速率。PPS通常用来评估网络的转发能力。
  • 可用性,网络能否正常通信
  • 并发连接数,TCP连接数量
  • 丢包率
  • 重传率,重新传输的网络包比例

网络配置

分析网络问题一般要从查看网络接口的配置和状态入手。通常可以使用ip或ifconfig命令,一般都会显示网络接口的状态标志、MTU 大小、IP、子网、MAC 地址以及网络包收发的统计信息等。

cfs@cfs:~$ ip -s addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:05:48:3b brd ff:ff:ff:ff:ff:ff
    inet 192.168.43.189/24 brd 192.168.43.255 scope global dynamic noprefixroute ens33
       valid_lft 2909sec preferred_lft 2909sec
    inet6 240e:47c:3028:c4df:edb9:1c9a:3b01:1520/64 scope global temporary dynamic 
       valid_lft 3416sec preferred_lft 3416sec
    inet6 240e:47c:3028:c4df:37ff:630f:d2a1:ee71/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 3416sec preferred_lft 3416sec
    inet6 fe80::daff:b8ca:de10:da44/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    142142331  295148   0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    7506122    64665    0       0       0       0 

我们此时关注的与网络性能密切相关的指标有:

  • 网络接口的状态标志。ifconfig输出中的RUNNING,或ip输出中的LOWER_UP,都表示物理网络是联通的,即网卡已经连接到了交换机或路由器中。

  • MTU的大小。MTU默认大小是1500,根据网络架构的不同(比如是否使用了VXLAN等叠加网络),可能需要调大或者调小MTU

  • 网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,需要确保配置正确

  • 网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O问题。其中:

    errors表示发生错误的数据包数,比如校验错误,帧同步等;

    dropped表示丢弃的数据包数,即数据包已经收到了Ring Buffer,但因为内存不足等原因丢包;

    overruns表示超限数据包数,即网络I/O速度过快,导致Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;

    carrier表示发生carrier错误的数据包数,比如双工模式不匹配、物理电缆出问题等;

    collisions表示碰撞数据包数。

套接字信息

ifconfig 和 ip 只显示了网络接口收发数据包的统计信息,但在实际的性能问题中,网络协议栈中的统计信息,我们也必须关注。可以用 netstat 或者 ss ,来查看套接字、网络栈、网络接口以及路由表的信息。

root@cfs:/home/cfs# netstat -nlp | head -n 3
激活Internet连接 (仅服务器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      621/systemd-resolve 

netstat 和 ss 的输出也是类似的,都展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。

其中,接收队列(Recv-Q)和发送队列(Send-Q)需要特别关注,它们通常应该是0。当你发现它们不是 0 时,说明有网络包的堆积发生。并且在不同套接字状态下,它们的含义不同

  • 当套接字处于连接状态(Established)时

    Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。

    而 Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。

  • 当套接字处于监听状态(Listening)时,

    Recv-Q表示 syn backlog 的当前值。

    而Send-Q表示最大的syn backlog值。

我们知道TCP状态维护有几个重要的结构, syn backlog 是 TCP 协议栈中的半连接队列长度,相应的也有一个全连接队列(acceptqueue)

协议栈统计信息

同样,使用netstat 或 ss 也可以查看协议栈的信息:

root@cfs:/home/cfs# netstat -s
...
Tcp:
    14600 active connection openings
    0 passive connection openings
    13545 failed connection attempts
    7 connection resets received
    0 connections established
    52828 segments received
    48328 segments sent out
    990 segments retransmitted
    15 bad segments received
    11483 resets sent
Udp:
    115131 packets received
    113 packets to unknown port received
    0 packet receive errors
    113545 packets sent
    0 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 212345

如上netstat 的输出示例,展示了 TCP 协议的主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息。

网络吞吐和PPS

可以使用sar查看系统当前的网络吞吐量和 PPS

root@cfs:/home/cfs# sar -n DEV 1
Linux 5.4.0-80-generic (cfs) 	2021年10月04日 	_x86_64_	(4 CPU)

00时57分37秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
00时57分38秒   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00时57分38秒     ens33      1.00      0.00      0.30      0.00      0.00      0.00      0.00      0.00
00时57分38秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

其中:

rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒。

rxkB/s 和 txkB/s 分别是接收和发送的吞吐量,单位是 KB/ 秒。

rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包 / 秒。

%ifutil 是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为 max(rxkB/s, txkB/s)/Bandwidth

连通性和延时

对于连通性和延时,当然我们使用基于ICMP协议的ping来测试

root@cfs:/home/cfs# ping -c3 www.163.com
PING www.163.com(240e:969:5000::407 (240e:969:5000::407)) 56 data bytes
64 bytes from 240e:969:5000::407 (240e:969:5000::407): icmp_seq=1 ttl=53 time=90.1 ms
64 bytes from 240e:969:5000::407 (240e:969:5000::407): icmp_seq=2 ttl=53 time=79.4 ms
64 bytes from 240e:969:5000::407 (240e:969:5000::407): icmp_seq=3 ttl=53 time=97.7 ms

--- www.163.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 79.435/89.105/97.747/7.519 ms

ping 的输出内容主要有:

  1. 每个是每个 ICMP 请求的信息,包括 ICMP 序列号(icmp_seq)、TTL(生存时

    间,或者跳数)以及往返延时。

  2. 三次 ICMP 请求的汇总

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值