【Linux中UDP服务丢包率过高排查思路】

文章介绍了在Centos7上,针对基于Netty实现的UDP服务丢包率过高的问题进行排查和优化的过程。通过监控netstat命令输出,分析packetreceiveerrors和Recv-Q等指标,发现接收缓冲区大小是关键因素。解决方案包括增加应用程序处理能力,调整内核参数如rmem_default和rmem_max以增大接收缓冲区,并使用Jmeter进行压测验证优化效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

在Centos7服务器中部署了基于Netty实现的UDP服务,用来采集日志。将数据发送到UDP服务端之后,没有复杂业务处理,直接写入本地的log文件中。经过监控分析,成功找出优化方案,将目标3000QPS每秒丢包率3%降至0.00002%,5000QPS也比较良好。

二、监控UDP消息每秒收发数据

1、使用 netstat -s -u 命令可以监控UDP服务统计信息

在这里插入图片描述
netstat -s -u命令,统计指标主要数据说明

  • packets received:接收到的UDP数据包数量。
  • packets to unknown port received:接收到未知端口的UDP数据包数量。
  • packet receive errors:接收UDP数据包时发生的错误数量。
  • packets sent:发送的UDP数据包数量。
  • receive buffer errors:接收缓冲区错误的数量。
  • send buffer errors:发送缓冲区错误的数量。
  • InNoRoutes:无法路由的数据包数量。
  • InMcastPkts:接收到的多播数据包数量。
  • OutMcastPkts:发送的多播数据包数量。
  • InBcastPkts:接收到的广播数据包数量。
  • InOctets:接收到的总字节数。
  • OutOctets:发送的总字节数。
  • InBcastPkts:接收到的广播数据包数量。

主要关注packets received、acket receive errors、receive buffer errors三个指标

2、使用 netstat -uap 命令可以监控UDP服务统计信息

在这里插入图片描述
netstat -uap命令下的一些常见指标的含义:

  • Proto: 表示网络协议类型,通常为UDP。
  • Recv-Q: 表示接收队列的大小,即等待被应用程序读取的数据包数量。
  • Send-Q: 表示发送队列的大小,即等待被网络发送的数据包数量
  • Local Address: 表示本地地址和监听端口。
  • Foreign Address: 表示远程地址和端口,如果有的话。
  • State: 表示连接状态,对于UDP协议通常为"-".
  • PID/Program name: 表示与该连接或监听端口相关联的进程ID和程序名称

基于业务,主要关注Recv-Q指标值来做分析

3、编写脚本记录每秒以上两种信息的变化

将netstat -s -u、netstat -uap命令返回监控信息保存到文本中,每秒保存一次

  1. 使用vi xx.sh命令创建脚本
#!/bin/bash
step=1
for (( i = 0; i < 60; i = (i+step) )); do
    echo "$(date) $(netstat -uap)" >> /opt/udpSocket.txt
    sleep $step
done
exit 0
#!/bin/bash
step=1
for (( i = 0; i < 60; i = (i+step) )); do
    echo "$(date) $(netstat -s -u)" >> /opt/1.output.txt
    sleep $step
done
exit 0

  1. 使用crontab -e 创建定时任务
* * * * * sh /opt/test.sh
* * * * * sh /opt/test1.sh

4、使用Jmeter进行UDP端口压测

三、分析保存的监控指标数据

  1. 将两个监控数据文件中,时间和packet receive errors、时间和Recv-Q进行分析,计算丢包数在发送样本的占比

  2. 使用Excel对两份数据建立数据透视图
    Alt
    在这里插入图片描述

  3. packet receive errors指标错误数和receive buffer errors错误数一致,且发送条数减去日志文件写入条数等于packet receive errors错误数,初步得出结论缓冲区错误是丢包率过高的主要原因。

  4. 分析Recv-Q指标,数值持续保持峰值,很少有为0的时候,说明应用来不及读取接收缓冲区中的数据,接收缓冲区一直是满着的状态,更加证明Linux内核中默认socket接收缓冲区最大值满足不了当前的并发情况,需要增加缓冲区大小。

