linux网络性能优化(代码片段)

vector6_ vector6_     2023-01-11     720

关键词:

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 请求的汇总

linux网络通信优化方法(代码片段)

Linux网络在性能方面有哪些优化手段可用呢?本文将给出一些开发或者运维中的Linux网络性能优化建议。要注意的是,每一种性能优化方法都有它适用或者不适用的应用场景,应当根据当前的项目现状灵活来选择用或... 查看详情

linux网络性能的15个优化建议(代码片段)

建议1:尽量减少不必要的网络IO我要给出的第一个建议就是不必要用网络IO的尽量不用。是的,网络在现代的互联网世界里承载了很重要的角色。用户通过网络请求线上服务、服务器通过网络读取数据库中数据,通过... 查看详情

linux网络性能优化(代码片段)

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

关于linux性能调优中网络i/o的一些笔记(代码片段)

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,ip,sar,iptraf,netstat)使用Demo及对应的输出解释具体的调优策... 查看详情

关于linux性能调优中网络i/o的一些笔记(代码片段)

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,ip,sar,iptraf,netstat)使用Demo及对应的输出解释具体的调优策... 查看详情

linux性能优化——dns解析(代码片段)

Linux性能优化——DNS解析在TCP/IP不同协议层我们所关注的网络性能指标不同,在应用层,我们关注的是应用程序的并发连接数、每秒请求数、处理延迟、错误数等,可以使用wrk、JMeter等工具,模拟用户的负载,... 查看详情

使用iperf工具测试linux网络性能(代码片段)

在Linux网络设备开发过程中,我们常常需要测试网络性能指标参数,找出网络性能瓶颈,从而优化我们的软件或者硬件设计。在Linux环境中,我们可以使用iperf命令工具测试网络性能,包括网络带宽、延迟抖动... 查看详情

使用iperf工具测试linux网络性能(代码片段)

在Linux网络设备开发过程中,我们常常需要测试网络性能指标参数,找出网络性能瓶颈,从而优化我们的软件或者硬件设计。在Linux环境中,我们可以使用iperf命令工具测试网络性能,包括网络带宽、延迟抖动... 查看详情

android—性能优化3—网络优化(代码片段)

文章目录网络优化正确的认识流量消耗网络优化维度其他网络请求误区网络优化工具选择NetworkProifiler抓包工具stetho流量优化如何判断APP流量消耗偏高如何测试,测试方案线上线下流量获取线上流量获取方案NetworkStatsManager(线上可... 查看详情

关于linux系统调优这一篇文章就够了(代码片段)

...能评估4.2CPU性能评估4.3内存性能评估4.4磁盘I/O性能评估4.5网络性能评估5.系统优化实战5.1找出系统中使用CPU最多的进程5.2找出系统中使用内存最多的进程5.3找出系统中对磁盘读写最多的进程5.4找出系统中使用网络最多的进程5.5优... 查看详情

10个问题带你全面理解linux性能优化(代码片段)

10个问题带你全面理解Linux性能优化•Feiskyhttps://feisky.xyz/posts/2020-06-06-linux-perf/本文整理自极客时间“10个问题带你全面理解Linux性能优化”直播,PPT下载请参考文末的InfoQ官方网站[1]。目录1.为什么面试官喜欢考察性能优化问... 查看详情

linux内核性能优化tcp调优(代码片段)

文章目录前言一、TCP三次握手原理二、TCP四次挥手原理三、性能优化1.TCP三次握手优化tcp_syn_retriestcp_max_syn_backlogsomaxconnsyncookiestcp_synack_retriestcp_abort_on_overflow2.TCP四次挥手优化tcp_orphan_retriestcp_max_orphanstcp_fin_timeouttcp_ 查看详情

linux内核性能优化tcp调优(代码片段)

文章目录前言一、TCP三次握手原理二、TCP四次挥手原理三、性能优化1.TCP三次握手优化tcp_syn_retriestcp_max_syn_backlogsomaxconnsyncookiestcp_synack_retriestcp_abort_on_overflow2.TCP四次挥手优化tcp_orphan_retriestcp_max_orphanstcp_fin_timeouttcp_ 查看详情

前端性能优化分类(代码片段)

...化的七大手段,包括减少请求数量、减小资源大小、优化网络连接、优化资源加载、减少重绘回流、使用性能更好的API和构建优化 减少请求数量【合并】  如果不进行文件合并,有如下3个隐患  1、文件与文件之间有插... 查看详情

linux-linux系统优化思路(代码片段)

文章目录影响Linux性能的因素CPU内存磁盘I/O性能网络宽带操作系统相关资源系统安装优化内核参数优化文件系统优化应用程序软件资源系统性能分析工具vmstat命令iostat命令sar命令系统性能分析标准小结影响Linux性能的因素CPUCPU是... 查看详情

linux内核性能优化ulimit(nprocnofile)(代码片段)

...久修改结尾一、ulimit介绍为了防止失控的进程破坏系统的性能,UNIX和Linux会跟踪进程使用的大部分资源,并允许用户和系统管理员使用对进程的资源限制,例如控制某个进程打开的文件数、对某个用户打开系统进程数进行限制等,一... 查看详情

linux内核性能优化ulimit(nprocnofile)(代码片段)

...久修改结尾一、ulimit介绍为了防止失控的进程破坏系统的性能,UNIX和Linux会跟踪进程使用的大部分资源,并允许用户和系统管理员使用对进程的资源限制,例如控制某个进程打开的文件数、对某个用户打开系统进程数进行限制等,一... 查看详情

linux系统进程管理和性能优化(代码片段)

bg、fg举例:首先创建一进程:(whiletrue;doecho-n"LLoveYou">>~/1.txt;sleep2;done)进程含义是每隔两秒在1.txt里写入LLoveYou此时可以打开另一个xshell窗口输入命令tail-f1.txt进行跟踪查看(tail是什么?)输入jobs-pl可以列... 查看详情