跳转至

SOP — CentOS 7 建机执行效率复验与轮询间隔下沉

主题目录:centos7-perf-20261007/|执行日期:2026-10-07|类型:C 类(改实现体 + 销毁/重建虚机)

1. 背景

用户要求「再跑一次 CentOS 7 主机创建,看时钟墙」,并做执行效率侧的迭代优化。

核查 2026-09-28 日志发现:当日两次运行都失败了,这才是印象里「很慢」的来源——

次序 时间 现象 结果
第 1 次 20:28:59 → 20:47:23 安装完成(508s)后就绪探测 29 次全 unknown 超时触发自动回滚,约 18 分钟
第 2 次 20:49:24 → 21:27:21 安装完成(508s)后就绪探测 117 次全 pending 人工回滚销毁,约 38 分钟
成功记录 — — 554.61 s / 553.81 s

即:正常创建约 9 分钟,而失败路径会空转到超时/人工介入(18~38 分钟)。

2. 目标

# 目标 判据
1 量出正常创建的墙钟与阶段构成 给出阶段耗时表(第 6 章)
2 缩短「事件被发现」的延迟 安装/就绪等待的轮询间隔 15s → 5s,且下沉为配置项
3 行为不变 --dry-run 零变更;幂等复跑 skipped;创建 success 且校验通过

3. 前置条件

  • 宿主 dell-R620,以 root 执行(全部模式必须 sudo);
  • 资源:可用内存 ≥ 8 GiB,/data 可用 ≥ 100 GiB,/dev/kvm 存在;
  • ISO /data/kvm/iso/CentOS-7-x86_64-DVD-1511.iso 存在可读;
  • config/hosts-20260928-centos7.yaml 与凭据文件 config/credentials-centos7.yaml 就位;
  • 目标 IP 192.168.31.30 空闲、无同名域/卷/xml 残留、无孤儿进程锁;
  • 变更前完成 5.1 备份。

4. 影响范围

项 内容
变更对象 deployer.py(3 处:轮询间隔)与 config/hosts-20260928-centos7.yaml(1 处:新增 poll_interval_sec)
影响面 仅 CentOS 7 批次(main_centos7.py);Rocky 9 批次(main.py)共用 deployer.py,同样受益,行为不变
是否停服 否;创建的是独立临时测试机(autostart=false)
窗口期 无要求;集群无在跑作业受本变更影响(仅新增一台 2C/4G 虚机)
并发影响 单台,install_max_concurrent: 1

5. 分步操作

5.1 备份(高危前置)

cd /home/rain/Documents/kvm/kvm_rocky9_deploy
STAMP=$(date +%Y%m%d-%H%M%S)
mkdir -p centos7-perf-20261007/backup
cp -a deployer.py centos7-perf-20261007/backup/deployer.py.bak.$STAMP
cp -a config/hosts-20260928-centos7.yaml centos7-perf-20261007/backup/hosts-20260928-centos7.yaml.bak.$STAMP
ls -l centos7-perf-20261007/backup/

预期:两个 .bak.<时间戳>(本次 STAMP = 20261007-205632)。坑:必须在任何编辑前完成。

5.2 轮询间隔下沉(实现体:deployer.py)

原实现把等待间隔写死为 15 s,两处:

  • _wait_for_install_shutdown():轮询 virsh domstate,判据为域转为 shut off;
  • _wait_for_ssh():轮询 TCP 22 端口,判据为端口可连接。
# 概念等价(Python 侧实现,非 shell)
# __init__:  self.poll_interval_sec = float(runtime.get("poll_interval_sec", 5))
# 两处:      time.sleep(15)  ->  time.sleep(self.poll_interval_sec)

配置侧新增(config/hosts-20260928-centos7.yaml 的 runtime 段):

runtime:
  poll_interval_sec: 5      # 安装/就绪等待的轮询间隔(秒),默认 5

坑:间隔变小→探测次数变多(本次安装段 38 → 99 次),但探测是本地 virsh / TCP 连接,开销可忽略;不改判定语义、不改超时值(仍为 install_timeout_sec: 2400)。

5.3 离线验证(上机前)

cd /home/rain/Documents/kvm/kvm_rocky9_deploy
.venv/bin/python -c "import ast;ast.parse(open('deployer.py').read());print('SYNTAX_OK')"
sudo .venv/bin/python main_centos7.py --config config/hosts-20260928-centos7.yaml --dry-run

预期:SYNTAX_OK;dry-run 退出码 0、零变更(状态: skipped)。失败判断:配置校验报未知字段 → 回退 5.2 的配置行。

5.4 基线创建(计时,零改动)

cd /home/rain/Documents/kvm/kvm_rocky9_deploy
s=$(date +%s)
sudo .venv/bin/python main_centos7.py --config config/hosts-20260928-centos7.yaml
echo "WALL=$(( $(date +%s) - s ))s"

等价底层动作(实现体:deployer.py 的 _ensure_volumes / _create_domain / _finalize_domain):

# 创建稀疏系统盘
virsh --connect qemu:///system vol-create-as hdd-pool centos7-01.qcow2 30G --format qcow2
# 无人值守安装(ks 由 templates/centos7/ks.cfg.tmpl 渲染后经 inst.ks 传入)
virt-install --connect qemu:///system --name centos7-01 --memory 4096 --vcpus 2 \
  --disk vol=hdd-pool/centos7-01.qcow2,format=qcow2 --network bridge=br0,mac=52:54:00:31:10:01 \
  --location /data/kvm/iso/CentOS-7-x86_64-DVD-1511.iso --osinfo name=centos7 --noautoconsole