四、解决方案

  1. 增加用户态应用程序处理能力,使用零拷贝、IO多路复用、多线程绑定一个端口、增加应用程序UDP服务端中接收缓冲区的大小等措施。(例:【基于Netty实现Epoll机制的UDP接收服务】)
  2. 修改内核参数,增加内核层面接收缓冲区的大小。
    (1). 使用sysctl net.core.rmem_default、sysctl net.core.rmem_max命令查看系统内核中套接字接收缓冲区默认大小在这里插入图片描述
    (2).临时有效方式:使用sysctl -w net.core.rmem_default=1048576、sysctl -w net.core.rmem_max=1048576命令修改接收缓冲区大小改为1MB
    (3).永久有效方式:
打开终端,并使用 root 或具有管理员权限的用户登录。
编辑 /etc/sysctl.conf 文件,可以使用任何文本编辑器打开该文件。
在文件的末尾添加以下行来设置接收缓冲区大小:
net.core.rmem_default = <new_size>
net.core.rmem_max = <new_size>
其中,<new_size> 是你想要设置的新的接收缓冲区大小。
保存并关闭文件。
运行以下命令以使更改生效:
sudo sysctl -p
这将重新加载 /etc/sysctl.conf 文件中的配置,并使更改生效。
  1. 重新压测,计算丢包率。如果数据不理想,重复分析packet receive errors、和Recv-Q指标,分析Recv-Q指标每秒分布情况,看接收缓冲区是否够用。

五、内核中接收缓冲区大小的影响范围分析

使用netstat -anp 命令查看内核中接收缓冲区的个数,每个TCP、UDP都会有对应的一个接收缓冲区,假如应用程序中有使用tomcat,则内存使用范围在tomcat200最大线程 * 1MB+其他运行线程 *1MB,以本地虚拟机为例,默认有21个接收缓冲区,再加上tomcat的默认最大200线程,内核中接收缓冲区内存占用在200多MB。对其他业务影响不大。
在这里插入图片描述

