系统重启(System Reboot)——重启类型与重启率统计

系统重启这个指标,说白了就是看你的手机有没有莫名其妙地自己重启。它跟ANR、Crash不一样,重启一旦发生,用户的所有现场全丢,体验伤害极大。我早年在做某个项目时,曾经因为一个内核驱动的小bug,导致设备每天半夜自动重启一次,线上数据一查,重启率直接翻了三倍。

嗯,指标本身并不复杂,但你要把“什么算一次重启”、“重启是意外还是正常”定义清楚,才能真正指导稳定性改进。

重启类型:正常 vs 意外

不是所有重启都是坏事。我们需要先把它分成两大类:

类型定义典型场景
正常重启用户或系统主动发起的、预期内的重启用户长按电源选择重启、OTA升级后自动重启、adb reboot
意外重启非用户意愿、非系统正常流程的突然重启内核panic、watchdog超时、系统服务死锁导致重启、温度过高触发硬件保护重启

注意: OTA升级后的重启虽然用户可能没主动点,但属于系统设计的正常流程,应算作正常重启。我见过有人误把OTA重启也算成意外,导致重启率虚高,浪费了很多排查时间。

如何区分?我在项目中习惯通过以下几个来源做判断:

  1. 内核日志:dmesg 中搜索 Kernel panic、Watchdog bite、oops 等关键词。
  2. 重启原因节点:读 /sys/fs/pstore/console-ramoops 或 /proc/last_kmsg,里面有上次重启的发起者信息。
  3. 系统属性:sys.boot.reason 在 Android 8.0+ 上会记录重启原因,如 kernel_panic、reboot、watchdog、cold 等。

重启率统计方法

重启率的核心计算公式很简单:

重启率 = (意外重启次数) / (活跃设备数 × 统计天数) × 100%

但分母和分子的取法有不少门道。我建议按以下步骤做:

  • 确定统计周期:通常按「日」计算,然后聚合为周/月。例如每天凌晨统计过去24小时的数据。
  • 分母:活跃设备数:只计入当天有至少一次网络连通的设备。完全离线超过24小时的设备不参与计算,否则会稀释分母,重启率看着很低但实际上并没有修复。
  • 分子:意外重启次数:每个设备每天只计一次意外重启——如果设备在24小时内反复重启多次,只算一次。为什么?因为一次内核崩溃后系统反复重试,如果你计多次,一个坏设备就能拉高整个大盘。我这里曾经踩过坑,计了多次导致重启率飙升,后来才发现是同一个设备在不停重启。

最佳实践: 采用「设备维度+天维度」的计数方式:
若某设备当天至少发生一次意外重启,则该设备当天计为“1次重启事件”,
最终 重启率 = (重启设备天数) / (总活跃设备天数) × 100%

实例:从日志提取意外重启

假设我们在服务器端收集了设备上报的 boot_reason 字段,可以用一个简单的脚本做分类统计:

#!/bin/bash
# 从日志文件提取意外重启设备
awk -F',' '{
    reason = $3
    day = substr($1,1,10)
    device = $2
    if(reason == "kernel_panic" || reason == "watchdog" || reason == "hardware_reset") {
        print device, day
    }
}' boot_log.txt | sort -u | wc -l

注意这里用了 sort -u 去重,确保同一设备同一天只计一次。我曾经就吃过这个亏——我以为每天只上报一次,结果有些设备上报了两次,导致统计翻倍。

常见陷阱与避坑指南

避坑1: 不要漏掉「正常重启」中隐藏的意外。比如用户点重启,但结果是内核panic触发的——这时用户以为是正常操作,实际在系统日志里能看到真正的重启原因是 reboot,panic 而不是 reboot,user。要结合日志判断本质原因。

避坑2: 电池耗尽关机后再次开机,算不算重启?我个人认为不算——电池耗尽属于低电关机的后续行为,属于正常开机,不应该计入重启率。但有些厂商把这种也算成冷启动,导致指标波动很大。建议在统计前过滤掉 power_key 或 low_battery 作为原因的启动。

避坑3: 重启率的分母不要用「出货总量」或「激活总量」,要用「每日活跃设备数」。否则如果产品卖了一百万台,但每天只有十万台在线,你的重启率就会偏低,掩盖真实问题。

知识结构图

下面这张图总结了系统重启指标的整体分类和统计流程,方便你理解各个要素之间的关系。

系统重启指标分类与统计流程 系统重启事件 正常重启 用户触发 · OTA升级 · adb reboot 意外重启 内核panic · watchdog · 硬件复位 不计入重启率分母 按设备 & 天去重 计算重启率 意外重启天数 / 活跃设备天数 活跃设备数(分母) 去重规则:同一设备同一自然日只计一次意外重启,防止单设备多次重启拉高整体

指标汇总表

指标项建议值/标准说明
日重启率(意外)≤ 0.05%即每万台设备每天不超过5台意外重启
周重启率(意外)≤ 0.3%累积7天,允许波动
正常重启占比无需达标,仅用作排除辅助判断是否有异常重启混入正常类别

写到最后我想说一句:重启率这东西,看起来就一个数字,但把类型分清楚、去重逻辑写对、分母选准,才不至于被假数据迷惑。我见过不少团队因为统计口径没对齐,两个版本明明一样的问题,一个显示0.02%,一个显示0.2%,最后扯皮浪费一周。所以从一开始就把定义和计算方式固化下来,你后面会省很多心。