Linux性能优化实践——网络

[TOC]

Linux性能优化实践——网络

网卡是发送和接收网络包的基本设备。在系统启动过程中,网卡通过内核中的网卡驱动程序注册到系统中。而在网络收发过程中,内核通过中断跟网卡进行交互。

接收队列(Recv-Q)和发送队列(Send-Q),它们通常应该是 0。发现它们不是 0 时,说明有网络包的堆积发生。

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

  • Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。
  • Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。

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

  • Recv-Q 表示 syn backlog 的当前值。(syn backlog 表示TCP 协议栈中的半连接队列长度)
  • Send-Q 表示最大的 syn backlog 值。

netstat -s, ss -s 展示网络主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息。

OSI表示层作用

  • 表示层是处理所有与数据表示及运输有关的问题,包括转换、加密和压缩。
  • 语法转换:语法转换涉及代码转换和字符集的转换,数据格式的修改、数据结构操作的适配、数据压缩、数据加密等。

C10K 和 C1000K

  1. C10K问题 最初的服务器是基于进程/线程模型。新到来一个TCP连接,就需要分配一个进程。假如有C10K,就需要创建1W个进程,可想而知单机是无法承受的。那么如何突破单机性能是高性能网络编程必须要面对的问题,进而这些局限和问题就统称为C10K问题,基于 I/O 多路复用和请求处理的优化,C10K 问题很容易解决。
  2. C1000K 也就是单机支持处理 100 万个请求(并发连接 100 万)的问题。

epoll惊群问题

  1. 当有一个新连接来时,却唤醒了多个进程来处理。但实际上只有一个进程来响应这个事件,其他被唤醒的进程都会重新休眠。

