SIT-Power-CycleTest — 服务器 SIT 电源循环测试工具使用说明书

1. 概述

SIT-Power-CycleTest 是 Inventec TA Team 开发的服务器 SIT(System Integration Testing)电源循环测试工具,版本 Rev: 1.24.0

核心功能

在服务器 SIT 测试过程中,自动执行长时间电源循环(AC/DC/Reboot/Reset)测试,并在每轮循环中完成以下任务:

  1. 系统硬件检查:FRU、CPU、内存、SMBIOS、MAC 地址等系统信息与首轮基线比对
  2. PCIe 设备检查:lspci 设备枚举、LnkCap/LnkSta 速率/带宽比对、UESta/CESta 异常寄存器解析
  3. 存储设备检查:HDD/NVMe/Aliflash SSD 序列号、SMART 日志、分区信息、磁盘速率比对
  4. 网络设备检查:NIC 驱动版本、MAC、厂商、链路速度比对
  5. SDR 传感器监控:每 5 秒轮询 BMC SDR,检测非 ok/ns 状态传感器
  6. SEL/dmesg 日志过滤:基于黑白名单的日志筛查,支持通用和 ByteDance 专项规则
  7. FIO I/O 压力测试:支持每轮循环中运行 FIO 磁盘读写压力(可选)
  8. 客户专项检查:ByteDance 部件压力测试、Ali MOC/MOC 日志收集/AVMS 分区校验、Tencent BIOS ping/cyclelog 收集
  9. 报告输出:所有检查结果分类写入 reports/ 目录,含汇总失败日志

电源操作模式

模式 标志 动作 说明
OS Reboot --reboot reboot -f 操作系统软重启
OS Reset --reset ipmitool raw 0 2 3 BMC 硬件复位
DC Cycle --dccycle ipmitool raw 0 2 2 DC 电源循环(断电→上电)
AC Cycle --accycle ipmitool power off AC 电源循环(需配合 PDU 治具)
Dual Mode --reboot --dccycle 前 N 圈 Reboot + 后 N 圈 DC 组合模式
Power Off --tc-poweroff 安全关机 Tencent BIOS 安全下电测试

测试模式

模式 标志 说明
System Test --system 仅系统硬件检查(无 I/O 压力)
FIO Test --fio 在每轮循环中运行 FIO I/O 压力测试
TC-FIO --tc-fio Tencent 专项 FIO(4k/128k 模式 + NVMe 命令压力)

支持的客户项目

客户 状态 专项功能
Baidu 支持 OCSSD Reboot/DC, 存储 Reboot/DC, ipmitool 升级
Ali 支持 AVMS 分区校验, Aliflash SSD, MOC 卡, MOC 重启 CN 实例, TPCM, 远程 DC
Tencent 支持 TC-FIO, BIOS ping, cyclelog, SDR 延迟, 安全下电
JD 支持
ByteDance 支持 部件压测 (CPU/Mem/Storage/Network/BMC/GPU), HDD 识别/NIC Link/Lava Expander 检查

支持的操作系统

技术栈

本地下载📁 本地下载

提示:点击按钮将打开网络文件夹,点击即可下载

文件 适用系统 版本
SIT-Power-CycleTest-v1.24.0.zip RHEL/CentOS 6/7/8, Debian 9/10 v1.24.0

2. 目录结构

