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
- C10K问题 最初的服务器是基于进程/线程模型。新到来一个TCP连接,就需要分配一个进程。假如有C10K,就需要创建1W个进程,可想而知单机是无法承受的。那么如何突破单机性能是高性能网络编程必须要面对的问题,进而这些局限和问题就统称为C10K问题,基于 I/O 多路复用和请求处理的优化,C10K 问题很容易解决。
- C1000K 也就是单机支持处理 100 万个请求(并发连接 100 万)的问题。
epoll惊群问题
- 当有一个新连接来时,却唤醒了多个进程来处理。但实际上只有一个进程来响应这个事件,其他被唤醒的进程都会重新休眠。
网络性能指标
- 带宽:表示链路的最大传输速率,单位是 b/s(比特 / 秒)。为服务器选购网卡时,带宽就是最核心的参考指标。常用的带宽有 1000M、10G、40G、100G 等。
- 吞吐量:表示没有丢包时的最大数据传输速率,单位通常为 b/s (比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽的限制,吞吐量 / 带宽也就是该网络链路的使用率。
- 延时:表示从网络请求发出后,一直到收到远端响应,所需要的时间。 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
- 工具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特性
- 可变窗口
- 阻塞控制
- 慢启动
- Nagle算法
- 延时确认(延时ACK,与其他报文合并一起发送),如 [PSH, ACK]
- 重复确认检测
当网络数据包处理没有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;
报文,分片,分组,帧