网络性能指标

  1. 带宽:表示链路的最大传输速率,单位是 b/s(比特 / 秒)。为服务器选购网卡时,带宽就是最核心的参考指标。常用的带宽有 1000M、10G、40G、100G 等。
  2. 吞吐量:表示没有丢包时的最大数据传输速率,单位通常为 b/s (比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽的限制,吞吐量 / 带宽也就是该网络链路的使用率。
  3. 延时:表示从网络请求发出后,一直到收到远端响应,所需要的时间。 4.PPS: Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS通常用来评估网络的转发能力,而基于 Linux 服务器的转发,很容易受到网络包大小的影响

PPS网络包为单位的网络传输速率,通常用在需要大量转发的场景中。对 TCP 或者 Web 服务来说,更多会用并发连接数和每秒请求数(QPS)等指标 iperf 和 netperf 都是最常用的网络性能测试工具 在协议栈的不同层,我们所关注的网络性能也不尽相同。

iperf3测量网络性能

#安装
yum install -y iperf3

#服务端
# -s 表示启动服务端,-i 表示汇报间隔,-p 表示监听端口 
iperf3 -s -i 1 -p 10000

#客户端
# -c 表示启动客户端,192.168.0.30 为目标服务器的 IP
# -b 表示目标带宽 (单位是 bits/s)
# -t 表示测试时间
# -P 表示并发数,-p 表示目标服务器监听端口
iperf3 -c 192.168.33.30 -b 1G -t 15 -P 2 -p 10000


DDoS 攻击

  • SYN Flood 正是互联网中最经典的 DDoS 攻击方式
  • 构造大量的 SYN 包,请求建立 TCP 连接;而服务器收到包后,会向源 IP 发送 SYN+ACK 报文,直到超时。
  • 大量的半开连接就会导致连接表迅速占满,从而无法建立新的 TCP连接
  • DDoS 会导致软中断 CPU 使用率(softirq)升高
  • hping3 命令,来模拟 DoS 攻击 模拟SYN Flood 攻击hping3 -S -p 80 -i u10 192.168.0.3
  • 很多网络攻击利用,比如端口扫描工具 nmap、组包工具 hping3 等

Nagle 算法正是为了解决这个问题。它通过合并TCP 小包,提高网络带宽的利用率。

DNS

  1. 工具nslookup, dig 安装yum install -y bind-utils

查看网络发送接口包及吞吐量

(sar位于sysstat) sar -n DEV 1 查看网卡带宽 ` ethtool eth0`

#查看网络发送接口包及吞吐量 (sar位于sysstat)
sar -n DEV 1

#网络时延通过ping来看

#hping3 命令,来模拟 DoS 攻击 模拟SYN Flood 攻击
# -S 参数表示设置 TCP 协议的 SYN(同步序列号),-p 表示目的端口为 80
# -i u10 表示每隔 10 微秒发送一个网络帧
$ hping3 -S -p 80 -i u10 192.168.0.3

#针对80端口抓包 
tcpdump port 80

Tcp特性

  1. 可变窗口
  2. 阻塞控制
  3. 慢启动
  4. Nagle算法
  5. 延时确认(延时ACK,与其他报文合并一起发送),如 [PSH, ACK]
  6. 重复确认检测

当网络数据包处理没有CPU负载均衡策略,网络中断会在同一个CPU上处理,达到100%时,会成为瓶颈。

tcp 握手要三次,断开挥手要四次,这是由于半关闭的原因,需要单独关闭各自的发送接收通道

MSS

  • 最大报文长度,tcp传忘另一端的最大块数据长度
  • 只能出现在建立连接SYN阶段,双方发送各自的mss

MTU

最大传输单元, mtu = mss + ip首部大小 + tcp首部大小

IP数据包通常40字节,ip首部20字节,tcp首部20字节

Tcp flag

  • F : FIN - 结束; 结束会话
  • S : SYN - 同步; 表示开始会话请求
  • R : RST - 复位;中断一个连接,如 超过处理能力,对新的SYN连接,回复RST丢弃连接
  • P : PUSH - 推送; 数据包立即发送, 尽可能快的取走数据
  • A : ACK - 应答
  • U : URG - 紧急
  • E : ECE - 显式拥塞提醒回应
  • W : CWR - 拥塞窗口减少

网络分析:通常涉及网络接口卡,交换机,路由器,交换机,内核协议栈TCP/IP等 SYN 包在接收队列满时,会被直接丢弃,导致重传,增加时延 使用率:当前吞吐量除以带宽

MSS 最大报文长度,MTU 最大传输单元,tcp模块通常设置MSS = MTU - 40

带宽时延积

带宽乘以时延(ping)得到网络中可以“飞行”的字节数, 尤其评估通告窗口的大小

Nagle算法

启用时,可以合并小包,增大网络吞吐量,但是可能会增加应用的时延 关闭时,小包会及时发送,时延小,但是吞吐量会下降 该算法,限制发送者在任何时候,只能有一个发送的小报文未被确认 在较慢的广域网,启用它来减少小报文,提高传输效率

流量控制

  • 滑动窗口
    • 发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
  • 拥塞窗口
  • 通告窗口

慢启动

指数扩展拥塞窗口的大小(cwnd)

  • 每收到一个ACK, cwmd = cwmd + 1
  • 每过一个RTT时延,cwnd = 2 * cwmd

TCP的Keep-Alive

TCP重传机制

发送方先把数据按字节编号(序列号),发出报文,等待ACK,一定时间内未收到数据,发送方将重传。

TCP32序号和32位确认序号

  • 每个传输的字节都会被计数,一个序号反映一次tcp通信一个方向的字节的序号
  • ISN, 连接的初始序号,随时间变化,每4ms加1,防止网络延迟的分组被传达导致接收方错误的解释。

TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。

再谈TIME_WAIT

  • 主动关闭的一方会进入这个状态
  • 过多的TIME_WAIT会导致占用太多的文件句柄,端口等,导致出现too many open files
  • 持续2msl, 防止之前迷路的包,在后续到达影响新的连接,(区分一个连接的唯一标识就是双方的ip和port,为了避免在2msl时间内同样的ip和port被再次使用而出问题)
  • 处于此状态时,收到任何报文都作废
  • 可配置proc中net.ipv4.tcp_tw_reuse快速回收
  • 通常客户端主动关闭,但是当服务端主动关闭如重启,会导致2msl时间内不能使用之前端口,如80,3306等

Wireshark & tcpdump

seq

  • tcpdump 初次seq显示绝对值,后续seq都是相对偏移量,
  • 要得到绝对的seq需要加上-S,如 tcpdump -i enp0s8 -n -S port 8081

**win **

  • 实际接收数据的通告窗口大小

wscale:窗口扩大因子

TS val: 发送端时间戳

ecr:时间戳回显应答

sackOK:表示发送端支持同意使用SACK选项,TCP通信时,如果发送序列中间某个数据包丢失,TCP会通过重传最后确认的包开始的后续包,这样原先已经正确传输的包也可能重复发送,急剧降低了TCP性能。为改善这种情况,发展出SACK(Selective Acknowledgment, 选择性确认)技术,使TCP只重新发送丢失的包,不用发送后续所有的包.

[PSH, ACK] [TCP ZeroWindow]

[TCP window Full] window填满了,警告数据发送方没有更多空间来接受更多数据了,直到收到一个update说buffer已经清空了.

[TCP window Update]

[TCP segment of a reassembled PDU] ssl

[RST, ACK]

calculated window size 与 Window size

关注点 平均数据包大小是多少?

TCP发送接收缓存区怎么看?怎么改大小 while true;do curl http://openfilecache.static.com:8081/index1.html &> /dev/null;sleep 0.5; done; 报文,分片,分组,帧