如何在单SSH连接的Shell for循环中并行执行存储卷查询命令
并行查询存储卷容量实现方案
方案一:基于系统自带xargs实现(无额外依赖)
不需要安装第三方工具,利用Linux系统默认自带的xargs命令的并行能力即可实现,核心是通过-P参数控制并发数,-n 1保证每次只传入1个卷名适配查询命令的参数要求。
基础版本脚本:
#!/bin/bash # 可根据服务器负载调整并发数 CONCURRENCY=10 STORAGE_HOST="storageServer01" VOL_FILE="myTotalVol" cat "$VOL_FILE" | xargs -I {} -P $CONCURRENCY -n 1 bash -c ' vol="{}" echo -n "$vol " ssh '"$STORAGE_HOST"' "row 0; set -unit MB; vol show-footprint \"$vol\" -fields volume-blocks-footprint,volume-blocks-footprint-bin0,volume-blocks-footprint-bin1" '
性能优化点:默认每次SSH查询都会新建TCP连接、完成认证,开销较大,可开启SSH连接复用进一步提速,脚本修改如下:
#!/bin/bash CONCURRENCY=10 STORAGE_HOST="storageServer01" VOL_FILE="myTotalVol" # SSH复用套接字路径 SSH_SOCK="/tmp/ssh_storage_sock_%r@%h:%p" # 提前建立常驻SSH连接,后续查询全部复用该连接 ssh -o ControlMaster=yes -o ControlPath="$SSH_SOCK" -o ControlPersist=10m -Nf "$STORAGE_HOST" cat "$VOL_FILE" | xargs -I {} -P $CONCURRENCY -n 1 bash -c ' vol="{}" echo -n "$vol " ssh -o ControlPath='"$SSH_SOCK"' '"$STORAGE_HOST"' "row 0; set -unit MB; vol show-footprint \"$vol\" -fields volume-blocks-footprint,volume-blocks-footprint-bin0,volume-blocks-footprint-bin1" ' # 全部查询完成后关闭常驻SSH连接 ssh -o ControlPath="$SSH_SOCK" -O exit "$STORAGE_HOST"
开启连接复用后,可减少90%以上的SSH连接建立开销,整体执行速度提升明显。
方案二:基于GNU Parallel实现(功能更完善)
如果环境允许安装GNU Parallel(专业并行任务调度工具),可以获得更稳定的输出控制、进度展示、失败重试能力,适合批量任务场景。
- CentOS/RHEL安装:
yum install parallel - Debian/Ubuntu安装:
apt install parallel
脚本示例:
#!/bin/bash CONCURRENCY=10 STORAGE_HOST="storageServer01" VOL_FILE="myTotalVol" SSH_SOCK="/tmp/ssh_storage_sock_%r@%h:%p" # 建立SSH复用连接 ssh -o ControlMaster=yes -o ControlPath="$SSH_SOCK" -o ControlPersist=10m -Nf "$STORAGE_HOST" # 执行并行查询 cat "$VOL_FILE" | parallel -j $CONCURRENCY --group --bar ' echo -n "{} " ssh -o ControlPath='"$SSH_SOCK"' '"$STORAGE_HOST"' "row 0; set -unit MB; vol show-footprint {} -fields volume-blocks-footprint,volume-blocks-footprint-bin0,volume-blocks-footprint-bin1" ' # 关闭SSH连接 ssh -o ControlPath="$SSH_SOCK" -O exit "$STORAGE_HOST"
该方案的核心优势:
--group参数会缓存单个卷查询的全部输出,等任务完成后一次性打印,完全避免多任务并行导致的输出交叉、行混乱问题--bar参数可实时展示全量任务的执行进度、已完成数量、剩余预计时间- 增加
--retries 3参数可对查询失败的卷自动重试3次,规避临时网络波动、存储端临时繁忙导致的查询失败
运行注意事项
- 并发数建议从10开始测试,观察存储服务器管理接口的CPU、连接数负载,再逐步调整,不建议设置超过20的并发,避免打挂存储管理服务
- 先取10个左右的测试卷验证脚本输出和原有串行脚本结果一致,再跑全量3000个卷
- 如需保存结果,直接在脚本执行命令后追加
> vol_capacity_result.txt即可,并行执行不会打乱结果格式
内容的提问来源于stack exchange,提问作者user294110
相关产品推荐
相关产品推荐

