首页/系统与基础设施/自动化运维速查/批量执行并发度的设置方法
批量执行与作业50 条

批量执行并发度的设置方法

并发度是批量执行中控制速度与冲击力的主旋钮,需要区分控制端并行任务数(Ansible forks、xargs -P、parallel -j、pssh -p)、单机内部并行度与连接复用。瓶颈通常出现在控制端 CPU、文件描述符上限、出口带宽或目标端承载能力。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​‌​​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

并发度设置是什么

并发度决定同一时刻有多少目标在执行同一个动作。它有三个层面:控制端的并行任务数、单台目标内部的并行线程数、以及是否复用连接(SSH ControlMaster 或常驻代理)。并发不是越大越快:控制端 CPU、文件描述符上限、出口带宽、跳板机会话数、目标端服务承载力和 sshd 的握手并发上限,任何一个成为瓶颈后,加并发只会把错误率推高。

基本信息

常用参数Ansible -f(forks)、xargs -P、GNU parallel -j、pssh -p、Salt --batch
默认值Ansible 默认 5,xargs 默认串行,parallel 默认按 CPU 核数
调优依据控制端 CPU 与 fd 上限、网络 RTT、目标端服务承受力
前置检查ulimit -n、sshd MaxStartups、跳板机最大会话数

典型使用场景

  • 数百台主机只读巡检,可以放开并发换总时长
  • 目标是数据库或共享存储,必须压低并发避免连接打满
  • 出口带宽有限,并发过高会让请求排队直至超时
  • 经跳板机分发,受跳板机连接数与 NAT 表项约束
  • 长耗时任务配合滚动窗口,避免所有主机同时进入重负载阶段

并发参数用法

并发参数用法
ansible all -m shell -a 'uptime' -f 20              # 20 台同时执行
printf '%s\n' $(cat hosts) | xargs -P 10 -n 1 ssh -n  # 并行 10 路,-n 1 保证每次一台
parallel -j 8 --joblog run.log ssh {} uptime ::: $(cat hosts)
ulimit -n 4096                                       # 控制端 fd 上限决定并发天花板
ss -s | head -3                                      # 观察当前连接数与 TIME_WAIT 堆积

并发参数与默认值

参数典型默认含义
Ansible -f / forks5同时执行的主机数
xargs -P1(串行)并行子进程数
GNU parallel -jCPU 核数作业槽位数
pssh -p32并行 SSH 会话数
Salt --batch不分批按数量或百分比分批推进
并发与限速常配合使用:并发决定同时在途的数量,限速决定单位时间内的启动速率。只调并发容易形成脉冲式冲击,叠加随机间隔后曲线才平稳。
并发拉高之前先启用连接复用(ControlMaster/ControlPersist)或改用常驻代理,可以省掉每台一次的完整握手与认证开销,同样的并发下总时长能明显缩短。
Too many open files、Connection reset by peer、随机几台握手失败,往往不是目标故障,而是控制端 fd 上限或 sshd MaxStartups 被打满。先把并发降下来复现,再逐项排查。

易错点

  • 并发直接拉满导致目标端负载飙升、业务响应劣化,变更窗口反而被拖长
  • 只调并发不启用连接复用,每台都做完整握手认证,控制端 CPU 先成瓶颈
  • 忽略控制端 ulimit -n,并发到达上限后集中报 Too many open files
  • 并发过高触发 sshd 随机丢弃握手,表现为随机几台连接失败而被误判为节点故障
  • 并发只按主机数设定,忽略单台内部还会再起多个线程,实际压力是两者的乘积

数据来源与参考

  • Ansible 官方文档:forks 与执行策略
  • GNU Parallel 手册页
  • OpenSSH 手册 sshd_config(5) 中 MaxStartups 条目

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/batch-execution-concurrency-setting.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌‌​‌​​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​