Linux网络性能优化
Posted vector6_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的输出内容主要有:
-
每个是每个 ICMP 请求的信息,包括 ICMP 序列号(icmp_seq)、TTL(生存时
间,或者跳数)以及往返延时。
-
三次 ICMP 请求的汇总
以上是关于Linux网络性能优化的主要内容,如果未能解决你的问题,请参考以下文章