SIT-Power-CycleTest-v1.24.0/
├── README.md                          # 项目说明文档
├── hosts                              # Ansible 主机清单模板
├── .gitlab-ci.yml                     # GitLab CI/CD 流水线配置
├── .gitignore                         # Git 忽略规则
├── BD_args.json                       # ByteDance 压测参数配置
│
├── PowerCycleTest.sh                  # ★ 主入口脚本(初始化 + 首轮检查 + 环境准备)
├── cycle_reboot.sh                    # ★ 循环执行脚本(每轮开机自动运行)
├── stop_osreboot.sh                   # OS Reboot 模式停止脚本(自动生成)
├── stop_accycle.sh                    # AC Cycle 模式停止脚本(自动生成)
│
├── lib/                               # 库模块目录
│   ├── arguments.sh                   # CLI 参数解析与验证
│   ├── common_function.sh             # 通用函数(日志/帮助/UUID/自动登录)
│   ├── global_env_set.sh              # 全局默认变量初始化
│   ├── helpers.sh                     # Shell 颜色代码/显示辅助/进度条
│   ├── colors.py                      # Python ANSI 终端颜色类
│   ├── progressbar.py                 # Python 进度条(含线程支持)
│   ├── helpers.py                     # Python 工具函数(文件 I/O/版本解析/ANSI 清除)
│   │
│   ├── reboot_action.sh               # 电源动作执行(reboot/dccycle/reset/accycle/dual)
│   ├── remote_control.sh              # 远程 SSH 通过 Client + BMC 执行 DC/reset
│   ├── bootloader.sh                  # rc-local 服务配置/引导加载器
│   ├── gene_stop_script.sh            # 停止脚本与 fail_check 脚本生成
│   │
│   ├── system_check.sh                # 系统硬件检查(FRU/CPU/内存/SMBIOS)
│   ├── sdr_sensor.sh                  # SDR 传感器状态检查/功耗监控
│   ├── lspci_device.sh                # PCIe 设备检查(速率/带宽比对/设备丢失检测)
│   ├── lspci_parser.py                # Python PCIe UESta/CESta 异常寄存器解析器
│   ├── netcard.sh                     # NIC 驱动版本/MAC/厂商/链路速度检查
│   │
│   ├── disk.sh                        # HDD/NVMe/Aliflash SSD SN/SMART/分区/速率检查
│   ├── fio.sh                         # FIO I/O 压力测试配置与执行
│   ├── raid.sh                        # RAID 卡 smart 日志收集与比对
│   ├── hba.sh                         # HBA 卡信息收集/Expander phy 检查/盘 smart
│   ├── expander.sh                    # ByteDance Lava Expander phy error 计数器检查
│   │
│   ├── log_check.sh                   # SEL/dmesg 黑白名单日志过滤
│   ├── black_white_list.py            # Python 黑白名单过滤引擎
│   ├── bw_list.json                   # ★ 黑白名单关键字库(SEL/dmesg common + bytedance)
│   ├── fail_check.sh                  # 循环后故障检测脚本(自动生成)
│   │
│   ├── bios.sh                        # BIOS NUMA/HT 切换 (Ali DC)
│   ├── avms_test.sh                   # Ali AVMS 磁盘分区创建/MD5 校验
│   ├── Moc.sh                         # Ali MOC 卡 CN 实例启动/状态检查
│   ├── MocLogCollect.sh               # MOC 子系统日志收集/比对
│   ├── bytedance_log_check.sh         # ByteDance 专项日志检查(SEL/dmesg/NIC/HDD)
│   ├── smart_nic.sh                   # SmartNIC 远程 SSH 健康检查与日志收集
│   ├── remote_info_check.sh           # SmartNIC 远程 NIC/lspci 信息收集
│   ├── set_environment.sh             # 动态生成的环境变量文件(传递给 cycle_reboot.sh)
│   │
│   └── Bytedance_Stress/              # ByteDance 部件压力测试
│       ├── component_stress.sh        # 部件级压力测试(CPU/内存/存储/网络/BMC/GPU)
│       └── stress_analy.py            # Python 压力测试结果分析器
│
├── reports/                           # 输出目录(所有测试结果)
│   ├── .initial                       # 初始化标记文件
│   ├── device_log/                    # PCI 设备基线及每轮日志
│   ├── disk_log/                      # 磁盘 SN/SMART/分区/速率日志
│   ├── fail_log/                      # 失败汇总日志(summary_fail.log, pcie_fail.log)
│   ├── sdr_log/                       # SDR 传感器基线与每轮日志
│   ├── system_log/                    # FRU/CPU/内存/SMBIOS/MAC 日志
│   ├── sel_log/                       # SEL 日志收集
│   ├── dmesg_log/                     # Dmesg 日志收集
│   ├── nic_log/                       # NIC 驱动/速率/厂商日志
│   ├── fio_log/                       # FIO 每轮输出
│   ├── expander/                      # Expander phy error 计数器(Lava CSV)
│   ├── message_log/                   # 系统 message 收集 tarball
│   ├── tc_bios/                       # Tencent BIOS ping/cyclelog 结果
│   └── Bytedance_Stress_log/          # ByteDance 压力测试结果
│
├── tools/                             # 外部工具集
│   ├── messageCollect/                # 综合系统日志收集(CPU/Mem/PCI/NIC/RAID/HBA/BIOS/BMC)
│   │   ├── messageCollect.sh
│   │   └── tool/                      # 工具子目录
│   │       ├── hddtool/               # HDD 厂商工具 (hugo/SeaDragon/Toshiba)
│   │       ├── ipmitool/              # ipmitool RPM 包
│   │       ├── lsitool/               # LSI 工具 (g3Xutil/lsiutil/sas3ircu/storcli)
│   │       ├── nvmetool/              # NVMe 工具 (issdcm/nvme-cli)
│   │       ├── scelnx/                # AMI SCELNX BIOS 配置工具
│   │       └── sg_util/               # sg3_utils SES 页面收集
│   ├── cyclelog                       # Tencent BIOS cyclelog 二进制工具
│   ├── logstress                      # TC logstress 二进制工具
│   ├── ipmitool.dat                   # Ali OEM ipmitool 变体
│   ├── lsiutil.x86_64                 # LSI HBA/Expander 诊断工具
│   ├── sshpass-1.06.tar.gz            # sshpass 源码(远程 SSH 操作)
│   ├── iohup-bootmcn.sh               # MOC CN 状态检查
│   ├── iohup-bootmcn-helper-type1.sh  # MOC CN 重启辅助 (type1)
│   └── iohup-bootmcn-helper-type4.sh  # MOC CN 重启辅助 (type4)
│
└── tmp/                               # 临时文件目录
    ├── count.log                      # 当前循环次数
    └── uuid                           # 测试 UUID 标识

3. SIT 电源循环测试工作流程

两脚本架构

工具采用两脚本协同架构,通过 rc-local 系统服务实现开机自动循环:

┌─────────────────────────────────────────────────────────────────────┐
│                    SIT 电源循环测试完整流程                             │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  [阶段 1: 初始化 — PowerCycleTest.sh]                         │    │
│  │                                                               │    │
│  │  1. 参数解析 → 2. 环境校验 → 3. 路径创建 → 4. IPMI 初始化       │    │
│  │  5. SEL/var/crash 清除 → 6. rc-local 服务配置                  │    │
│  │  7. 自动登录配置 → 8. 交互式输入(延迟时间/错误处理策略)        │    │
│  │  9. 首轮基线检查(FRU/PCIe/SDR/磁盘/NIC/RAID/HBA)             │    │
│  │  10. 生成运行时脚本 → 11. 注册引导加载器 → 12. 执行首次电源动作  │    │
│  └──────────────────────────┬──────────────────────────────────┘    │
│                             │                                       │
│                             ▼                                       │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  [阶段 2: 循环执行 — cycle_reboot.sh]  ← 每轮开机自动运行       │    │
│  │                                                               │    │
│  │  开机 → rc.local 触发 cycle_reboot.sh                         │    │
│  │    │                                                          │    │
│  │    ├─ 1. 循环计数 +1                                          │    │
│  │    ├─ 2. SDR 传感器状态检查(与首轮基线比对)                    │    │
│  │    ├─ 3. ByteDance/Tencent/Ali 客户专项检查                    │    │
│  │    ├─ 4. SEL 日志黑白名单过滤                                  │    │
│  │    ├─ 5. FRU/CPU/内存/SMBIOS 系统检查(与首轮基线比对)          │    │
│  │    ├─ 6. PCIe 设备检查(设备丢失/速率/带宽/寄存器)              │    │
│  │    ├─ 7. HBA/Expander/RAID 存储检查                            │    │
│  │    ├─ 8. 磁盘 SN/SMART/分区/速率检查(与首轮基线比对)           │    │
│  │    ├─ 9. NIC 驱动/厂商/速率检查                                 │    │
│  │    ├─ 10. SmartNIC 远程检查                                    │    │
│  │    ├─ 11. dmesg 日志黑白名单过滤                                │    │
│  │    ├─ 12. FIO 启动(如启用)→ MOC 检查                          │    │
│  │    ├─ 13. 记录本轮耗时                                          │    │
│  │    └─ 14. 执行电源动作 → 系统重启/断电                          │    │
│  │         │                                                      │    │
│  │         └─ [未达目标圈数] → 返回步骤 1                          │    │
│  │         └─ [已达目标圈数] → 退出循环,执行停止脚本               │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  [阶段 3: 停止]                                                │    │
│  │                                                               │    │
│  │  stop_*.sh → 清除 rc.local 条目 → 终止测试进程 (fio/iostat)    │    │
│  │            → 恢复 rc-local 服务状态 → 测试结束                  │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

