NOTE

5.6 网络调优

1. 网络性能指标 1.1. 网络层 - 它们主要负责网络包的封装、寻址、路由,以及发送和接收 - 性能指标: - 每秒可处理的网络包数 PPS。 - 可以用内核自带的发包工具 pktgen 测试 1.2. 传输层 - 它们主要负责网络传输 - 性能指标: - 吞吐量(BPS) - 连接数以及延迟

Operating System / Linux创建于 更新于 约 2 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 网络性能指标

1.1. 网络层

  • 它们主要负责网络包的封装、寻址、路由,以及发送和接收
  • 性能指标:
    • 每秒可处理的网络包数 PPS。
  • 可以用内核自带的发包工具 pktgen 测试

1.2. 传输层

  • 它们主要负责网络传输
  • 性能指标:
    • 吞吐量(BPS)
    • 连接数以及延迟
  • 可以用 iperf 或 netperf ,来测试传输层的性能。

1.3. 应用层

  • 性能指标:
    • 吞吐量(BPS)、
    • 每秒请求数
    • 延迟
  • 可以用 wrk、ab 等工具,来测试应用程序的性能

2. 网络性能工具

2.1. sar

sar.md

2.2. nethogs

nethogs.md

2.3. iftop

iftop.md

2.4. netstat

netstat.md

2.5. ping

2.6. traceroute

traceroute.md

2.7. nslookup

nslookup.md

2.8. dig

dig.md

2.9. tcpdump

tcpdump.md

2.10. wireshark

3. 如何分析网络性能瓶颈

3.1. 查看是否 IO 瓶颈

  • top 命令查看 CPU 负载(load average)和 CPU 使用率(%Cpu),如果前者高,后者低那么是网络 IO 或者磁盘 IO 瓶颈

3.2. 查看是否网络 IO 瓶颈

top 查看 iowait 是否比较高,是的话可能是磁盘 IO 瓶颈;iostat -xdk 1 10 查看 %util 是否比较高,是的话确实是磁盘 IO 瓶颈 如果两者都低那么是网络 IO 问题

3.3. 找到 IO 占用高的进程

  • 使用 iftop 找到流量占用最高的 IP:Port
  • 使用 netstat 找到 IP:Port 对应的进程 PID
  • ps -e -L h o state,cmd | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

3.4. 分析进程

  • 延迟问题:使用 ping 或者 traceroute 查看两台机器的延迟是否比较高,采用同地区部署等方式解决
  • 带宽问题:使用 pktgen 等工具测试带宽,使用sar -n DEV 1等工具查看当前使用带宽,如果超过了那么是网络 IO 瓶颈。
    • 数据量问题:使用tcpdump -i 网卡名 -v -nn tcp port 端口号 -w test.cap在业务服务器以及存储服务器抓包;使用 wireshark 分析是否存在分包的现象,是则根据应用逻辑压缩处理。假设 QPS 为 10W,数据包大小为 4K,那么带宽需要 3.2Gbit/s,那么就需要 10Gbit/s 的链路
  • 重复/丢包问题:使用tcpdump -i 网卡名 -v -nn tcp port 端口号 -w test.cap在业务服务器以及存储服务器抓包;使用 wireshark 分析是否存在重复/丢包现象,是则找运维一起处理
  • 连接数问题:netstat -antp |awk '/tcp/ {print $6}' |sort|uniq -c查看 ESTABLISHED 的数量,太小的话可能是连接池问题

4. 丢包问题

4.1. 查看是否有丢包

dmesg | grep "TCP: drop open request from"
netstat -ant|grep SYN_RECV|wc -l

4.2. 分析丢包原因

  1. 半连接队列满了
sysctl -w net.ipv4.tcp_max_syn_backlog=1024
//syncookie机制
sysctl -w net.ipv4.tcp_syncookies=1
  1. 全连接队列满了
ss -lnt
Recv-Q:当前全连接队列的大小,也就是当前已完成三次握手并等待服务端 accept() 的 TCP 连接;
Send-Q:当前全连接最大队列长度,上面的输出结果说明监听 8088 端口的 TCP 服务,最大全连接长度为 128;
cat /proc/sys/net/ipv4/tcp_abort_on_overflow
  1. 最大连接数
cat /proc/sys/net/netfilter/nf_conntrack_max

5. 超时问题实战

看了下 <SERVICE_A> 的 <API_A> 接口(领取礼包)的超时主要是因为 <SERVICE_B> 服务 <API_B> 接口慢。 可能一方面需要调用 <DELIVERY_SYSTEM> 的发货,另一方面 sql 比较复杂; 再加上提供的是单个领取的不支持批量领取,而我这边是并发调用,量一大就比较容易超时了

6. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看