
1. 为什么大文件下载必须考虑Aspera1.1 数据下载卡在TCP上做生物信息的人应该都有这种经历从NCBI、EBI这类公共数据库下载一个几十GB的测序数据用wget或者浏览器直接下载速度能跑到几MB/s都算运气好很多时候直接是几十KB/s慢慢爬一个文件下一整天还没下完中间断了又得重来。问题出在哪里其实不完全是服务器带宽不够更多时候是卡在传输协议上。传统HTTP/FTP下载用的是TCP协议TCP为了保证数据不丢包有一套复杂的确认重传机制。一旦网络出现波动、丢包率升高TCP会主动降低发送速度这在跨国、长距离传输的场景下特别吃亏。公共数据库大多在海外我们访问的时候链路长、节点多轻微丢包就会被放大成速度的断崖式下跌。而这还不是最要命的更麻烦的是TCP是单连接传输一个文件就是一条连接带宽再高也只能吃满一个线程。Aspera用的是自家研发的fasp协议底层走UDP而不是TCP。UDP本身不管丢包和顺序Aspera在这个基础上自己实现了可靠性控制、丢包重传和带宽检测相当于把原来交给操作系统内核的传输控制逻辑全部拿到上层自己管理。这样做的好处非常直接网络质量越差、延迟越高、丢包越多对比就越明显。在跨国传输场景下Aspera经常能稳定跑满本地带宽我实测过从EBI下载一个28GB的基因组文件千兆带宽下能稳定在50MB/s到80MB/s而同网络环境下wget只有2MB/s到5MB/s差距是十倍以上。还有一点很实用Aspera能把一个文件拆成多个块并发传输默认情况下会动态探测可用带宽并调整并发数。带宽越大优势越明显。如果你经常要下载大型公共数据掌握Aspera基本就是必选项。1.2 哪些数据源真正需要Aspera并不是所有下载场景都用得上Aspera得看数据源是否提供对应的接入点。目前公共生物数据库基本都支持我用过并且亲测有效的主要有这么几类NCBI的SRA数据库这是目前最大的测序原始数据存储库文件大、数量多也是大家吐槽下载速度最多的一个。ENA欧洲核苷酸档案库和EBI旗下的多个数据库支持Aspera下载也有简单的FTP通道但Aspera速度优势明显。Ensembl基因组浏览器基因组FASTA文件、GTF注释文件、变异文件都有Aspera接入点。UCSC Genome Browser提供基因组数据的Aspera下载路径。部分云厂商的对象存储服务比如有些云服务商为了大文件交付也提供Aspera兼容接口。除了公共数据库很多科研机构内部传输大文件也会部署Aspera服务端。判断一个站点是否支持Aspera最直接的方式是在文档里搜aspera或ascp或者看下载页有没有提供类似era-faspfasp.sra.ebi.ac.uk这样的连接地址。只要有这个就能用ascp命令行工具对接。这里需要区分一下Aspera Connect的浏览器插件和ascp命令行工具是两回事。浏览器插件是给网页端手动下载用的真正要批量下载、写脚本必须用命令行工具ascp。后面的内容全部围绕ascp展开。2. 环境安装与基础操作2.1 安装客户端别用错版本Aspera的客户端有好几套常见的有IBM Aspera Connect、IBM Aspera CLI、还有各数据库自己打包的版本。最容易踩的坑是第一眼看到官网就装了Connect版结果发现它是个浏览器插件没有独立的命令行程序。我建议的安装方式是这样的Linux服务器上最好直接去IBM官网下载Aspera CLI安装包或者用conda安装。Conda里有一个叫aspera-cli的包安装命令很简单conda install -c bioconda aspera-cli装完之后确认一下which ascp ascp -h如果能看到帮助信息说明装好了。这里要注意版本我以前遇到过conda默认源里版本比较旧的情况连接新版服务器时会报协议不兼容的错。遇到这种情况建议直接去官方下载的RPM或tar包安装。除了命令行程序本身还有一个关键文件用于SSH免密认证的私钥。Aspera客户端安装目录下通常带一个etc/asperaweb_id_dsa.openssh文件这个文件是公共测试用的密钥但实际对接不同数据库时很多站点会让你用各自的专用密钥。比如EBI的文档里就明确要求使用他们自定义的密钥路径直接用默认key很容易握手失败。安装完成后我习惯先把ascp的绝对路径记住因为后面写脚本时不同服务器环境PATH可能不一致直接写路径最保险。比如通过conda安装的路径一般在~/miniconda3/envs/your_env/bin/ascp或者/opt/aspera/cli/bin/ascp。用which ascp查到的路径直接记下来写进脚本里。2.2 ascp命令结构与关键参数记忆ascp的命令格式看起来复杂实际上核心结构就是一个模板记熟了就能套用ascp [参数] 用户名主机:文件路径 本地目录和scp非常像区别在于多了很多和传输控制相关的参数。我把常用的参数整理了一下用熟了之后其实没必要全部记住关键是这几个参数作用我的使用习惯-i指定私钥文件路径必填对接不同站点用不同key-P指定端口默认33001按数据库文档调整-l限速单位Mbps不设经常跑满带宽会影响别人建议设置-k断点续传开关设成1中断后能接着传-T不加密传输公共数据下载我一般加上省CPU-Q启用自适应流控动态带宽环境更稳一般开着--overwrite覆盖已存在文件断点续传场景慎用--file-manifest生成传输清单批量下载时记录文件列表-d按目录结构批量下载下载整个目录时用举个例子从EBI的ENA下载一个文件典型命令长这样ascp -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -P 33001 \ -l 500M \ -k 1 \ -T \ era-faspfasp.sra.ebi.ac.uk:/vol1/fastq/SRR001/SRR001666/SRR001666_1.fastq.gz \ ./这里era-fasp是EBI固定的用户名fasp.sra.ebi.ac.uk是Aspera服务地址路径从根目录开始写。这个小例子跑通之后就可以进入批量下载的实战了。3. 典型数据库的批量下载实战3.1 NCBI SRAprefetch与ascp结合NCBI的SRA数据库是最让人头疼的一个文件散落在多个存储节点上URL不固定直接用Aspera下载还要自己解析路径比较麻烦。好在NCBI官方提供了SRA Toolkit里面的prefetch子命令支持调用Aspera作为下载后端。先配置一下让prefetch使用ascpvdb-config --set /tools/ascp/path /path/to/ascp vdb-config --set /tools/ascp/ascp_private_key /path/to/asperaweb_id_dsa.openssh配置完成后之前用prefetch --max-size 200G SRR12345678下载时还是走HTTPS需要显式指定协议prefetch --transport ascp SRR12345678--transport参数可以指定ascp或者http默认是http。这个参数在批量下载时非常关键比如要下载一个项目下所有SRA编号cat sra_ids.txt | while read id; do prefetch --transport ascp --max-size 500G $id done这个方案的好处是NCBI帮你把存储节点的复杂路径封装好了不需要自己拼地址省去了很多麻烦。但有个前提就是SRA Toolkit需要配置对正确的ascp路径和key路径配置不对会直接报找不到可执行文件或者认证失败。有一个我踩过好久的坑SRA Toolkit版本和ascp版本不兼容时prefetch --transport ascp会启动进程后卡住不下载。后来换成新版SRA Toolkit同时用conda安装的ascp问题就消失了。如果你遇到类似卡住的情况优先检查版本配套。3.2 ENA/EBI异步清单批量脚本相比之下ENA是做得最正规的一个。ENA的下载路径是固定的而且提供了一份完整的文件清单filereport可以按项目、按样本批量生成下载地址。我常用的流程是这样先去ENA的网站用它的Advanced Search查到你需要的项目ID比如PRJEB12345然后在结果页面选择导出为TSV格式勾选需要的列通常包括fastq_aspera、submitted_ftp这些字段。导出的TSV文件里每一行就是一个样本的文件信息其中fastq_aspera列给的路径比如/vol1/fastq/SRR001/SRR001666/SRR001666_1.fastq.gz这就是ascp需要的远程路径。拿到清单后写一个简单循环while IFS$\t read -r sample ftp_path asura_path; do if [[ $asura_path ! $asura_path ! fastq_aspera ]]; then ascp -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -P 33001 -l 300M -k 1 -T \ era-faspfasp.sra.ebi.ac.uk:${asura_path} \ ./fastq/ fi done filereport_tsv.txt这个脚本跑起来之后可以挂着慢慢下。注意era-faspfasp.sra.ebi.ac.uk这个地址要从ENA官方文档里核对我记得老文档里还有fasp.ebi.ac.uk之类的地址有些已经废弃了用老的会连接失败。还有一个小细节ENA的faspp路径不含域名前缀直接以/vol1/...开头而NCBI的路径往往带/sra/sra-instant/reads/ByRun/sra/...这种前缀。两家的路径规则不一样混用时不要想当然。3.3 Ensembl/UCSC路径规划与通配符Ensembl和UCSC的Aspera接入主要是为基因组文件、注释文件准备的。他们的路径结构很简单基本上是/data/pub/...这样的固定格式。以Ensembl为例下载人类参考基因组GRCh38的FASTA文件ascp -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -P 33001 -T \ anonftpftp.ensembl.org:/pub/release-109/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz \ ./用户名是anonftp地址是ftp.ensembl.org端口还是33001。Ensembl的Aspera服务体验比较稳定速度能跑得很高。UCSC这边略有不同它需要从以下位置下载文件ascp -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -P 33001 -T \ qateamhgdownload-ue.ucsc.edu:/hg38/chromosomes/chr1.fa.gz \ ./UCSC的Aspera用户名是qateam主机名通常是hgdownload-ue.ucsc.edu或hgdownload-asia.ucsc.edu。亚洲节点速度有时候比主节点更快可以两个都试试。如果要批量下载所有染色体文件一种思路是用通配符但ascp对通配符的支持不太一致某些版本直接传*字符不会展开。更可靠的做法是在bash里先展开通配符或者直接写循环for chr in {1..22} X Y MT; do ascp -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -P 33001 -T \ qateamhgdownload-ue.ucsc.edu:/hg38/chromosomes/chr${chr}.fa.gz \ ./chr/ done这样虽然慢一点但每个文件单独处理失败时也方便单独重试不会一错到底。3.4 通配符与批量循环脚本批量下载的另一个常用技巧是处理一个目录下多个文件的场景。ascp有一个-d参数可以直接复制整个目录结构和里面所有文件速度比循环单个文件更快因为不用反复握手。ascp -d -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -P 33001 -T \ era-faspfasp.sra.ebi.ac.uk:/vol1/fastq/SRR001/ \ ./fastq/这个命令会把SRR001目录下所有文件连同目录结构一起下载下来。但说实话我更常用的是TSV清单循环方案原因是可控性强。公共数据库的数据一直在更新如果你只是要其中某几个样本单独路径循环比整个目录灌下来更精准而且中途某个文件失败不会影响其它文件。文件多的时候可以配合xargs -P做简单的并行cat file_paths.txt | xargs -P 4 -I {} ascp -i key -P 33001 -T era-faspfasp.sra.ebi.ac.uk:{} ./fastq/-P 4表示同时起4个ascp进程。这里要注意多进程并发时总带宽会叠加如果不限速很容易把本地带宽吃满建议在业务闲时使用加-l参数给每个进程限速。4. 批量脚本与性能调优4.1 一个可复用的批量下载脚本靠零散的命令行拼凑遇到几十个文件还能应付一旦文件数量上百甚至上千就必须写成脚本统一管理。我这里分享一个我自己一直用的脚本模板它具备以下几个核心能力自动创建目录、断点续传、失败重试、记录日志。#!/bin/bash # 批量下载脚本传入一个包含远程路径 本地保存名的列表文件 set -u ASCP/path/to/ascp KEY/path/to/asperaweb_id_dsa.openssh HOSTera-faspfasp.sra.ebi.ac.cn # 按需替换 PORT33001 OUTDIR/data/raw_fastq LIST_FILE$1 LOG_FILE$2 mkdir -p $OUTDIR while IFS$\t read -r remote_path local_name; do # 跳过空行和注释 [[ -z $remote_path || $remote_path \#* ]] continue local_file$OUTDIR/$local_name if [[ -s $local_file ]]; then echo [SKIP] $local_name already exists $LOG_FILE continue fi retry0 while [[ $retry -lt 3 ]]; do echo [START] $remote_path $LOG_FILE $ASCP -i $KEY -P $PORT -l 500M -k 1 -T \ --overwritediff \ ${HOST}:${remote_path} $OUTDIR $LOG_FILE 21 if [[ $? -eq 0 ]]; then echo [DONE] $local_name $LOG_FILE break else retry$((retry1)) echo [RETRY] $retry for $local_name $LOG_FILE sleep 5 fi done done $LIST_FILE这个脚本的核心逻辑其实很简单但有几个细节要专门说说。第一--overwritediff这个参数配合-k 1很重要。-k 1表示断点续传时创建临时文件--overwritediff表示只覆盖那些比本地新的文件或大小不一致的文件避免重复下载已经完整的文件。这两者缺一个续传行为都会变得很怪。第二[[ -s $local_file ]]判断本地文件存在且大小大于0如果上一次下载已成功这次直接跳过。这个判断虽然朴素但在大批量下载时非常实用因为ascp完成传输后写出的文件大小和远程文件必然一致一旦大小不为0基本可以认为传输成功只要ascp进程没有报错。第三失败重试最多3次每次间隔5秒避免服务器临时抖动导致整批任务失败。这个重试逻辑在长时间批量任务里几乎是必需项因为网络不可能永远稳定没有重试机制可能睡一觉起来发现任务在第23个文件就停了。4.2 并发、限速、断点续传的调优建议Aspera的调优核心就一句话让每个传输任务都能吃满但不抢占。限速参数-l的单位是Mbps不是MB/s这里好多人会弄混。比如你想限制每个任务最大100MB/s需要设置-l 800M因为100MB/s 800Mbps。实际下载速度还要看磁盘写入速度、网络链路是否拥塞没必要追求跑满理论值。并发数怎么定我们实验室是千兆带宽实测下来单个ascp任务100Mbps和800Mbps的差距很大但跑到800Mbps以上之后再提限速对单文件传输没明显帮助因为瓶颈可能到了服务器端或本地磁盘。因此我自己通常每个任务设-l 500M同时开2到3个任务并行总体带宽预留一部分给其它用途。断点续传这里有个容易误导人的地方-k 1只是让ascp在本地生成一个.aspx临时文件如果传输中断下次运行会自动从这个临时文件继续。但如果你手动删了临时文件或者换了个目录名续传就失效了。还有个坑是--overwritealways会强制重传整个文件相当于放弃断点续传所以批量脚本里不要随手加这个参数。网络环境变化大的时候可以加上-Q开启自适应流控ascp会自动探测可用带宽并动态调整速度不至于在丢包率升高时崩溃。这个参数对长途跨国的网络链路特别友好。4.3 完整性校验与磁盘规划批量下载最容易忽视的就是校验。ascp传输本身有UDP层的校验可以保证传输过程中没有因网络导致的bit翻转但没法保证服务器源文件本身完好。公共数据库偶尔会出文件损坏、大小不对的情况所以批量任务结束后务必做完整性校验。最直接的办法是下载数据库提供的checksums文件。比如ENA每个目录下有md5sums.txt或MD5SUMSEnsembl也有对应的.md5文件。下载后统一比对cd /data/raw_fastq md5sum -c md5sums.txt md5_check.log 21 grep -v : OK md5_check.log如果md5sums.txt里给出的路径和本地文件名能对上md5sum -c会把所有校验结果一次性输出挑出失败项重新下载就行。磁盘规划这块也要提前想清楚。测序数据下载前我一般会先估算总量SRA文件大致是未压缩数据大小的一半不到但fastq.gz基本是1:1的大小。用du -sh盯一下本地目录增长情况一旦发现磁盘占用超过80%就该考虑分批下载或者先清理不用的临时文件。存放目录建议用单独的存储池或磁盘分区避免系统盘被灌满影响服务器运行。5. 高频出错场景与排查方案5.1 鉴权失败的几个真相用Aspera下载报错时最常遇到的是Authentication failed或者Session stopped这类信息。很多人第一反应是key文件不对但实际排查下来大部分是别的原因。先确认三件事私钥路径是否正确、用户名是否正确、端口是否正确。这三个任何一个错了都会报认证相关错误。以EBI为例用户名固定是era-fasp端口是33001如果其中某个写错就会出现认证失败。NCBI则要求用户名为anonftp一类。其次私钥文件的权限不能太开放。ascp对私钥文件的权限敏感如果asperaweb_id_dsa.openssh对其他用户可读会直接拒绝使用。解决办法很直接chmod 600 ~/.aspera/connect/etc/asperaweb_id_dsa.openssh还有一个隐蔽问题某些conda安装的aspera-cli自带的key路径不在~/.aspera/...下而是在conda环境的etc目录里。如果你按网上教程把key路径写成了~/.aspera/connect/etc/asperaweb_id_dsa.openssh但实际根本没安装Aspera Connect自然找不到key。最稳妥的办法是用find / -name asperaweb_id_dsa.openssh 2/dev/null找到真实路径。5.2 路径格式不对导致下载失败Aspera的远程路径格式遵循严格规则以/开头不能包含~也不能用相对路径。很多人从网页上复制下载链接复制出来的是完整的https://地址直接拼到ascp命令行里肯定不行。正确做法是只保留从根目录开始的路径部分。还有几个容易踩的坑路径中包含特殊字符比如空格、、?时需要给整个远程路径加引号否则会被shell拆分。有时候远程文件名带方括号比如SRR001[1_2].fastq.gz则要谨慎处理通配符问题或者用反斜杠转义。NCBI的SRA路径曾经有过一个变化老版本路径是/sra/sra-instant/reads/ByRun/sra/SRR/SRR001/SRR001666/SRR001666.sra新版本变成了通过prefetch自动拼接。如果你用老路径下载新数据可能报No such file or directory这时候把路径里的sra-instant去掉或者干脆用prefetch去解析更省心。5.3 连接不稳定与超时的处理长途传输时偶尔会中途断开或者长时间没有进度。先区分两种情况是真的卡住还是在正常跑。ascp默认会输出实时进度如果刷新间隔内数据一直没动大概率是连接断了或者服务器端没了响应。处理超时问题有几个手段加--timeout参数设置超时值比如--timeout120表示120秒无进展就断开配合脚本重试机制能自动恢复。加-Q开启自适应流控在丢包率高的时候会调整发送速率减少断流概率。降低-l限速值有些服务器节点带宽有限你把客户端限速调得很高服务器端反而会丢包更多。还有一个经常被忽略的是防火墙和NAT超时。数据中心或公司网络里长时间没有数据传输时防火墙会静默断开空闲连接。这种场景下定期查看进度并确保传输持续进行是务实做法或者把任务拆小。5.4 校验传输结果与毫末细节下载完成后除了md5校验我还习惯再检查一下文件数量和解压测试。对fastq.gz这种压缩格式可以直接用zcat做个简单验证zcat SRR001666_1.fastq.gz | head -n 4能正常输出内容说明文件结构基本没问题。也可以统计reads数和原数据库的元数据做比对。最后一个小建议下载任务中途千万不要随手按CtrlCascp收到中断信号虽然会保留.aspx临时文件但如果你是手动中断而不是网络断的某些版本会直接把临时文件标记为无效下次续传时从头开始。需要中断任务时先kill到ascp进程确认.aspx文件还在再运行续传命令。6. 批量下载的管理心得关于Aspera批量下载的使用积累了一些实战体会。个人认为工具本身并不难难的是建立一套适合自己环境的下载流程和管理习惯。这里再把完整思路做一个收束方便参考。对于批量下载这件事我的习惯是分成四层来推进。第一层是确定数据源与文件清单能通过API或TSV导出就绝不手工维护第二层是搭建一个可靠的下载脚本把断点续传、重试、日志这些基础能力全部内置第三层是合理规划带宽和磁盘资源不要为了追求速度把所有任务一次性推上去第四层是建立校验认知下载完成不算完验完md5、解压测试通过才算真正可用。在长期维护一批数据时日志文件和清单文件的价值非常大。我通常会为每个下载任务建一个目录把filereport文件、下载脚本、运行日志、md5校验结果全部放在一起。这样过了一个月再回来看任何人都能快速知道这批数据的来龙去脉。Aspera相比传统FTP/HTTP的提速效果确实是革命性的但也不是银弹。它解决的是大文件走长距离网络的问题如果你的瓶颈在本地磁盘IO或者NAS性能再好的传输工具也救不了。另外公共数据库的资源是共享的下载时注意限速和礼貌使用尽量不要同时开启几十个高并发任务避免给服务器造成过大压力。我从第一次用ascp下载数据被它的速度惊艳到到后来写脚本批量拉取几百个样本中间也踩了不少坑。这篇文章基本把我踩过的坑和最终解决方案都梳理出来了。如果你正在为下载公共测序数据发愁照着我这套流程配置一遍应该能省下不少时间。except现在很多数据库还在更新自己的Aspera接入协议动手前先翻一下官方文档确认连接参数这个习惯能帮你避开很多版本更新带来的兼容性问题。