<think>好的,用户现在问的是当Linux系统出现网络丢包时,应该如何进行故障排查,以及需要使用哪些命令。我需要先回顾一下之前的对话历史,看看有没有相关的信息。之前用户问的是常用Linux服务的端口,我详细分类介绍了各个服务对应的端口,还有使用建议和命令。现在的问题是关于网络丢包的排查,这属于网络故障诊断的一部分,和端口相关但更深入。 首先,用户可能遇到了网络不稳定的情况,比如应用连接超时、延迟或者直接无法访问。他们的实际需求应该是快速定位丢包的原因,找到问题所在并解决。可能的身份是系统管理员或者开发人员,负责维护服务器或应用的网络稳定性。 接下来要考虑用户可能的深层需求。除了给出排查步骤和命令,他们可能还想了解如何系统地分析问题,而不仅仅是零散的命令。所以回答需要结构清晰,步骤明确,从简单到复杂,逐步深入。同时,结合之前的回答,我之前提到了使用netstat、ss等命令查看端口,这里可能需要扩展更多网络诊断工具,比如ping、traceroute、mtr、tcpdump等。 需要确保回答涵盖以下几个方面: 1. 初步确认问题:检查是否有丢包,使用ping命令。 2. 排查本地网络配置:网卡状态、IP配置、路由表。 3. 检查中间链路:使用traceroute或mtr确定丢包发生的节点。 4. 分析本地协议栈:查看是否有系统层面的错误或丢包统计。 5. 防火墙或安全组策略:检查iptables或firewalld规则是否导致丢包。 6. 硬件或驱动问题:检查网卡是否有错误计数。 7. 级抓包分析:使用tcpdump或Wireshark进行深入分析。 还要注意用户可能不太熟悉某些命令的参数,需要给出具体示例,比如ping -c 4 8.8.8.8,这样用户可以直接复制使用。另外,要强调安全性和权限问题,比如某些命令需要sudo权限。 另外,结合之前的回答中提到的端口使用,可能在排查时也需要检查相关服务的端口是否正常监听,是否有防火墙规则阻止,比如之前的例子中提到的SSH端口更改,或者数据库端口的访问限制。不过这个问题更偏向于网络层,而不仅仅是应用层端口的问题。 还要考虑用户可能的环境,比如是物理服务器、虚拟机还是云主机。不同的环境排查步骤可能有所不同,比如云主机可能需要检查安全组设置,而物理服务器可能需要检查网线、交换机等硬件。 最后,需要给出一个总结性的排查流程图或步骤列表,帮助用户系统化处理问题,避免遗漏可能的故障点。同时,提醒用户记录日志,方便后续分析,以及预防措施,比如定期监控网络状态。</think>以下是Linux系统网络丢包故障的排查思路与操作指南,按优先级分步骤说明: ######################### ### 一、初步确认丢包现象 ######################### 1. **基础连通性测试** ```bash # 测试目标服务器/网关 ping -c 4 8.8.8.8 # 测试IPv4连通性 ping6 -c 4 2001:4860::8888 # IPv6测试(若适用) # 观察关键指标: $$ \text{丢包率} = \frac{\text{丢失数据包}}{\text{发送总数}} \times 100\% $$ ``` *典型现象*:出现`100% packet loss`或持续丢包率>1% 2. **持续监控工具** ```bash mtr --report-wide 8.8.8.8 # 实时显示路径质量(推荐) ping -i 0.2 8.8.8.8 | tee ping.log # 记录长期数据 ``` ######################### ### 二、本地网络配置检查 ######################### 1. **网卡状态诊断** ```bash ethtool eth0 # 查看物理连接状态 ip -s link show eth0 # 检查丢包统计(重点看RX/TX errors) ``` *关键指标*: - `RX errors`: 接收错误 - `TX errors`: 发送错误 - `dropped`: 内核丢弃的数据包 2. **路由表验证** ```bash ip route show # 显示当前路由表 route -n # 传统路由查看方式 ``` 3. **ARP缓存检查** ```bash arp -n # 查看ARP表完整性 ip neigh # 新版邻居表查看 ``` ######################### ### 三、中间链路分析 ######################### 1. **路径追踪** ```bash traceroute -n 8.8.8.8 # 传统路径分析 mtr --tcp --port 443 8.8.8.8 # 基于TCP协议测试(避开ICMP限制) ``` *排查要点*:定位具体跳数节点的丢包 2. **MTU检测** ```bash ping -M do -s 1472 8.8.8.8 # 测试最大MTU(数值递减测试) ``` ######################### ### 四、协议栈与系统层面 ######################### 1. **内核丢包统计** ```bash netstat -su # UDP协议栈统计 netstat -st # TCP协议栈统计 ``` 2. **连接跟踪表** ```bash conntrack -S # 查看NAT连接跟踪状态 sysctl net.netfilter.nf_conntrack_max # 检查连接数上限 ``` ######################### ### 五、防火墙与安全策略 ######################### ```bash iptables -L -n -v # 传统防火墙规则检查 nft list ruleset # nftables新版防火墙 ss -nutlp # 验证端口监听状态 ``` ######################### ### 六、级抓包分析 ######################### 1. **tcpdump基础捕获** ```bash tcpdump -i eth0 -w dump.pcap host 8.8.8.8 # 抓取特定流量 tcpdump -nn 'icmp[icmptype] == icmp-echo' # 专用ICMP过滤 ``` 2. **Wireshark图形化分析** ```bash tshark -r dump.pcap -Y "icmp.type==8" # 命令行版过滤 ``` ######################### ### 七、硬件级排查(物理层) ######################### 1. **网卡诊断** ```bash ethtool -S eth0 # 查看详细硬件统计 dmesg | grep -i eth0 # 检查内核日志中的网卡异常 ``` 2. **交换机协同排查** - 检查交换机端口CRC错误计数 - 确认双工模式匹配(`ethtool eth0 | grep Duplex`) **排查流程图**: ``` 开始 → ping测试 → 本地网卡诊断 → 路由检查 → 中间链路分析 ↓ ↑ 防火墙验证 硬件/驱动检测 ↓ ↑ 协议栈统计排查 → 抓包分析 → 得出结论 ``` **典型故障案例**: 1. 网卡驱动问题:`ethtool`显示大量`rx_missed_errors` 2. iptables误规则:`iptables -vL`显示DROP包计数增长 3. MTU不匹配:大包传输时出现`Frag needed`警告 4. 连接数超限:`nf_conntrack`表满导致新连接被丢弃
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值