阶段 1: 初始化 — PowerCycleTest.sh

PowerCycleTest.sh 在测试启动时运行一次,按以下顺序执行:

  1. 加载所有库模块(26 个 lib/.sh 脚本),使用 chmod +x lib/ 确保可执行权限
  2. 解析和校验命令行参数arguments_parsecheck_args_env
  3. 创建日志目录结构file_path):在 reports/ 下创建所有子目录
  4. 准备循环环境pre_cycles_env):初始化循环计数器、生成 UUID
  5. Tencent BIOS pingtc_bios_ping):如指定 --tc_ping
  6. 清除测试环境:启动 IPMI 服务(init_ipmi)、清除 SEL(clearenv
  7. 配置 rc-local 服务configBootload):确保 rc-local 服务正常运行
  8. 配置自动登录auto_login):如指定 --auto-login,配置 root 自动登录
  9. 交互式输入manual_keyin):提示 TE 输入操作延迟时间(0-10 分钟)和错误处理策略
  10. 首轮基线检查(详见 4.3
  11. 生成运行时脚本(详见 4.4
  12. 注册引导加载器(详见 4.5
  13. 执行首次电源动作doing_reboot

阶段 2: 循环执行 — cycle_reboot.sh

cycle_reboot.sh 通过 rc.local 在每次开机后自动运行,按以下顺序执行:

  1. 加载所有库模块 + set_environment.sh(获取首轮传递的全局变量)
  2. 循环计数 +1cycle_num_count):读写 tmp/count.log
  3. SDR 传感器检查sdr_check_stat):与首轮基线比对,检测异常传感器
  4. 客户专项检查(按客户标志条件执行)
  5. SEL 日志黑白名单过滤BD_log_check_all sel
  6. 系统硬件检查sys_test):FRU/CPU/内存/SMBIOS 与首轮基线比对
  7. PCIe 设备检查pci_device_check
  8. 存储检查:HBA/Expander/RAID/磁盘
  9. 网络检查FuncCheckNic)+ SmartNIC(smart_NIC
  10. dmesg 日志黑白名单过滤BD_log_check_all dmesg
  11. FIO 检查check_fio):如 --fio 启用,启动后台 FIO 再执行电源动作
  12. MOC 检查chk_moc_args
  13. 记录循环耗时sum_reboot_time
  14. 执行电源动作doing_reboot

阶段 3: 停止机制

测试可通过以下方式停止:

停止脚本自动完成: - 从 rc.local 中移除 cycle_reboot.sh 条目 - 终止运行中的 fio/iostat 等测试进程 - 恢复 rc-local 服务状态 - 恢复自动登录配置


4. 主入口 — PowerCycleTest.sh

文件位置:PowerCycleTest.sh

这是整个工具的入口脚本,将 26 个库模块加载到当前 Shell 环境中,按顺序执行初始化、首轮基线检查、脚本生成和引导加载器注册。

4.1 参数解析

CLI 参数由 lib/arguments.sh 中的 arguments_parse() 函数处理。完整的参数列表参见 第 10 节 — 使用示例

关键约束check_args_env 执行):

4.2 环境准备

