NOTE

5.6 网络调优

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

Operating System / Linux创建于 更新于 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 查看 ioutil 是否比较高,是的话确实是磁盘 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. 超时问题实战

看了下 game_center_svr 的 ReceiveGameGift 接口(领取礼包)的超时主要是因为 giftpack 服务 Collect 接口慢图片未迁移。 可能一方面需要调用 ams 的发货,另一方面 sql 比较复杂图片未迁移; 再加上提供的是单个领取的不支持批量领取,而我这边是并发调用,量一大就比较容易超时了图片未迁移可以用这个 case 看下:#

6. 参考