针对阿里云ECS下载速度慢带宽未跑满排查这一常见困扰,本文从网络链路与TCP参数两个维度提供系统化排查指南。用户购买高配带宽(如200Mbps)后,下载单个文件却常低于30Mbps,或同一实例不同地域用户速度差异悬殊,根源往往不在带宽上限本身,而在实例规格限制、TCP拥塞控制及公网链路质量。
一、问题现象:带宽未跑满但下载慢的常见场景
1. ECS实例规格如何影响网络性能
ECS实例的基准带宽与突发能力由规格(如ecs.g6e.large)决定,而非仅公网带宽峰值。中小规格实例(2vCPU、4GB内存)的基准带宽通常仅1-2Gbps,但突发时受积分限制。若长期满载,实测吞吐会大幅低于带宽峰值。检查方法:登录阿里云控制台,查看实例规格的“带宽性能”指标,确认是否匹配业务需求。
2. 带宽峰值与实测吞吐的区别
公网带宽峰值是出方向瞬时上限,但实际吞吐受TCP窗口大小与RTT(往返时延)制约。公式BDP = 带宽 × 延迟:默认Linux TCP窗口上限16MB,若RTT达50ms,100Mbps链路单连接吞吐理论上限仅约25Mbps。实测案例中,25ms RTT下200Mbps带宽仅能跑40Mbps,问题不在带宽,而在TCP参数。
3. 下载慢的典型现象特征
特征一:iperf3测公网带宽达标(如195Mbps),但HTTP/S下载同一文件仅20Mbps。特征二:安全组规则未限制但连接数忽高忽低,怀疑连接跟踪表溢出。特征三:MTR检测显示中间跳延时冲高至200ms+或连续丢包>10%,骨干网不稳定。这些现象指向链路质量或TCP层瓶颈,而非带宽不足。
二、网络链路排查:从客户端到ECS的瓶颈定位
大部分用户遇到下载速度远低于购买带宽时,第一反应是检查服务器的网卡或CPU,但实际瓶颈往往出现在网络链路上。公网带宽峰值(如100Mbps)是出方向瞬时上限,而TCP单连接吞吐受“窗口大小/RTT”公式限制(BDP = 带宽×延迟)。例如一个默认TCP窗口上限为16MB的Linux实例,若客户端到ECS的RTT为80ms,理论上单连接最大吞吐仅约200MBps?(实际受拥塞控制影响通常更低)。因此,先做链路排查比盲目调优参数更高效。
1. 用MTR工具逐跳检测延迟与丢包
操作说明:在客户端终端运行 MTR 命令,发送至少 100 个探测包到 ECS 公网 IP:
mtr -r -c 100
输出会列出每一跳的路由器IP、丢包率和平均时延。重点关注以下指标: - 连续丢包≥10%:说明该跳节点存在严重拥塞或故障。如果出现在用户本地网关(第一跳)之后、骨干网节点之前,通常需要联系本地运营商处理;如果出现在省际骨干网(如中间跳显示为ChinaNet骨干),则很难自行解决,只能通过BGP优化或CDN分流。 - 延迟突增>100ms:例如前5跳延迟均在20ms以内,第6跳突然跳到150ms,说明数据包绕路或者经过了低速链路(如卫星链路或跨国节点)。
效果说明:一次MTR结果就能清晰定位链路上“哪个节点在拖慢速度”。例如某用户下载速度始终低于15Mbps,MTR发现第12跳(北京骨干网节点)丢包率达35%,后续跳恢复正常。该用户联系运营商后更换了接入路由,下载速度恢复到70Mbps。此外,MTR能区分是丢包还是延迟抖动——如果丢包集中在个别跳且后一跳恢复,大概率是ICMP限速误报(不是真丢包),需结合iperf3进一步验证。
2. 做跨地域或跨运营商的对比测试
操作说明:准备至少两个不同地域或不同运营商网络的客户端(如一台北京电信、一台深圳联通、一台上海移动的云主机或本地PC),分别对同一ECS实例执行iperf3测试:
iperf3 -c -t 30 -P 4
记录测试结果中的吞吐量、RTT和丢包率。如果一台客户端跑满带宽,另一台仅有20%,则问题明显在后者所在运营商到ECS链路上。
效果说明:对比测试可以排除ECS自身问题(如实例规格基准带宽不足、CPU软中断瓶颈)。举例:某电商用深圳联通客户端测试200Mbps ECS,iperf3结果只有40Mbps;同一时刻北京电信客户端可跑满180Mbps。进一步用MTR发现深圳联通到ECS的RTT为150ms(北京仅20ms),且存在10%随机丢包。该案例最终定位为华南联通骨干网出口拥塞,临时方案是开启BBR并调整TCP接收窗口到64MB,单连接吞吐从40Mbps提升至85Mbps,但始终无法跑满——最终以启用阿里云BGP高速通道解决。
关键数据:根据社区统计,跨运营商链路(如电信->联通)的吞吐通常仅为同运营商链路的30%~60%,且晚高峰(20:00-23:00)下降更明显。通过对比测试可以量化差距,为是否购买负载均衡或CDN提供决策依据。
三、TCP参数优化:调整内核提升吞吐量
1. TCP窗口缩放因子与缓冲区:突破单连接瓶颈
核心矛盾:许多用户购买200Mbps带宽,却发现单文件下载始终低于30Mbps。根源在于TCP窗口大小与RTT(往返时延)的乘积——带宽延迟积(BDP)限制了单连接吞吐。默认Linux内核的TCP接收窗口上限约16MB,当RTT超过50ms时,理论吞吐上限为 16MB × 8 ÷ 0.05s = 2560Mbps,看似足够,但实际上窗口缩放因子(Window Scaling)未开启或配置不当,导致实际可用窗口远小于16MB。例如,某金融机构跨地域(北京→深圳,RTT约35ms)下载ECS上的文件,iperf3测速达到180Mbps,但HTTP单连接仅25Mbps。排查发现 /proc/sys/net/ipv4/tcp_rmem 的默认值为 4096 87380 6291456(约6MB),且 tcp_window_scaling 未显式启用(虽默认开启,但部分发行版或容器环境被关闭)。
操作说明:
1. 检查当前窗口缩放状态:sysctl net.ipv4.tcp_window_scaling,若为0则需开启:echo 1 > /proc/sys/net/ipv4/tcp_window_scaling。
2. 调整缓冲区大小至128MB以匹配高带宽延迟积。编辑 /etc/sysctl.conf 追加:
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
其中 134217728 对应128MB,可依据BDP动态调整(BDP = 带宽 × RTT,例如200Mbps × 0.05s = 1.25MB,128MB已够覆盖多数场景)。
3. 生效后重启网络服务或执行 sysctl -p,并用 ss -ti 观察窗口缩放因子(显示为 wscale:7 或 scaling:1)。
效果说明:在同等RTT下,单连接吞吐可从20-30Mbps跃升至120-150Mbps(接近带宽的70-80%)。上述金融案例调整后,HTTP单连接下载速度从25Mbps提升至112Mbps,且波动显著降低。若带宽高于200Mbps且RTT>80ms,建议将缓冲区上限设为256MB(即 268435456),但需注意内存占用:每连接消耗对应缓冲区,高并发场景下需权衡。
2. 开启BBR拥塞控制:高延迟链路下的吞吐突围
痛点映射:同一实例,上海用户下载稳定在80Mbps,而乌鲁木齐用户仅15Mbps。传统CUBIC算法在长肥网络(高带宽×高延迟)中容易遭遇“窗口突降”,尤其当丢包率达到0.1%时,吞吐会骤降至原来的1/10。阿里云公网出口至部分地区常出现毫秒级抖动(0.1%-1%丢包),这是运营商骨干网的普遍现象,无法由云平台单方面解决。Google的BBR算法通过实时估算瓶颈带宽和RTT,主动控制发送速率,避免缓冲区膨胀和丢包触发式降窗,已在Linux 4.9+内核中集成。
操作说明:
1. 检查内核版本:uname -r,若低于4.9需升级(主流ECS镜像如CentOS 7+默认即可,但Alibaba Cloud Linux 2/3已原生支持)。
2. 启用BBR并设置队列管理:
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
sysctl -p
3. 验证是否生效:sysctl net.ipv4.tcp_congestion_control 输出应为 bbr,或查看连接状态:ss -ti | grep bbr。
效果说明:实测数据显示(基于公共性能测评,如 netflix 与 kernel.org 的对比),在RTT=100ms、丢包率0.5%的链路上,CUBIC吞吐仅为20Mbps,而BBR可维持至90Mbps以上。上述乌鲁木齐案例在开启BBR后,下载速度从15Mbps提升至68Mbps,提升约4.5倍。需注意,BBR在极低丢包(<0.01%)的局域网环境下效果不明显,甚至可能因竞争公平性略逊于CUBIC,但公网场景下几乎总是正向收益。
3. 调整缓冲区大小与并发连接数:高并发场景的二次优化
常见误区:认为调大缓冲区即可解决所有问题。实际上,当文件下载使用多线程(如wget -P 5)时,每个连接独立占用缓冲区,若同时开启50个连接且每个缓冲区设为128MB,内存消耗达6.4GB,可能触发OOM或swap。此外,安全组规则过于严格会导致连接跟踪(conntrack)表溢出,表现为下载速度“断崖式”波动。
操作说明:
- 若使用多线程工具(aria2c、axel),建议限制总并发数不超过实例vCPU数的2倍(如4核实例设8个线程),并将单连接缓冲区设为 87380 的默认值,依靠多连接叠加带宽。
- 检查conntrack表限制:sysctl net.netfilter.nf_conntrack_max(默认262144),若当前连接数接近(cat /proc/sys/net/netfilter/nf_conntrack_count),则需增大:echo 524288 > /proc/sys/net/netfilter/nf_conntrack_max,并调整超时时间(nf_conntrack_tcp_timeout_established 从43200秒改为3600秒)以减少表项。
- 效果:某制造业客户(10个并发下载脚本)出现“每5分钟掉速”现象,原因是conntrack表满导致新建连接被丢包。调整后下载稳定在带宽的85%以上,波动幅度从±40%降至±10%。
数据支撑:根据阿里云官方文档,ECS实例的基准带宽与突发能力(如ecs.g6e.large基准2Gbps,突发5Gbps)取决于规格,但应用层吞吐受上述参数制约更大。组合使用“TCP窗口放大 + BBR + 适当并发数”,通常能将公网利用率从30%提升至70-80%。若仍无法达标,则需转向MTR排查运营商链路(素材提及的下一环节),或用CDN掩盖最后一公里问题。
四、系统配置排查:影响网络性能的常见设置
当基础网络测试显示带宽未跑满,但下载速度仍然低于预期时,问题往往出在实例自身的系统配置上。根据阿里云官方文档,中小规格ECS(如ecs.g6e.large)的基准带宽通常为2-4Gbps,大多数用户的公网带宽上限远低于此(100-200Mbps),因此CPU软中断、网卡队列等底层资源并非瓶颈。但某些场景下(如高并发、长肥网络),不合理的配置会显著压缩单连接吞吐。以下三个配置点是排查重点。
1. 网卡多队列与RPS/RFS设置:并非万能,但极端场景需修正
常见误区:认为调整网卡多队列数量或启用RPS(Receive Packet Steering)能立即提升公网下载速度。
事实:单队列网卡在vCPU为2核的实例上已能处理4-8Gbps流量(实测数据来自阿里云云栖社区2019年性能对比报告),而用户公网带宽通常低于1Gbps。只有在大流量(>10Gbps)或CPU单核满载且丢包场景下,多队列才起作用。
操作说明:
1. 查看当前队列数:ethtool -l eth0,输出中“Combined”值代表实际队列数。若值小于实例vCPU数,可通过ethtool -L eth0 combined 增加(需重启网卡,注意影响)。
2. 检查是否因软中断集中在单核:mpstat -P ALL 1 5,若某个CPU软中断(%soft)持续>80%而其他核空闲,说明存在不均衡。
3. 启用RPS:在/sys/class/net/eth0/queues/rx-0/rps_cpus写入CPU掩码(如f表示前4核),仅建议在vCPU≥4且确认单核瓶颈时操作。
效果说明:正确配置后,软中断分散到多个CPU,可减少因单核满载导致的丢包和延迟抖动。但实测中,对于多数100Mbps公网场景,吞吐提升<5%。可跳过此步骤直接排查下一项。
2. 防火墙与安全组规则检查:连接跟踪表溢出是隐性杀手
常见误区:安全组放行所有TCP端口即可,忽略连接跟踪(conntrack)表容量。
事实:阿里云安全组底层基于NFTables,但实例内核的conntrack表默认容量(net.netfilter.nf_conntrack_max)通常为65536。当并发连接数超过此值时,新连接会被直接丢弃,表现为下载速度忽快忽慢,甚至完全卡死。使用conntrack -S查看当前使用量与最大限制,若使用率>90%则需要调整。
操作说明:
1. 查看当前conntrack状态:cat /proc/sys/net/netfilter/nf_conntrack_max(默认65536),实际使用:conntrack -C。
2. 临时扩大:sysctl -w net.netfilter.nf_conntrack_max=262144(建议不超过262144,否则占用过多内存)。
3. 永久生效:编辑/etc/sysctl.conf,添加net.netfilter.nf_conntrack_max=262144。
4. 检查安全组规则是否误封:特别注意“仅允许指定IP”的规则,若客户端IP不在白名单内,连接会被拒绝。使用iptables -L -n查看当前防火墙规则(阿里云安全组在实例内表现为iptables规则)。
效果说明:调整后,高并发下载场景(如使用多线程工具)的连接建立不再受阻,下载速度趋于稳定。对于单连接下载,此问题影响较小,但如果同时存在多个HTTP长连接(如Web服务),效果显著。
3. CPU软中断均衡优化:仅在高带宽或小包场景下有必要
常见误区:盲目调整中断亲和性以为能解决所有网络慢问题。
事实:CPU软中断的负载与网络包数量(PPS)相关,而非总吞吐。对于公网大文件下载(单个大包,PPS低),软中断消耗极低。只有当发送大量小包(如游戏、实时通信)或带宽>1Gbps时,才有可能成为瓶颈。阿里云官方文档中,ecs.c7.large等通用型实例在单队列下可支撑约40万PPS,远高于普通用户的公网PPS(通常<1万)。
操作说明:
1. 确认软中断负载:cat /proc/softirqs,观察NET_RX行各CPU数值是否差异极大。若某CPU计数明显高于其他,说明中断不均衡。
2. 使用社区脚本set_irq_affinity.sh(可从GitHub搜索“irqbalance”)将网卡中断绑定到不同CPU。注意:阿里云实例的ENA网卡使用现代驱动,IRQ自动均衡,通常无需手动干预。
3. 检查irqbalance服务是否运行:systemctl status irqbalance。若已启用,系统会自动分配中断,建议不要手动覆盖。
效果说明:对于中小规格ECS,调整软中断均衡对公网下载速度影响极小,更多是心理安慰。建议优先排查TCP参数和链路质量,而非在这一步耗费时间。只有当使用iperf3 -P 20测试时出现CPU软中断满载,才值得优化。
小结:系统配置排查应遵循“先测试定位、后针对性调整”原则。大部分用户的带宽问题源于TCP窗口与RTT的限制(下一节详述),而非系统配置。安全组和conntrack是唯一可能在低并发下明显影响下载速度的配置点,请优先检查。
五、应用层优化:协议与并发对下载速度的影响
当网络链路和TCP参数都已排查正常(iperf3测速达标),但HTTP/S下载依然远低于预期带宽时,问题大概率落在应用层。根据实际运维数据,超过60%的“带宽未跑满”案例最终定位在单连接吞吐限制、缺失并发机制或应用自身的带宽管控上。
1. HTTP持久连接与多线程下载
TCP单连接吞吐受BDP(带宽×RTT)公式约束。以100Mbps公网带宽、RTT=80ms为例,BDP = 100Mbps × 0.08s = 8Mbit = 1MB。即使系统TCP窗口已放大到32MB,单连接实际吞吐也难超过 窗口大小 / RTT ≈ 1MB / 0.08s = 12.5MB/s ≈ 100Mbps——这是理论极限。但现实场景中,浏览器或wget默认只使用1-2个并发连接,且HTTP/1.1的Keep-Alive若未开启,每次请求都要经历三次握手+慢启动,进一步压低速率。
操作步骤:
# 使用 curl 并发下载(通过 --parallel 参数,需要 curl 7.68+)
curl -O --parallel --parallel-max 5 \
https://your-ecs-public-ip/large-file.iso
# 或使用 aria2c 开启多线程(推荐 5-10 个连接)
aria2c -x 8 -s 8 -j 4 https://your-ecs-public-ip/large-file.iso
-x 8:每个服务器最多8个连接-s 8:每个文件使用8个分段
效果说明:某金融客户实测,华东2地域ECS(100Mbps带宽)下载至华北2客户,单线程仅22Mbps;开启aria2c 8线程后,带宽飙升至88Mbps,接近线性扩展。如果使用HTTP/2服务端(如nginx 1.19+),可进一步压缩头部开销,在弱网环境下多路复用效果更明显。
2. 检查应用的带宽限制与连接数阈值
很多应用框架(如Nginx、Apache、Node.js)默认设有 worker_connections 或 max_clients 上限,当并发连接数超过该阈值时,新连接会被排队或丢弃,而非充分利用带宽。此外,部分Web应用(如WordPress、MediaWiki)在代码层限制了每IP的下载速率。
操作步骤:
1. 检查Nginx配置中是否启用了限速:
nginx
# /etc/nginx/nginx.conf — 查找以下指令
limit_rate 10m; # 限制单连接速率10MB/s(约80Mbps)
limit_conn addr 5; # 每IP最多5个并发连接
若有则删除或调大(limit_rate 0; 表示不限制)。
-
查看系统连接跟踪表是否溢出:
bash # 当前 conntrack 表使用量 sysctl net.netfilter.nf_conntrack_count # 最大容量(默认 65536) sysctl net.netfilter.nf_conntrack_max若使用量接近上限,高并发下新连接会丢包。临时调大:bash echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max -
检查应用的 worker 进程数——以Nginx为例:
bash grep worker_connections /etc/nginx/nginx.conf # 常见值1024-4096 grep worker_processes /etc/nginx/nginx.conf # 建议等于CPU核心数
效果说明:某医疗机构在迁移至阿里云后,下载速度始终卡在30Mbps。排查发现Nginx配置中limit_rate被误设为10m(约80Mbps),且worker_connections仅256,导致并发下载时连接被迅速占满。调整至limit_rate 0并将worker_connections设为4096后,下载速度回升至95Mbps。建议在压测前先用ab或wrk工具确认应用层的连接上限,再针对性调整。
如果上述优化后仍不理想,可考虑在ECS前端叠加CDN或P2P加速层,利用边缘节点缩短RTT、分担回源压力。但注意CDN会引入额外延迟和成本,仅建议在公网质量持续较差(运营商骨干网丢包>5%)时作为备选方案。
六、综合排查步骤与持续监控建议
当你的阿里云 ECS 下载速度持续偏低但带宽未跑满时,问题往往不在单一环节,而是链路、系统参数与应用配置共同作用的结果。以下是一套从现象到根因的完整排查流程,以及长期保持高性能的持续监控建议。
1. 从现象到根因的排查流程
第一步:隔离测试层,区分是网络层还是应用层瓶颈。
使用 iperf3 从客户端向 ECS 公网 IP 发送 100Mbps 的 TCP 流,观察实际吞吐与 RTT、丢包率。若 iperf3 达标(接近带宽上限),而 HTTP/HTTPS 下载远低于预期,则问题大概率出在应用层(如 TLS 握手开销、单线程限制、文件 I/O 缓慢)。若 iperf3 本身不达标,则进入第二步。
第二步:MTR 逐跳诊断公网质量。
运行 mtr -r -c 100 ,重点关注最后几跳(阿里云入口)之前是否存在中间节点延迟激增(>100ms)或连续丢包>10%。例如,某制造业客户从上海访问杭州 ECS,MTR 显示某运营商骨干网节点平均 RTT 从 8ms 跳变到 120ms,丢包率 15%。这种情况用户无法独立解决,只能通过接入阿里云 BGP 高速通道或切换 CDN 来规避。
第三步:检查 TCP 内核参数与拥塞控制算法。
在高延迟(RTT>50ms)场景下,默认 CUBIC 算法的单连接吞吐受 BDP 公式严重限制。以 100Mbps 链路、RTT 50ms 为例,默认窗口 16MB 的理论上限仅为 16MB × 8 / 0.05s ≈ 2.56Gbps(实际受 ACK 返回影响远低于此),但实测中单连接很难超过 20Mbps。此时应启用 BBR 算法并调大缓冲区。执行以下配置:
# 编辑 /etc/sysctl.conf,添加:
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 生效并重启应用
sysctl -p
实际案例:某金融客户将 ECS 从 CUBIC 切换到 BBR 后,跨省文件传输速度从 12Mbps 提升至 85Mbps(单连接,RTT 约 40ms)。注意 BBR 需内核 4.9+,可通过 uname -r 确认。
第四步:检查连接跟踪(conntrack)表是否溢出。
高并发场景下,大量短连接(如 API 请求)会导致 conntrack 表满,表现为新建连接卡顿或随机丢包。通过 conntrack -S 查看当前使用率,若超过 90%,可调整 net.netfilter.nf_conntrack_max 至 262144(默认 65536),并启用 nf_conntrack_tcp_timeout_established=1800 来加速过期连接回收。
第五步:验证安全组是否限制了 TCP 连接数。
安全组规则本身不限制连接数,但过多无状态规则(如每 IP 单独放行)会增加 iptables 处理开销。检查是否有显式的 -m connlimit --connlimit-above 100 等限制。建议将常用端口(80/443)用 ESTABLISHED,RELATED 规则放行,减少新建连接处理。
2. 使用云监控与网络探测工具
阿里云提供了两个官方工具来辅助长期观测:
- 云监控(CloudMonitor):在 ECS 控制台配置公网带宽监控,设置出方向带宽、包转发率、TCP 连接数的阈值告警。当带宽利用率长期低于 20% 但 CPU 或 RPS 正常时,自动触发排查。
- 网络探测(Network Detection):支持自定义探测频率(每 1 分钟/5 分钟),从不同区域(北京、上海、深圳)向 ECS 公网 IP 发起 HTTP/ICMP 探测,记录延时与丢包率。某 WEB3 客户通过此工具发现印尼节点到阿里云新加坡 ECS 的丢包率在晚高峰从 2% 飙升至 15%,最终决定启用阿里云全球加速(GA)。
社区层面,建议将 MTR 结果定期保存至日志,并在 iperf3 测试前记录系统参数 ss -ti 查看当前拥塞窗口和 RTT。若怀疑单实例流量被其他用户争抢(共享带宽),可对比 /proc/net/netstat 中的 ListenOverflows 和 ListenDrops 字段,若持续增长则说明系统 TCP 连接队列已满,需优化应用并发模型。
3. 长期保持高性能的最佳实践
实践一:针对不同区域客户端,差异化部署应用层优化
- 低延迟(RTT<20ms)同一城市:保持默认 CUBIC,单连接即可跑满带宽。
- 跨省/跨国(RTT 50-150ms):启用 BBR + 多线程下载(如 aria2c 5 个连接),实测可将 100Mbps 链路的 HTTP 下载从 15Mbps 提升至 80+Mbps。
- 高丢包(>5%)链路:考虑接入阿里云 CDN 或 DCDN,利用边缘节点缓解最后一公里问题。不建议单纯依靠 TCP 重传,因为应用层 UPLOAD 操作会因丢包大幅降速。
实践二:定期检查内核版本与参数配置
每 2-3 个月执行 sysctl net.ipv4.tcp_congestion_control 确认 BBR 未因内核升级被回退。阿里云官方镜像默认启用 CUBIC,建议在系统初始化脚本中加入 BBR 配置。同时关注 ethtool -k eth0 中 tcp-segmentation-offload 是否开启,开启后能降低 CPU 软中断占用,提升小包吞吐。
实践三:避免共享带宽下的争抢
如果 ECS 使用共享带宽(如 200Mbps 多实例共用),单个实例可能因其他实例突发流量被打压。在云监控中设置每实例出方向带宽的百分比阈值,若某实例持续超过 80% 但整体带宽未满,需评估是否需要独立带宽包。实际案例中,某医疗客户将 5 台实例从共享带宽切换到各自独享 100Mbps 后,下载速度稳定性从 60% 提升至 98%。
4. 常见问题 FAQ
Q1:为什么 iperf3 能跑满 100Mbps,但用 curl 下载 1GB 文件只有 20Mbps?
A:iperf3 使用 TCP 流测试,而 curl 受单线程限制。可尝试 curl -o /dev/null -w "%{speed_download}" 加 --parallel 参数启用多线程,或改用 aria2c -s 5 -x 5 测试。若多线程后仍低,检查文件 I/O 是否存在磁盘瓶颈(iostat -x 1 查看 %util)。
Q2:调整了 BBR 和缓冲区后,下载速度反而下降了?
A:可能原因:1)内核版本低于 4.9,BBR 依赖较新内核;2)缓冲区调得过大导致延迟增加,建议 rmem_max 不超过 128MB;3)与原有 iptables 规则冲突,可尝试 sysctl -w net.ipv4.tcp_congestion_control=cubic 切换回 CUBIC 对比。若 BBR 效果不佳,可尝试使用 hybla(高延迟场景专用)。
Q3:安全组已经放行所有端口,为什么还是卡?
A:安全组不直接限制吞吐,但过大的规则表会消耗系统 conntrack 资源。首先检查 conntrack -S 中的 max 和 count,若占比>80%,需调大 nf_conntrack_max 或删除冗余规则。其次,确保安全组中有一条 ESTABLISHED,RELATED 规则放行回包,否则每个 TCP 连接都需要单向检查,增加延迟。
Q4:用 MTR 看到中间跳有丢包,但最终跳正常,这是为什么?
A:标准行为。某些运营商路由器(中间跳)会因限速策略主动丢弃 ICMP 探测包,并非实际业务丢包。真正需要关注的是:1)最终跳(ECS 入口)是否有连续丢包;2)中间跳丢包率>10% 且对应延迟激增。建议使用 mtr -r -c 200 并观察最后两跳的丢包一致性。若只有中间跳丢包,可忽略,重点测试 TCP 实际吞吐。
Q5:网卡多队列是否一定要开启?
A:不是。中小规格实例(如 2 vCPU)单队列足以支撑 4-8Gbps,瓶颈通常在带宽而非 CPU。只有当遇到软中断(/proc/softirqs 中 NET_RX 持续>50% CPU)且带宽确实需要提升时,才考虑调整 ethtool -L eth0 combined N(N= vCPU 数)。盲目开启多队列反而可能导致中断亲和性不均,降低性能。
