网络诊断与测速:ping/mtr/iperf3/curl
国内从 NCBI/ENA 下载 SRA 数据时,常见问题包括:带宽不足、防火墙限速、DNS 解析慢、磁盘写满。本文覆盖网络诊断全栈工具链:ping/mtr 路由追踪、iperf3 带宽测试、curl 下载分析、DNS 排查和代理配置。
实测环境:Debian 12,千兆教育网接入。
1. 连通性诊断——从ping开始但不只ping
1.1 ping——第一把手术刀
# 基础连通性ping -c 10 ftp.ncbi.nlm.nih.gov
# 看延迟波动(-i 间隔,-c 次数)ping -i 0.2 -c 100 ftp.sra.ebi.ac.uk
# 大包测试(看MTU/分片问题)ping -s 1400 -c 10 ftp.ncbi.nlm.nih.gov解读:
| 指标 | 正常 | 需关注 | 严重 |
|---|---|---|---|
| 延迟(RTT) | <50ms(国内) <300ms(国际) | 300-500ms | >500ms 或剧烈抖动 |
| 丢包率 | 0% | 1-2% | >5% |
| 抖动(mdev) | <10ms | 10-50ms | >50ms |
但要注意:ping 通 ≠ 带宽够。ICMP 包只有几十字节,和下载 50GB 完全不是一回事。而且很多服务器根本不响应 ping(禁了 ICMP),ping 不通不代表网络有问题。
1.2 mtr——ping + traceroute 的合体
sudo apt install mtr -y
# 交互式实时追踪mtr ftp.ncbi.nlm.nih.gov
# 报告模式(发送100个包然后输出)mtr -r -c 100 ftp.ncbi.nlm.nih.gov
# 不解析主机名(更快)mtr -r -n -c 100 130.14.29.30mtr 输出解读——每跳一个路由器,关键看:
HOST Loss% Snt Last Avg Best Wrst StDev1. 10.0.0.1 0.0% 100 0.3 0.5 0.2 2.1 0.32. 192.168.1.1 0.0% 100 1.2 1.5 0.8 5.3 0.83. ??? 100.0% 100 0.0 0.0 0.0 0.0 0.04. 202.112.x.x 0.0% 100 5.2 5.8 4.1 12.3 1.2...12. be-101-pe02.ashburn.va 0.0% 100 215.6 220.1 210.3 260.2 12.5...15. ftp.ncbi.nlm.nih.gov 1.0% 100 230.1 235.2 225.3 280.1 11.2- 中间某跳 100% 丢包但后面又正常:该路由器不响应 ICMP,正常现象
- 从某跳之后丢包率突然出现并持续到终点:这里就是瓶颈
- 延迟在某跳大幅跃升:跨国出口——比如从 5ms 跳到 200ms——说明到了国际网关
海洋光缆延迟约 1ms/200km(光速在光纤中约为真空的 2/3)。中美之间约 10000km,物理延迟最低约 70ms。如果 RTT > 300ms,问题不在物理而在路由/拥塞。
1.3 traceroute——备选方案
# 传统traceroute(UDP,容易被墙)traceroute ftp.ncbi.nlm.nih.gov
# TCP模式(更不容易被拦截,因为像正常连接)traceroute -T -p 443 ftp.ncbi.nlm.nih.gov2. 带宽测试——iperf3测真实吞吐
2.1 内网测速
sudo apt install iperf3 -y
# 服务端(在你要测的目标机器上)iperf3 -s
# 客户端(在你的机器上)iperf3 -c 192.168.1.100
# 多线程并行(模拟多连接下载)iperf3 -c 192.168.1.100 -P 8
# 反向测试(服务端发送,测下载速度)iperf3 -c 192.168.1.100 -R典型输出:
[ ID] Interval Transfer Bitrate Retr[ 5] 0.00-10.00 sec 1.09 GBytes 938 Mbits/sec 0 sender[ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec receiverBitrate 接近千兆(940Mbps)= 内网没问题。如果内网只有 100Mbps,检查网线/交换机端口。
2.2 到外网的带宽测试
# 用curl直接下载测试文件curl -o /dev/null -w "%{speed_download}\n" \ https://ftp.ncbi.nlm.nih.gov/genomes/Homo_sapiens/README
# speed_download 单位是 bytes/s,除以 1048576 得 MB/s
# 更详细的curl测速curl -o /dev/null -s -w \ "time_namelookup: %{time_namelookup}\n\time_connect: %{time_connect}\n\time_starttransfer: %{time_starttransfer}\n\time_total: %{time_total}\n\speed_download: %{speed_download}\n" \ https://ftp.ncbi.nlm.nih.gov/genomes/Homo_sapiens/README各时间指标的含义:
| 指标 | 含义 | 正常值 | 异常信号 |
|---|---|---|---|
time_namelookup | DNS解析时间 | <50ms | >1s = DNS服务器慢 |
time_connect | TCP握手时间(含DNS) | <200ms | >2s = 连不上/墙了 |
time_starttransfer | 首字节时间(TTFB) | <1s | >5s = 服务器慢 |
time_total | 总传输时间 | — | — |
speed_download | 下载速度(bytes/s) | — | — |
2.3 实际吞吐量公式
其中 BDP(带宽延迟积):
TCP 的拥塞控制窗口受 BDP 限制。中美之间 RTT=200ms,即使带宽是 1Gbps:
单连接 TCP 最多能用 25MB 的窗口,实际吞吐受此限制。这就是为什么多线程下载(如 axel)能显著加速:
3. DNS诊断——被忽略的瓶颈
DNS 慢会导致每个连接都多等几秒。SRA 下载时频繁建立新连接,DNS 慢会被放大。
# 当前DNS配置cat /etc/resolv.conf
# 测DNS解析速度dig ftp.ncbi.nlm.nih.gov | grep "Query time"# Query time: 120 msec —— 正常# Query time: 3000 msec —— 有问题
# 批量测多个DNS服务器for dns in 8.8.8.8 1.1.1.1 114.114.114.114 223.5.5.5; do echo -n "${dns}: " dig @${dns} ftp.ncbi.nlm.nih.gov +short +time=3 2>/dev/null || echo "TIMEOUT"done
# 查看DNS缓存(systemd-resolved)resolvectl statistics
# 清理DNS缓存sudo resolvectl flush-caches教育网用户常见问题:学校的 DNS 服务器解析国外域名特别慢,或者返回了错误的 IP(被劫持到缓存服务器)。解决:
# 在 /etc/systemd/resolved.conf 中指定上游DNS[Resolve]DNS=223.5.5.5 8.8.8.8FallbackDNS=1.1.1.14. HTTP/FTPSRA下载实战
4.1 用curl诊断下载问题
# 1. 测试连接(不下载数据)curl -I https://ftp.ncbi.nlm.nih.gov/
# 2. 显示详细连接过程curl -v https://sra-download.ncbi.nlm.nih.gov/traces/sra00/SRR/001234/SRR12345678 2>&1 | head -50
# 3. 断点续传(-C -)curl -C - -o SRR12345678.sra \ https://sra-download.ncbi.nlm.nih.gov/traces/sra00/SRR/001234/SRR12345678
# 4. 限速下载(避免占满带宽影响别人)curl --limit-rate 50M -o file.sra https://...4.2 axel多线程下载
sudo apt install axel -y
# 基础用法(-n 线程数)axel -n 8 ftp://ftp.sra.ebi.ac.uk/vol1/srr/SRR123/SRR12345678
# 断点续传axel -n 8 -a ftp://ftp.sra.ebi.ac.uk/vol1/srr/SRR123/SRR12345678# -a: 简洁进度条
# 指定输出文件名axel -n 16 -o SRR12345678.sra ftp://...实测:从国内教育网下载 EBI 的 SRA,单线程 2MB/s,用 axel -n 8 后 15MB/s。提速约 7.5 倍。
4.3 速度优化检查清单
下载速度慢时,逐个检查:
#!/bin/bashTARGET="https://ftp.ncbi.nlm.nih.gov/genomes/Homo_sapiens/README"echo "=== Speed Diagnosis ==="
# 1. DNSecho "1. DNS response time:"dig ftp.ncbi.nlm.nih.gov | grep "Query time"
# 2. Ping延迟echo "2. Ping:"ping -c 5 ftp.ncbi.nlm.nih.gov | grep "rtt"
# 3. 路由echo "3. Route (last 3 hops):"mtr -r -c 5 ftp.ncbi.nlm.nih.gov | tail -3
# 4. HTTP连接速度echo "4. HTTP speed test:"curl -o /dev/null -s -w \ " DNS: %{time_namelookup}s\n Connect: %{time_connect}s\n TTFB: %{time_starttransfer}s\n Speed: %{speed_download} B/s\n" \ "${TARGET}"
# 5. 磁盘写入速度echo "5. Disk write speed:"dd if=/dev/zero of=./test_write bs=1M count=1024 conv=fdatasync 2>&1 | \ grep -o '[0-9.]* MB/s'rm -f ./test_write按这个顺序跑一遍,大多数情况下能在 30 秒内定位到瓶颈所在。
5. 特殊场景:代理和SSH隧道
5.1 为命令行工具设置代理
# HTTP/HTTPS代理export http_proxy="http://proxy.university.edu:8080"export https_proxy="http://proxy.university.edu:8080"
# 对所有工具生效(wget, curl, prefetch, fasterq-dump...)# prefetch 和 fasterq-dump 尊重 http_proxy 环境变量
# 不需要代理的本地地址export no_proxy="localhost,127.0.0.1,.local,.edu.cn"
# 测试代理curl -v --proxy "${https_proxy}" https://www.ncbi.nlm.nih.gov5.2 SSH隧道端口转发
场景:在不能直接访问外网的集群上,通过能上网的跳板机转发:
# 本地端口转发:把本地 8888 端口通过跳板机转到NCBIssh -L 8888:ftp.ncbi.nlm.nih.gov:443 user@jump_host
# 然后在本地用curl --resolve ftp.ncbi.nlm.nih.gov:443:127.0.0.1 https://ftp.ncbi.nlm.nih.gov/
# 动态转发(SOCKS5代理)ssh -D 1080 user@jump_host# 然后设置:export https_proxy="socks5://127.0.0.1:1080"5.3 生信专用下载加速策略
# 策略1:EBI镜像(欧洲,对国内教育网友好)# EBI的FTP通常比NCBI的快wget -c ftp://ftp.sra.ebi.ac.uk/vol1/srr/SRR123/SRR12345678
# 策略2:使用aspera(如果有)ascp -i /path/to/asperaweb_id_dsa.openssh \ -T -l 300M -k 1 \ anonftp@ftp.ncbi.nlm.nih.gov:/sra/.../SRR12345678 .
# 策略3:预取 + 本地快速提取prefetch SRR12345678 --max-size 50Gfasterq-dump SRR12345678 --threads 16
# 策略4:使用国内镜像(如果有高校提供)# 中科院基因组所、华大等有时提供SRA镜像6. 踩坑记录
坑1:ping得通但下载速度只有几十KB
Ping 用的是 ICMP 协议,很多网络设备对 ICMP 不做限速,但对 TCP 大流量有限制。另外,到不同站点的路由可能完全不同——ping google.com 快不代表 NCBI 快。
# 用curl测试真实TCP吞吐curl -o /dev/null https://ftp.ncbi.nlm.nih.gov/genomes/Homo_sapiens/README坑2:MTU不匹配导致TCP连接失败
症状:小文件(HTTP GET)没问题,大文件下载到某个大小就卡死。
原因:路径中有设备的 MTU 小于你的发包大小,且 ICMP Fragmentation Needed 消息被防火墙拦截了(PMTUD 黑洞)。
# 检查当前MTUip link show | grep mtu
# 手动降低MTU试试sudo ip link set dev eth0 mtu 1400# 恢复正常后再改回去:sudo ip link set dev eth0 mtu 1500坑3:axel下载地址含特殊字符导致失败
# URL中有 & ? = 时必须加引号axel -n 8 "ftp://ftp.sra.ebi.ac.uk/vol1/srr/SRR123/SRR12345678?param=value"坑4:iperf3测试速度正常但真实下载慢
iperf3 测的是 TCP 性能(你的机器↔iperf 服务器),但真实下载还涉及:
- 远程服务器的带宽限制
- 中间路由器的拥塞策略
- 磁盘 I/O(下载的同时要写盘)
# 排查是不是磁盘瓶颈# 下载到 /dev/null(纯内存/网络测试)curl -o /dev/null https://...large_file...
# 如果/dev/null很快但写到磁盘慢 → 磁盘问题坑5:/etc/resolv.conf 被覆盖
症状:改完 DNS 重启后又变回去了。
Debian 上 resolv.conf 可能被 systemd-resolved 或 NetworkManager 管理:
# 正确姿势:修改 systemd-resolved 配置sudoedit /etc/systemd/resolved.conf# 添加:DNS=223.5.5.5 8.8.8.8sudo systemctl restart systemd-resolved坑6:curl下载一段时间后速度降到0
症状:开始很快,几分钟后速度降到 0,然后又恢复。
可能是 TCP 拥塞控制算法的问题。BBR 对高延迟链路友好:
# 检查当前算法sysctl net.ipv4.tcp_congestion_control
# 启用BBR(需要root)echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.confecho "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.confsudo sysctl -p
# 验证sysctl net.ipv4.tcp_congestion_control# 输出:net.ipv4.tcp_congestion_control = bbr坑7:prefetch 尊重 http_proxy 但 fasterq-dump 不尊重
sra-tools 的工具行为不一致:
# prefetch 走代理export http_proxy="http://proxy:8080"prefetch SRR12345678 # ✓ 走代理
# fasterq-dump 可能不走# 解决办法:先 prefetch 下载 .sra 到本地,再 fasterq-dump 本地文件fasterq-dump ./SRR12345678/SRR12345678.sra # 纯本地操作7. 总结
| 排查步骤 | 命令 | 看什么 |
|---|---|---|
| 1. DNS | dig ftp.ncbi.nlm.nih.gov | Query time <100ms |
| 2. 延迟 | ping -c 10 | 丢包率0%,RTT<300ms |
| 3. 路由 | mtr -r -c 50 | 定位延迟跳跃点 |
| 4. 真实速度 | curl -o /dev/null -w "%{speed_download}" | MB/s 能接受吗 |
| 5. 并发提速 | axel -n 8 | BDP限制→多线程突破 |
| 6. 本地磁盘 | dd 或 curl -o /path/to/disk | 排除磁盘瓶颈 |
网络问题排查最重要的原则:逐层排除。不要上来就说”网好慢”——先 ping 看延迟,再 curl 看吞吐,再 iperf3 看带宽,最后查 DNS 和路由。90% 的”网慢”最后发现是 DNS 太慢、磁盘写满了、或者单线程被 BDP 限制。
本文于 2026-01-18 在 Debian 12 上实测。ping iputils-s20240117, mtr 0.95, iperf3 3.16, curl 8.11.0, axel 2.17.14。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!