# 安装以 poweroff 收尾;随后固化定义(去 direct kernel boot)再启动
virsh --connect qemu:///system define <build/centos7-01/domain.xml>
virsh --connect qemu:///system start centos7-01

预期:状态: success,节点校验 状态=running SSH=可达 自启=否。

5.5 优化后重建(高危:先销毁再建)

cd /home/rain/Documents/kvm/kvm_rocky9_deploy
# 【高危】销毁不可恢复:域 + 磁盘一起删
sudo .venv/bin/python main_centos7.py --config config/hosts-20260928-centos7.yaml --rollback --force
virsh --connect qemu:///system list --all | grep centos7 || echo "域已清理"
s=$(date +%s)
sudo .venv/bin/python main_centos7.py --config config/hosts-20260928-centos7.yaml
echo "WALL=$(( $(date +%s) - s ))s"

坑:--rollback 连磁盘一并删除、不可恢复;须 --force。回滚后的残留检查(域/卷/xml)三项都要为空才可重建。

6. 验证

6.1 幂等与零变更

sudo .venv/bin/python main_centos7.py --config config/hosts-20260928-centos7.yaml --dry-run
sudo .venv/bin/python main_centos7.py --config config/hosts-20260928-centos7.yaml

预期:两次均为 状态: skipped、零变更。本次实测:dry-run 0.26s、复跑 0.25~0.26s(优化前后各验证一次)。

6.2 墙钟与阶段对照

阶段 基线(间隔 15s) 优化后(间隔 5s) 差
门禁 + 巡检 + 卷 + 建域 ~4.8 s ~4.9 s —
等待安装完成 556.0 s(第 1→38 次探测) 492.6 s(第 1→99 次探测) −63.4 s
固化域定义 + 启动 2.1 s 2.1 s —
等待 sshd 就绪 36.0 s(第 1→3 次) 30.3 s(第 1→5 次) −5.7 s
校验 0.1 s 0.1 s —
合计(模块自计) 599.30 s 530.51 s −68.8 s(−11.5%)
外部 date 墙钟 600 s 531 s −69 s

历史参照:2026-09-28 成功两次 554.61 s / 553.81 s。

归因(务必看清):−68.8 s 中,

  • 轮询下沉的确定贡献 ≈ 10 s:发现延迟从「平均半个 15 s 间隔」降到「平均半个 5 s 间隔」,安装段与就绪段各约 −5 s;
  • 其余 ≈ 59 s 属安装时长波动(两次运行相差 27 分钟,同宿主 21 台虚机共存、磁盘 IO 竞争),不可归因于本次优化。

即本优化的真实收益约 1.7%;单次对比不足以把它从负载噪声中分离出来。

6.3 阶段占比(优化后)

等待安装 92.8% + 等待就绪 5.7% + 其余 1.5% —— 墙钟由 CentOS 7 安装本身决定, 程序侧可控部分(轮询粒度、探测开销)合计不足 2%。

7. 回滚

  • 备份位置:centos7-perf-20261007/backup/,台账见 centos7-perf-20261007/backup/README.md。
  • 回滚实现体与配置:
cd /home/rain/Documents/kvm/kvm_rocky9_deploy
cp -a centos7-perf-20261007/backup/deployer.py.bak.* deployer.py
cp -a centos7-perf-20261007/backup/hosts-20260928-centos7.yaml.bak.* config/hosts-20260928-centos7.yaml
  • 回滚后验证:py_compile 通过 + --dry-run 零变更 + 一次创建 success。
  • 回滚触发条件:创建失败;配置校验报告未知字段;幂等复跑非 skipped;节点校验不通过。
  • 销毁虚机(与本次变更无关的独立动作):main_centos7.py --rollback --force(不可恢复)。

8. 风险说明

风险 缓解
轮询间隔过小导致探测次数激增 下限 5 s;探测为本地 virsh / TCP,开销可忽略;间隔可配置回退
墙钟受宿主负载波动 已注明「单次对比无法分离 ~10 s 收益」;需要多轮同类样本才可量化
就绪失败时仍会空转至超时 本次未改动此行为(仍 2400 s 上限);若要「失败快速判定」属另一变更,见附录 B
--rollback 不可恢复 需 --force;执行前先做残留检查;本机为临时测试机(autostart=false)
改动共享的 deployer.py 影响 Rocky 9 批次 仅改等待间隔的取值来源,未改判定与超时;已用 --dry-run 验证 Rocky 批次零变更

附录 A 交付物清单

文件 说明
SOP.md 本文件
run1-baseline.out 基线创建输出(599.30s)
run2-idempotent.out 基线后幂等复跑(skipped)
run3-dryrun.out 优化后 dry-run(零变更)
run4-optimized.out 优化后重建输出(530.51s)
run5-idempotent.out 优化后幂等复跑(skipped)
rollback.out 销毁记录
backup/ 实现体与配置备份 + README.md 台账

附录 B 遗留(不在本次范围)

  1. 就绪失败空转:_wait_for_ssh 在 pending(端口拒绝)持续时仍会等满 install_timeout_sec(2400 s)。 09-28 的两次「很慢」即由此产生。可考虑「连续 N 次 pending 即提前失败并提示 virsh console」, 属判定语义变更,需单独评估。
  2. 安装时长本身:已是最小化安装(@^minimal), 缩短只能靠提高规格(vCPU/存储性能)或改安装介质,属规格决策。
  3. 多台并发:本次单台;install_max_concurrent > 1 时的墙钟表现未复验。

来源:/home/rain/Documents/kvm/kvm_rocky9_deploy/centos7-perf-20261007/SOP.md | 最后更新:2026-10-07 21:24(由 build/sync.py 同步,请勿在站点侧修改)