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 遗留(不在本次范围)¶
- 就绪失败空转:
_wait_for_ssh在pending(端口拒绝)持续时仍会等满install_timeout_sec(2400 s)。 09-28 的两次「很慢」即由此产生。可考虑「连续 N 次pending即提前失败并提示virsh console」, 属判定语义变更,需单独评估。 - 安装时长本身:已是最小化安装(
@^minimal), 缩短只能靠提高规格(vCPU/存储性能)或改安装介质,属规格决策。 - 多台并发:本次单台;
install_max_concurrent > 1时的墙钟表现未复验。
来源:
/home/rain/Documents/kvm/kvm_rocky9_deploy/centos7-perf-20261007/SOP.md| 最后更新:2026-10-07 21:24(由build/sync.py同步,请勿在站点侧修改)