腾讯云 CVM 内网丢包排查:区分实例规格限制与系统参数调优
操作系统层面的参数调优只能消除本地协议栈瓶颈,无法突破云厂商基于实例规格设定的内网带宽和包转发率上限。若监控显示已触及实例配额,升级配置是唯一有效方案。
先说结论:先区分是实例规格限制还是系统配置瓶颈,再针对性调整内核参数或升级实例。
- 先定位:通过云监控和系统命令确认丢包发生在网络层还是应用层
- 先做:调整 conntrack 表大小和网卡队列数以匹配当前规格,避免硬编码数值
- 再验证:观察调整后监控图表中的丢包率是否下降,确认未触及实例 PPS 上限
核心原则:云厂商限制不可突破
云服务器内网性能由底层虚拟化架构和实例规格决定,操作系统只是运行在其中的客户机。当实例规格设定的包转发率(PPS)上限较低时,即使系统内核参数调得再大,流量到达虚拟化层也会被限速或丢弃。反之,如果实例规格足够但系统连接跟踪表(conntrack)满了,也会造成类似带宽受限的丢包现象。
分步处理与安全调优
1. 查询实例规格限制
登录腾讯云控制台,查看当前 CVM 实例的网络性能指标,确认内网带宽和 PPS 上限。若业务流量接近该上限,系统调优无效,需升级实例。
2. 检查并调整连接跟踪表(conntrack)
执行以下命令查看当前使用量和最大值:
cat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_max
若前者接近后者,需调大最大值。切勿硬编码固定值,建议根据内存大小计算,每条连接约占用 128 字节内存,安全经验值为内存 MB 数的 100 倍:
# 计算建议值(例如 2GB 内存约为 200000)
VALUE=$(free -m | awk '/Mem:/ {print int($2*100)}')
sysctl -w net.netfilter.nf_conntrack_max=$VALUE
sysctl -w net.netfilter.nf_conntrack_buckets=$(($VALUE/4))3. 调整网卡多队列
执行 ethtool -l eth0 查看支持的最大队列数(Pre-set maximums)。队列数应设置为 CPU 核数与网卡支持最大值的较小者:
# 查看 CPU 核数 nproc # 查看网卡支持的最大队列数 ethtool -l eth0 | grep -A 1 "Combined" # 设置队列数(假设 CPU 为 4 核,网卡支持最大 8 队列,则设为 4) ethtool -L eth0 combined 4
注意:eth0 需替换为实际网卡名。
4. 持久化配置
临时命令重启后失效,需写入配置文件:
echo "net.netfilter.nf_conntrack_max = $VALUE" >> /etc/sysctl.conf echo "net.netfilter.nf_conntrack_buckets = $(($VALUE/4))" >> /etc/sysctl.conf sysctl -p
网卡队列持久化需根据发行版不同,写入 /etc/rc.local 或网络配置脚本中。
怎么验证是否生效
1. 系统级验证:使用 netstat -s | grep -i drop 查看是否有内核级丢包增长。执行 ss -s 查看连接跟踪状态。
2. 云平台验证:在腾讯云控制台的云监控中,观察内网出/入带宽包速率曲线是否平稳,以及是否有“丢包率”指标异常。若调整参数后业务延迟降低且监控无丢包,说明优化生效。
常见风险与坑
- 误以为调大参数就能突破规格限制:内核参数无法改变云厂商分配的物理资源上限,触及 PPS 上限必须升级实例。
- 盲目调大 conntrack 表:过大的表会消耗更多内存,可能引发 OOM。务必根据内存计算。
- 网卡队列设置过大:超过网卡支持的最大队列数会导致命令失败或性能下降,务必先查询最大值。
- 忽略安全组规则:有时流量不通是安全组拦截,而非带宽或 PPS 问题。
参考来源
- 腾讯云官方文档 - 实例网络性能:https://cloud.tencent.com/document/product/213/15236
- 腾讯云官方文档 - 云监控指标说明:https://cloud.tencent.com/document/product/248/30638