步骤 函数 说明
IPMI 初始化 init_ipmi 启动 ipmi 服务
环境清除 clearenv 清除 SEL、清除 /var/crash
rc-local 配置 configBootload 配置 rc-local 服务为开机自启动
自动登录 auto_login 配置 root tty 自动登录(--auto-login
交互输入 manual_keyin 提示 TE 输入:操作前延迟(1-10 分钟)、错误后是否继续
Tencent BIOS ping tc_bios_ping TC BIOS 内网连通性测试(--tc_ping

4.3 第一轮基线检查

首轮(cycle 0)执行所有硬件检查并保存基线数据,后续每轮与基线比对:

检查项 函数 基线内容
AVMS 分区 avme_test Ali AVMS 磁盘分区创建
黑盒检查 blackbox_check Ali blackbox 状态检查
SDR 传感器 sdr_check_stat + sdr_loop_monitor SDR 传感器基线(后台 5 秒循环监控)
系统硬件 sys_test FRU 信息/CPU 型号数量/内存容量 SN/SMBIOS
PCIe 设备 pci_device_check lspci 设备列表/LnkCap/LnkSta 速率带宽
RAID RAID_check + RAID_disk_check RAID 卡信息/磁盘 smart 日志
磁盘 disk_check HDD/NVMe/Aliflash SSD SN/SMART/分区
HBA HBA_check + exp_check_process HBA 卡信息/Expander phy 错误计数器
用户态 MD5 userspace_md5chk "old" Aliflash 用户态数据 MD5 基线
网络 FuncCheckNic NIC 驱动版本/MAC/厂商/链路速度
SmartNIC smart_NIC SmartNIC 远程健康检查

4.4 运行脚本生成

初始化阶段自动生成三个运行时脚本:

脚本 生成函数 用途
stop_.sh gene_stop_script 停止脚本:清除 rc.local 条目、终止 fio/iostat、恢复自动登录
lib/fail_check.sh gene_fail_chk 故障检测脚本:检查 summary_fail.log 是否存在
lib/set_environment.sh gene_set_environment 环境变量传递文件:将首轮所有全局变量写入,供 cycle_reboot.sh 加载

4.5 引导加载器注册

init_bootloader 函数将 cycle_reboot.sh 注册到系统引导序列中:


5. 循环脚本 — cycle_reboot.sh

文件位置:cycle_reboot.sh

5.1 开机自动启动

cycle_reboot.sh 不直接由用户执行,而是通过以下机制在系统开机后自动触发:

  1. rc-local 服务:Linux 系统的 rc-local 服务在启动完成时执行 /etc/rc.d/rc.local
  2. 注册条目init_bootloaderbash /cycle_reboot.sh 写入 rc.local
  3. 无限循环:每次电源动作后系统重启 → rc.local 触发 → 检查通过 → 再次电源动作 → ...

5.2 循环计数器管理

循环计数器通过 tmp/count.log 文件管理:

function cycle_num_count()
{
    if [ -f "$tmp_log_path/count.log" ]; then
        cycle_num=$(cat $tmp_log_path/count.log)
        cycle_num=$(($cycle_num + 1))
    else
        cycle_num=0
    fi
    echo $cycle_num > $tmp_log_path/count.log
}

5.3 硬件检查序列

cycle_reboot.sh 在第 2 轮及以后执行的检查与首轮基线进行比对:

开机
  │
  ├─ SDR 传感器状态(与 cycle 0 基线比对,检测非 ok/ns 传感器)
  ├─ ByteDance HDD 识别时间检测(--bytedance-HDD)
  ├─ ByteDance 部件压测(--bytedance):component_stress.sh
  ├─ Tencent BIOS ping(--tc_ping)+ pclog 收集
  ├─ Ali blackbox 检查 + OEM SEL 检查
  ├─ SEL 日志黑白名单过滤(bw_list.json)
  ├─ SDR 后台循环监控启动
  │
  ├─ 系统检查(sys_test):
  │   ├─ FRU 信息比对
  │   ├─ CPU 型号/数量比对
  │   ├─ 内存容量/序列号比对
  │   ├─ SMBIOS 信息比对
  │   └─ MAC 地址比对
  │
  ├─ PCIe 设备检查(pci_device_check):
  │   ├─ lspci 设备列表比对(检测丢失设备)
  │   ├─ LnkCap/LnkSta 速率/带宽比对
  │   └─ UESta/CESta 异常寄存器解析(lspci_parser.py)
  │
  ├─ HBA 检查 + Expander phy 错误计数器
  ├─ RAID 卡信息 + RAID 磁盘 smart 日志比对
  ├─ 磁盘检查(disk_check):
  │   ├─ 分区信息比对
  │   ├─ SN 序列号比对
  │   ├─ SMART 日志比对
  │   └─ 磁盘速率检查
  │
  ├─ NIC 检查(FuncCheckNic):驱动版本/MAC/厂商/链路速度比对
  ├─ SmartNIC 远程检查(--smartnic)
  ├─ dmesg 日志黑白名单过滤
  ├─ FIO 检查(--fio):启动后台 FIO 后执行电源动作
  └─ MOC 检查(--moc-rpm):CN 实例状态检查

5.4 电源动作执行

doing_reboot() 函数在 lib/reboot_action.sh 中定义,根据 START_BASE 变量选择电源动作:

[cycle_num >= CYCLES]
  → 执行停止脚本,测试结束

[cycle_num < CYCLES]:
  ├─ Reboot 模式 → reboot -f(AVMS 模式) / reboot(普通模式)
  ├─ Reset 模式 → ipmitool raw 0 2 3
  ├─ DC Cycle 模式 → ipmitool raw 0 2 2(或远程 remote_dccycle)
  ├─ AC Cycle 模式 → ipmitool power off(ByteDance)/ 空动作(由 PDU 控制上电)
  ├─ Power Off 模式 → poweroff(Tencent 安全下电)
  ├─ Dual 模式(前半)→ Reboot/Reset 动作
  └─ Dual 模式(后半)→ DC Cycle 动作

延迟机制:每次电源动作前,通过 on_reboot_delay 等待 Reboot_Delay 秒,确保: - FIO 有足够时间运行 - 系统日志稳定 - ByteDance NIC Link Up 检测时间窗口


6. 库模块 — lib/

6.1 核心模块

arguments.sh — 参数解析与验证

文件位置:lib/arguments.sh

三个核心函数:

函数 功能
arguments_parse 解析 ~40 个 CLI 参数,设置对应全局变量
check_argument 验证参数组合合法性(互斥/共存规则)
check_execute_mode 检测电源模式组合,设置 SAVEDMODESTART_BASE
check_env 检查外部工具可用性(fio/smartctl/nvme/MegaCLI/ipmitool.dat 等)

电源模式检测逻辑

条件 SAVEDMODE START_BASE
--reboot 单独 OSReboot osreboot
--reset 单独 OSReset osreset
--dccycle 单独 DCCycle dccycle
--accycle 单独 ACCycle accycle
--reboot --dccycle OSReboot_DCCycle osreboot_dccycle
--reset --dccycle OSReset_DCCycle osreset_dccycle
--tc-poweroff Poweroff poweroff

common_function.sh — 通用工具函数

文件位置:lib/common_function.sh

函数 功能
Usage 打印完整帮助信息
split_line 在日志中写入分隔线
idle 带倒计时的空闲等待
cycle_num_count 循环计数器管理
auto_login 配置 root 自动登录(tty1-tty6)
loginRestore 恢复自动登录配置
uuid_gen 生成测试 UUID 标识

global_env_set.sh — 全局默认变量

文件位置:lib/global_env_set.sh

定义所有测试相关的全局默认变量,包括:

helpers.sh — Shell 显示辅助

文件位置:lib/helpers.sh

提供 ANSI 颜色代码常量(C_REDC_CYANC_PINK 等)和终端显示辅助函数。

colors.py — Python ANSI 颜色类

文件位置:lib/colors.py

helpers.sh 对应的 Python 版 ANSI 颜色类,用于 Python 脚本的彩色终端输出。

progressbar.py — Python 进度条

文件位置:lib/progressbar.py

可配置的终端进度条组件,支持线程模式,用于长时间运行任务的进度显示。

6.2 电源控制模块

reboot_action.sh — ★ 电源动作执行

文件位置:lib/reboot_action.sh

核心电源动作执行模块:

函数 功能
sum_reboot_time 计算每轮开机耗时,与 Time_Limit 比较,超时则告警
clr_ssh_session 执行 DC Cycle 前清除所有 SSH 会话
on_reboot_delay 电源动作前延迟等待(FIO 运行/日志稳定/NIC Link Up)
on_dccycle DC Cycle 动作(本地 ipmitool 或远程 client)
on_reset 硬件 Reset 动作
on_dual_mode 双模式:前 N 圈第一种动作 + 后 N 圈 DC Cycle
doing_reboot ★ 主分发函数:根据 START_BASE 分发到对应动作
check_before_power 电源动作前最后检查(远程结果拉取/MD5 校验)
reboot_action ★ 底层动作执行:判断圈数 → 执行停止或执行电源命令

AC Cycle 特殊说明

AC Cycle 模式下,脚本通过 ipmitool power off 关闭 SUT,但重新上电由外部 PDU 治具完成。需要同时在 AC Client 上运行 SIT-Cycle-ACTest 脚本:

# SUT 上运行:
$ bash PowerCycleTest.sh -d "/dev/sdb /dev/sdc" -c 100 --fio --accycle

# AC Client 上运行:
$ cd SIT-Cycle-ACTest/
$ bash run.sh

remote_control.sh — 远程控制

文件位置:lib/remote_control.sh

提供通过远程 SSH Client 对 SUT 进行 DC Cycle 的能力(Ali AVMS BMC 带外掉电测试场景):

bootloader.sh — 引导加载器

文件位置:lib/bootloader.sh

函数 功能
configBootload 检测并启动 rc-local 服务(RHEL 6/7/8 + Debian 9/10)
init_bootloader 将 cycle_reboot.sh 注册到 rc.local(或 .bashrc)
clear_bootloader 从 rc.local 中清除 cycle_reboot.sh 条目

gene_stop_script.sh — 脚本生成器

文件位置:lib/gene_stop_script.sh

函数 功能
gene_stop_script 生成停止脚本(stop_osreboot.sh / stop_accycle.sh
gene_fail_chk 生成故障检测脚本(lib/fail_check.sh
gene_set_environment 生成环境变量文件(lib/set_environment.sh):将所有全局变量写入文件,供 cycle_reboot.sh 加载

6.3 系统检查模块

system_check.sh — 系统硬件检查

文件位置:lib/system_check.sh

sys_test() 函数执行以下检查:

检查项 命令 比对方式
FRU 信息 ipmitool fru print 0 与 cycle 0 的 fru_info_full.log 比对
CPU 信息 lscpu /proc/cpuinfo 型号、核心数、频率比对
内存信息 dmidecode -t memory 容量、序列号、型号比对
SMBIOS 信息 dmidecode -t 0,1,2,3 UUID、厂商、版本比对
MAC 地址 ip link 与 cycle 0 的 sut_conf.log 比对

sdr_sensor.sh — SDR 传感器监控

文件位置:lib/sdr_sensor.sh

函数 功能
sdr_check_stat 读取 ipmitool sdr elist,过滤状态非 ok/ns 的传感器
sdr_loop_monitor 后台进程,每 5 秒轮询 SDR 传感器状态和功耗,检测异常值

注意:Tencent 机器需加 --tc-delay(分钟),否则可能无法抓取 SDR 温度数据。

lspci_device.sh — PCIe 设备检查

文件位置:lib/lspci_device.sh

pci_device_check() 函数执行以下检查:

  1. 设备列表比对:与 cycle 0 的 lspci 输出比对,检测丢失设备
  2. LnkCap/LnkSta 速率带宽比对:比较所有 PCIe 设备的协商速率和带宽
  3. 异常寄存器解析:调用 lspci_parser.py 解析 UESta/CESta 寄存器

lspci_parser.py — PCIe 寄存器解析器

文件位置:lib/lspci_parser.py

Python 脚本,解析 lspci -vvv 输出中每个 PCIe 设备的 UESta/UEMsk 和 CESta/CEMsk 寄存器,三步算法:

Step 1: 比对 UESta↔UEMsk 和 CESta↔CEMsk 寄存器位
        若 Status=+ 且 Mask=- → 进入 Step 2

Step 2: 判断错误类型
        若是 AdvNonFatalErr 或 NonFatalErr → 进入 Step 3
        否则 → 直接报异常

Step 3: UnSupReq 检查
        若 UESta 中 UnSupReq=- → 加报 UnSupReq 异常
        否则 → 忽略(预期行为)

netcard.sh — 网络设备检查

文件位置:lib/netcard.sh

FuncCheckNic() 检查所有网卡的驱动版本、MAC 地址、厂商、链路速度,与 cycle 0 基线比对。

6.4 存储检查模块

disk.sh — 磁盘检查

文件位置:lib/disk.sh

disk_check() 函数:

检查项 比对方式
分区信息 与 cycle 0 的 partitions_full.log 比对
SN 序列号 HDD/NVMe/Aliflash SSD 序列号与基线比对
SMART 日志 smartctl -a 输出与基线比对
磁盘速率 hdparm -taocnvme 速率检查

fio.sh — FIO I/O 压力测试

文件位置:lib/fio.sh

check_fio() 函数:在每轮电源动作前启动后台 FIO I/O 压力测试。

默认 FIO 参数

  --end_fsync=0 --group_reporting --direct=1 --ioengine=libaio --time_based
  --invalidate=1 --norandommap --randrepeat=0 --exitall --size=100%
  --readwrite=randrw --rwmixread=70 --bs=4k --numjobs=1 --runtime=1200s

TC-FIO 模式--tc-fio)额外使用 4k/128k 混合模式 + NVMe 命令压力测试。

raid.sh — RAID 卡检查

文件位置:lib/raid.sh

hba.sh — HBA 卡检查

文件位置:lib/hba.sh

HBA_check() 收集 HBA 卡信息,检查 Expander 连接的磁盘。

expander.sh — Expander 检查

文件位置:lib/expander.sh

exp_check_process() 收集 Expander phy error 计数器(ByteDance Lava 项目),生成 CSV 格式汇总报告(reports/expander/*.csv)。

6.5 日志过滤模块

log_check.sh — SEL/dmesg 日志过滤

文件位置:lib/log_check.sh

BD_log_check_all 函数:调用 black_white_list.py 对 SEL 或 dmesg 日志执行黑白名单过滤。

black_white_list.py — 黑白名单过滤引擎

文件位置:lib/black_white_list.py

Python 脚本,读取 bw_list.json 中的黑白名单规则,对日志文件逐行匹配:

对每行日志:
  ├─ 遍历 black_ls 黑名单
  │   └─ 如果命中黑名单关键字
  │       ├─ 检查 white_ls 白名单
  │       │   ├─ 被白名单豁免 → 忽略(已知误报)
  │       │   └─ 未被白名单豁免 → 标记为失败
  │       └─ 无白名单规则 → 标记为失败
  └─ 未命中任何黑名单 → 通过

支持 common(通用)和 bytedance(ByteDance 专项)两套过滤规则。

bw_list.json — 黑白名单关键字库

文件位置:lib/bw_list.json

SEL 黑名单(~60+ 关键字):droperrorfailECCIERRCATERRThermal Tripdegradedunknown

SEL 白名单(~6 条正则):unknown|0xcbreset|clearedlost| AC 等已知误报

Dmesg 黑名单(~50+ 关键字):machine check exceptionsoft lockuppcie errorCall Trace:FPDMA

Dmesg 白名单(~55+ 条目):usb 1-1.2: clear tt 1BGRT failed to map imageFast TSC calibration fail 等已知内核误报

fail_check.sh — 故障检测脚本

文件位置:lib/fail_check.sh(自动生成)

gene_fail_chk 生成,每轮循环后检查 reports/fail_log/summary_fail.log 是否存在来判断是否有故障。

6.6 客户专项模块

bios.sh — BIOS 设置修改

文件位置:lib/bios.sh

--bios 模式下,在 DC Cycle 中通过 ipmitool 切换 BIOS NUMA 和 HT 设置(Ali 项目)。

avms_test.sh — Ali AVMS 测试

文件位置:lib/avms_test.sh

Moc.sh — Ali MOC 卡检查

文件位置:lib/Moc.sh

chk_moc_args:检查 MOC CN 实例启动状态。

MocLogCollect.sh — MOC 日志收集

文件位置:lib/MocLogCollect.sh

独立子脚本,用于 MOC 1.5 (25G) 卡测试的日志收集:

日志保存路径:/root/MOC_Reports

bytedance_log_check.sh — ByteDance 专项日志检查

文件位置:lib/bytedance_log_check.sh

函数 功能
BD_disk_time_detect 检查所有硬盘被系统识别的时间是否 < 10 分钟
BD_link_up_time 检查 NIC 链路 Link Up 时间(Reboot ≤ 30s,其他 ≤ 60s)

smart_nic.sh — SmartNIC 远程检查

文件位置:lib/smart_nic.sh

通过 SSH 连接到 SmartNIC,执行远程健康检查和日志收集。

Bytedance_Stress/ — ByteDance 部件压力测试

文件位置:lib/Bytedance_Stress/

可独立运行进行调试(不依赖 PowerCycle 循环):

$ cd SIT-Power-CycleTest/lib/Bytedance_Stress
$ bash component_stress.sh --bytedance True --cycles 1

7. 配置文件

7.1 BD_args.json — ByteDance 压测配置

文件位置:BD_args.json

控制 ByteDance 部件压力测试的参数:

参数 默认值 说明
run_mode "gpu_stress" 压测部件:cpu_stress / memory_stress / storage_stress / iperf_stress / BMC_stress / gpu_stress
kill_mode "True" 启动前是否终止已有压测进程
fru_no_check "True" 是否忽略 ipmitool fru 失败
server_ip "172.17.0.100" iperf 服务端 IP
client_ip "10.99.104.251" iperf 客户端 IP
pw "111111" SSH 密码
cpu_spc "60" CPU 压测使用率阈值 (%)
mem_per "90" stressapptest 内存使用百分比
run_time "900" 压测持续时间 (秒)
interval_check "60" 压测结果检查间隔 (秒)
DC_AC_link_p "20" IP 连接检查最大等待时间
assumeyes "False" 是否自动清除旧日志
pipeline_mode "False" 流水线模式标志
error_continue "True" 出错后是否继续

7.2 bw_list.json — 黑白名单关键字库

文件位置:lib/bw_list.json

JSON 格式,包含 common(通用)和 bytedance(ByteDance 专项)两套过滤规则,每套包含:

内容
SEL_b SEL 黑名单关键字(~60+ 条)
SEL_w SEL 白名单正则(~6 条)
DMESG_b Dmesg 黑名单关键字(~50+ 条)
DMESG_w Dmesg 白名单模式(~55+ 条)

[Tag]: SEL 过滤输出标记;[Dmesg]: Dmesg 过滤输出标记

7.3 global_env_set.sh — 全局默认变量

文件位置:lib/global_env_set.sh

定义所有测试相关的默认变量。关键默认值:


8. 工具集 — tools/

messageCollect/ — 综合系统日志收集

文件位置:tools/messageCollect/

messageCollect.sh 是独立的综合日志收集脚本,覆盖 CPU、内存、PCI、NIC、RAID、HBA、Expander、SES、磁盘、系统日志、BIOS、BMC、驱动版本等全面信息。收集结果打包为 tarball。

子工具目录 tools/messageCollect/tool/ 包含: - hddtool/:HDD 厂商诊断工具(hugo/SeaDragon/Toshiba tsbdrv) - ipmitool/:ipmitool RPM 包及使用说明 - lsitool/:LSI 工具集(g3Xutil、lsiutil、sas3ircu、storcli) - nvmetool/:NVMe 工具(issdcm RPM、nvme-cli 源码) - scelnx/:AMI SCELNX BIOS 配置工具(Baidu/Tencent 项目) - sg_util/:sg3_utils SES 页面收集

其他工具

工具 用途
cyclelog Tencent BIOS cyclelog 收集二进制工具
logstress Tencent logstress 压测工具
ipmitool.dat Ali OEM ipmitool 变体(支持扩展 OEM 命令)
lsiutil.x86_64 LSI HBA/Expander 诊断工具
sshpass-1.06.tar.gz sshpass 源码(用于远程 SSH 操作的非交互密码输入)
iohup-bootmcn.sh MOC CN 状态检查脚本
iohup-bootmcn-helper-type1.sh MOC CN type1 重启辅助脚本
iohup-bootmcn-helper-type4.sh MOC CN type4 重启辅助脚本

9. CI/CD 流水线 — .gitlab-ci.yml

文件位置:.gitlab-ci.yml

ipt-gitlab.ies.inventec:8081 上部署,包含五个阶段:

lintcheck → runtest → validation → release → cleanup
阶段 Job 说明
1. lintcheck shellcheck Shell 脚本静态代码检查
2. runtest runTest 通过 Ansible 部署到 SUT 并执行 PowerCycleTest.sh
3. validation Validation 流水线验证步骤(master/branches)
4. release Release Tag 创建时发送邮件通知
5. cleanup cleanEnv 测试环境清理

10. 使用示例

查看帮助

$ cd SIT-Power-CycleTest-v1.24.0/
$ bash PowerCycleTest.sh --help

基本用法

OS Reboot + 系统检查

$ bash PowerCycleTest.sh -c 500 --reboot --system

运行 500 轮 OS 软重启,每轮执行系统硬件检查(无 I/O 压力)。

DC Cycle + 系统检查

$ bash PowerCycleTest.sh -c 100 --dccycle --system

运行 100 轮 DC 电源循环,每轮执行系统硬件检查。

FIO I/O 压力模式

OS Reboot + FIO

$ bash PowerCycleTest.sh -d "/dev/sdb /dev/sdc" -c 100 --fio --reboot

/dev/sdb/dev/sdc 运行 FIO I/O 压力,100 轮 OS 软重启。

自定义 FIO 参数

$ bash PowerCycleTest.sh -d "/dev/sda4" -c 100 --fio --reboot -fio-args "--bs=128k --numjobs=128"

覆盖默认 FIO 参数,使用 128k 块大小和 128 并发。

AC Cycle 模式

AC Cycle 模式需要配合外部 PDU 治具。

SUT 上启动

$ bash PowerCycleTest.sh -d "/dev/sdb /dev/sdc" -c 100 --fio --accycle

AC Client 上启动 PDU 控制

$ cd SIT-Cycle-ACTest/
$ bash run.sh

脚本在 rc-local 中注册 cycle_reboot.sh,SUT 通过 PDU 断电后,PDU 重新上电,开机后脚本自动继续执行。

Donghu SIT 标准流程(AC Cycle)

按照 Donghu SIT Test SOP 的标准操作步骤:

步骤 1 — 测试前清除日志

$ python LogFilterTool.py --before

步骤 2 — 进入文件夹配置参数

修改 BD_args.json 中的压测参数(如适用)。

步骤 3 — 启动测试

$ bash PowerCycleTest.sh -c 20 --accycle --system --bytedance

交互式提示: - 输入 3:操作前延迟 3 分钟 - 输入 0:遇到错误后终止(1 为忽略错误继续)

步骤 4 — 监控运行

$ top

观察 PowerCycleTest.sh / cycle_reboot.sh 进程是否正常运行。

步骤 5 — 中途停止

$ bash stop_accycle.sh

Dual Mode(组合模式)

Reboot + DC Cycle 混合

$ bash PowerCycleTest.sh -c 500 --system --reboot --dccycle

前 500 圈执行 OS Reboot,后 500 圈执行 DC Cycle,共 1000 圈。

远程 DC Cycle 模式(Ali AVMS BMC 带外掉电测试)

$ bash PowerCycleTest.sh -d "/dev/nvme0n1 /dev/nvme1n1" -c 1000 \
    --fio --avms --dccycle --remote \
    --ssh-host 172.17.0.100 --ssh-user root --ssh-pass 111111 \
    --bmc-host 172.17.0.200 --bmc-user admin --bmc-pass admin --bmc-intf lanplus

通过 SSH 远程 Client 对 SUT 执行 DC Cycle,每圈随机掉电 1-60 秒。需确保 SUT/BMC/Client 在同一局域网。

客户专项测试

Ali AVMS

$ bash PowerCycleTest.sh -d "/dev/nvme0n1 /dev/nvme1n1" -c 1000 --fio --avms --reboot

Ali Aliflash SSD

$ bash PowerCycleTest.sh -d "/dev/osa /dev/osb" -c 1000 --fio --avms --reboot --aliflash

Ali Aliflash 用户态

$ bash PowerCycleTest.sh -d "ocssd0n1 ocssd1n1" -c 1000 --fio --reboot --aliflash --userspace

Ali MOC 重启 CN 实例

$ bash PowerCycleTest.sh -c 10 --system --reboot --moc-rpm type1

type 选项:type1 / type4 / mcn

Tencent BIOS 引入测试

$ bash PowerCycleTest.sh --system --reboot --tc_ping 10.0.0.1 -c 3

Tencent TC-FIO

$ bash PowerCycleTest.sh -d "/dev/nvme0n1 /dev/nvme1n1" -c 1000 --tc-fio --reboot

Tencent 机器建议加 --tc-delay(分钟)以确保 SDR 温度数据正常。

ByteDance 专项

$ bash PowerCycleTest.sh -c 10 --system --reboot --bytedance

自动执行部件级压力测试(CPU/内存/存储/网络/BMC/GPU)+ ByteDance 黑白名单日志筛查。

ByteDance NIC Link Up 检查

$ bash PowerCycleTest.sh -c 2 --system --reboot --bytedance-NIC

每圈检查 NIC Link Up 时间(Reboot ≤ 30s,其他 ≤ 60s)。

ByteDance HDD 识别时间检查

$ bash PowerCycleTest.sh -c 2 --system --reboot --bytedance-HDD

检查所有硬盘被系统识别的时间是否 < 10 分钟。

ByteDance Lava Expander 检查

$ bash PowerCycleTest.sh -c 2 --system --reboot --bytedance-HDD --bytedance-lava

每圈检查 SAS Address/Link、Phy error counters,与首轮比对。CSV 报告生成于 reports/expander/

RAID 测试

$ bash PowerCycleTest.sh -d "/dev/sdb" -c 100 --fio --reboot --raid 2208
$ bash PowerCycleTest.sh -d "/dev/sdb" -c 100 --fio --reboot --raid disk_check

HBA / Expander 检查

$ bash PowerCycleTest.sh -c 100 --fio --reboot --HBA      # HBA 卡检查
$ bash PowerCycleTest.sh -c 100 --fio --reboot --chk-phy   # Expander phy 错误检查

SmartNIC 测试

$ bash PowerCycleTest.sh -c 100 --system --reboot --smartnic -nicip 192.168.1.100

BIOS NUMA/HT 切换(Ali)

$ bash PowerCycleTest.sh -c 100 --system --dccycle --bios

在 DC Cycle 中通过 ipmitool 自动切换 BIOS NUMA 和 HT 设置。

停止测试

$ bash stop_osreboot.sh    # OS Reboot 模式
$ bash stop_accycle.sh     # AC Cycle 模式

单独运行 ByteDance 部件压测(不跑 Cycle)

$ cd SIT-Power-CycleTest-v1.24.0/lib/Bytedance_Stress
$ bash component_stress.sh --bytedance True --cycles 1

单独维护黑白名单

编辑 lib/bw_list.json,在 commonbytedance 域下维护 SEL_bSEL_wDMESG_bDMESG_w 清单。


CLI 参数完整参考表

参数 类型 说明
-h, --help flag 打印帮助信息
-V, --version flag 显示版本号
-c, --cycles N value 电源循环圈数(必填)
-d, --disklist "DEV..." value FIO 测试的目标磁盘设备列表
--fio flag 启用 FIO I/O 压力测试模式
--system flag 启用系统检查模式(无 I/O 压力)
--reboot flag OS 软重启模式
--reset flag 硬件 Reset 模式
--dccycle flag DC 电源循环模式
--accycle flag AC 电源循环模式(需配合 PDU)
--delay N value 电源动作前等待时间(1-10 分钟)
--disk-delay N value 磁盘驱动就绪额外等待时间(分钟)
-y, --assumeyes flag 自动确认所有交互提示
--ignore-err flag 遇到检查失败时继续运行
--fio-args "..." value 覆盖默认 FIO 可变参数
--tc-fio flag Tencent FIO 模式(4k/128k + NVMe 命令压力)
--tc-delay N value Tencent SDR 传感器就绪延迟(0-10 分钟)
--tc-poweroff flag Tencent 安全下电测试
--tc_ping IP value Tencent BIOS 内网连通性测试 IP
--avms flag Ali AVMS 分区校验模式
--aliflash flag Ali Aliflash SSD 测试
--userspace flag Ali Aliflash 用户态模式
--moc-rpm value Ali MOC CN 实例重启测试(type1/type4/mcn)
--bios flag Ali BIOS NUMA/HT 切换(DC Cycle 中)
--bytedance flag ByteDance 部件压测 + 专项日志过滤
--bytedance-HDD flag ByteDance HDD 识别时间检查
--bytedance-NIC flag ByteDance NIC Link Up 时间检查
--bytedance-lava flag ByteDance Lava Expander phy 错误检查
--HBA flag HBA 卡信息检查
--chk-phy flag Expander phy 错误计数器检查
--smartnic flag SmartNIC 远程监控
-nicip IP value SmartNIC IP 地址
--remote flag 启用远程 Client SSH DC Cycle 模式
--ssh-host IP value 远程 Client SSH 主机 IP
--ssh-user USER value 远程 Client SSH 用户名
--ssh-pass PASS value 远程 Client SSH 密码
--ssh-port PORT value 远程 Client SSH 端口
--bmc-host IP value SUT BMC 主机 IP
--bmc-user USER value SUT BMC 用户名
--bmc-pass PASS value SUT BMC 密码
--bmc-intf TYPE value SUT BMC 接口类型(如 lanplus)
--auto-login flag 使用 .bashrc 模式(替代 rc.local)
--restore-login flag 恢复自动登录配置
--fault flag Ali OEM SEL 检查
--ipmi-stress flag IPMI 并发命令压力测试
-l, --jobline value 任务线标识

11. 参考文档摘要

Donghu SIT Test SOP.pptx

来源:Cui.Davis (2023/10/13),12 页 Donghu 服务器平台 SIT 标准操作流程。

关键流程

步骤 内容 与 PowerCycleTest 的关联
BIOS 配置 Shift+Ctrl+F2 进入专家级 BIOS 设置 硬件基础配置
硬件清单检查 lspci 枚举所有 PCIe 设备(4 GPU/12 NIC/12 Mellanox/9 NVMe) 对应 pci_device_check
G4XTOOLS 诊断 ./g4Xdiagnostics.x86_641otcquit 互补诊断工具
LogFilter 清除 python LogFilterTool.py --before 测试前环境清理
AC PowerCycle ./PowerCycleTest.sh -c 20 --accycle --system --bytedance 直接使用本工具
停止测试 ./stop_accycle.sh 直接使用本工具
监控运行 top 观察脚本进程状态

Donghu SIT AC Cycle 操作要点

  1. 测试前运行 LogFilterTool.py --before 清除历史日志
  2. 进入文件夹修改配置文件(运行时间/测试项/参数)
  3. 启动测试:提示依次输入 3(延迟 3 分钟)和 0(遇错终止)
  4. 每轮测试完成后自动关机 → 重新上电 → 自动开始下一轮
  5. 达到目标圈数后自动停止
  6. 中途停止:bash stop_accycle.sh

相关 BKM

BKM 名称 ID 说明
AC Cycle Test 2246 AC Cycle 通用测试
DC Cycle Test 2572 DC Cycle 通用测试
OS Reboot Test 2786 OS Reboot 通用测试
ByteDance AC Cycle 1004899 ByteDance AC Cycle 测试
ByteDance DC Cycle 1004895 ByteDance DC Cycle 测试
ByteDance Reboot 1004894 ByteDance Reboot 测试

完整 BKM 列表见 README.md


12. 版本历史

版本 日期 作者 变更
1.0 2026-05-29 Claude 初始版本,覆盖 SIT-Power-CycleTest v1.24.0 全部功能,含完整参数参考、使用示例和 Donghu SIT SOP 集成

开发团队:Liu.AllenJH (Developer), Tong.Anderson (PIC), Wang.Min (Test Leader), Ren.Sunny (Tester) 最后验证:Ren.Sunny on LAVA (2023-03-13), Result: PASS 脚本管理系统ARES Script Management BKM ID:参见 README.md 中的完整 BKM 列表