jc mpstat 解析器详解:将 mpstat 多核 CPU 利用率与中断统计输出转为结构化 JSON
开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载mpstat是 sysstat 工具包中用于输出每个 CPU 利用率与中断频率的常用命令其输出是典型的多段表格CPU 百分比段、intr/s 汇总段、以及每类中断的详细段直接交给jq或自动化脚本处理十分困难。本文基于 mpstat 解析器文档 与源码实现 jc/parsers/mpstat.py完整讲解 jc 的 mpstat 解析器CLI 与 Python 模块两种用法、输出 Schema 的完整字段说明、真实输出示例以及解析器识别表头、区分统计类型、做浮点转换的源码级实现细节读完后你可以把mpstat输出稳定地转成 JSON/YAML/字典并接入 jq 或 Python 自动化流程。两种调用方式解析器在源码中通过info类声明了元数据版本1.1、作者 Kelly Brazil、兼容性linux、标签command并注册了魔法命令mpstat见 jc/parsers/mpstat.py#L117-L125。这意味着除通用的--parser形式外jc 还支持把mpstat作为子命令直接调用# 管道方式 $ mpstat | jc --mpstat # 或魔法命令方式jc 自动执行 mpstat 命令 $ jc mpstat以 Python 模块方式调用时调用jc.parse并传入 mpstat 的文本输出import jc result jc.parse(mpstat, mpstat_command_output)parse函数的签名为def parse(data: str, raw: bool False, quiet: bool False) - List[Dict]data要解析的文本raw为True时返回未做类型转换的原始结构化数据数值保持字符串对应 CLI 的-r选项quiet为True时抑制兼容性警告mpstat 解析器仅在 Linux 上兼容非 Linux 平台会打印警告。注意较新版本的mpstat自身已支持 JSON 输出sysstat v11.5.1此时也可以直接mpstat -J获得 JSON但 jc 解析器面向的是绝大多数发行版上仍为文本输出的mpstat。输出 Schema解析结果是字典列表每条记录对应 mpstat 输出中的一行数据。完整 Schema 如下继承自 文档[ { type: string, # cpu 或 interrupts标识该行的统计类型 time: string, # 样本时间如 01:58:14 PM cpu: string, # all 或 CPU 编号 node: string, # NUMA 节点mpstat 输出 NODE 段时出现 average: boolean, # mpstat Average: 汇总行时为 true percent_usr: float, # 用户态 CPU 占用 percent_nice: float, # nice 进程 CPU 占用 percent_sys: float, # 内核态 CPU 占用 percent_iowait: float, # IO 等待 percent_irq: float, # 硬中断 percent_soft: float, # 软中断 percent_steal: float, # 虚拟化被 steal 的时间 percent_guest: float, percent_gnice: float, percent_idle: float, # 空闲 intr_s: float, # 每秒中断总数intr/s 段 x_s: float, # 按中断号细分的每秒中断数x 为整数 nmi_s: float, # NMI 每秒次数 loc_s: float, # 本地中断 spu_s: float, pmi_s: float, iwi_s: float, rtr_s: float, res_s: float, cal_s: float, tlb_s: float, trm_s: float, thr_s: float, dfr_s: float, mce_s: float, mcp_s: float, err_s: float, mis_s: float, pin_s: float, npi_s: float, piw_s: float, hi_s: float, # 高半部处理 timer_s: float, # 定时器中断 net_tx_s: float, # 网络发送 net_rx_s: float, # 网络接收 block_s: float, # 块设备 irq_poll_s: float, block_iopoll_s: float, tasklet_s: float, sched_s: float, # 调度器 hrtimer_s: float, # 高精度定时器 rcu_s: float # RCU } ]字段分为三类标识字段type、time、cpu、node、average用于区分不同数据段与样本CPU 百分比字段percent_*系列对应%usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle列中断频率字段intr_s、数字中断号x_s如15_s、以及NMI/s、HI/s、TIMER/s等按 mpstat 列名小写化后的名称_s字段。实际运行示例文档给出的默认输出示例单核汇总-p为 pretty 格式$ mpstat | jc --mpstat -p [ { cpu: all, percent_usr: 12.94, percent_nice: 0.0, percent_sys: 26.42, percent_iowait: 0.43, percent_irq: 0.0, percent_soft: 0.16, percent_steal: 0.0, percent_guest: 0.0, percent_gnice: 0.0, percent_idle: 60.05, type: cpu, time: 01:58:14 PM } ]加上-r后数值保持原始字符串12.94而非12.94适合需要保留原始精度的场景$ mpstat | jc --mpstat -p -r [ { cpu: all, percent_usr: 12.94, ... type: cpu, time: 01:58:14 PM } ]更有代表性的是mpstat -A输出全部统计段的解析结果。仓库测试夹具 tests/fixtures/centos-7.7/mpstat-A.out 是一段真实的 CentOS 7.7 输出包含 CPU 段、intr/s汇总段、按中断号细分的段以及HI/s TIMER/s ... RCU/s段解析后的 tests/fixtures/centos-7.7/mpstat-A.json 中同一行数组里混合了三种记录[ {cpu: all, percent_usr: 0.22, percent_nice: 0.0, percent_sys: 0.37, percent_iowait: 0.01, ..., percent_idle: 99.4, type: cpu, time: 03:15:06 PM}, {cpu: all, intr_s: 37.61, type: interrupts, time: 03:15:06 PM}, {cpu: 0, 0_s: 0.02, 1_s: 0.02, ..., loc_s: 32.69, iwi_s: 1.24, type: interrupts, time: 03:15:06 PM} ]可以看到同一样本时间点的 CPU 利用率与中断数据被扁平化为同一条数组中的多个字典用type字段区分cpu或interrupts这正是后续用jq过滤的基础例如mpstat -A | jc --mpstat | jq .[] | select(.type cpu)Ubuntu 18.04 的夹具 tests/fixtures/ubuntu-18.04/mpstat-A.out 还包含NODE段NUMA 节点统计解析后这些行的node字段会记录节点编号。源码实现解析整个解析逻辑集中在parse()与_process()两个函数中jc/parsers/mpstat.py#L131-L221核心流程是“先识别表头、再按表格解析、最后类型转换”。表头识别与统计类型判定mpstat 的多段输出各自带独立表头解析器以表中是否含CPU或NODE来判断一行是否为表头行if CPU in line or NODE in line: header_found True if %usr in line: stat_type cpu else: stat_type interrupts表头含%usr时判定该段为cpu类型利用率百分比段含 CPU 段和 NODE 段否则为interrupts类型各类中断段stat_type会写入后续每一行的type字段。表头归一化表头行在进入表格解析前做了三步归一化jc/parsers/mpstat.py#L199-L207header_text: str line.replace(/, _)\ .replace(%, percent_)\ .lower()intr/s、NMI/s等列名中的/替换为_得到intr_s、nmi_s%usr等百分比列名替换为percent_usr整体小写化HI/s变为hi_s。随后用line.find(CPU )找不到时退回line.find(NODE )定位表头在行内的起始列header_start数据行截取line[header_start:]后与归一化表头一起交给通用表格解析函数 simple_table_parse。该函数以第一行表头为 key按空白切分后续行并zip成字典列表是 jc 中多个简单表格解析器共用的基础设施。时间列与 Average 行的处理mpstat每行的前缀是样本时间如03:15:06 PM它不在表头覆盖的列范围内需要单独截取item_time line[:header_start].strip() if Average: not in item_time: output_line[time] line[:header_start].strip() else: output_line[average] True普通行时间前缀写入time字段采样多次后 mpstat 输出的Average:汇总行不写time而是打上average: true标记便于脚本区分瞬时样本与平均值。数值类型转换_process()负责把字符串数值转成float只有rawTrue时才会跳过这一步。转换规则有两条jc/parsers/mpstat.py#L143-L157if (key in float_list or (key[0].isdigit() and key.endswith(_s))): entry[key] jc.utils.convert_to_float(entry[key])键属于预定义的float_list全部percent_*与intr_s、nmi_s、timer_s、rcu_s等命名中断字段键以数字开头且以_s结尾覆盖15_s、47_s等任意中断号列。float_list是显式枚举的集合因此像cpu、time、node这类字段始终保持字符串类型不会被误转换。测试覆盖与兼容边界tests/test_mpstat.py 用四组真实系统夹具验证了解析结果与期望 JSON 完全相等测试用例夹具输入覆盖点无数据空字符串返回[]mpstatCentOS 7.7mpstat.out默认单段输出mpstat -ACentOS 7.7mpstat-A.outCPU 段 intr/s 段 中断号细分段 命名中断段mpstat -A 2 5CentOS 7.7mpstat-A-2-5.out多时间点采样含Average:行mpstat -AUbuntu 18.04mpstat-A.out含NODE段的 NUMA 输出兼容性边界源码中info.compatible [linux]parse()入口处调用jc.utils.compatibility(__name__, info.compatible, quiet)在非 Linux 平台上解析时会提示兼容性警告可传quietTrue抑制。该解析器面向文本输出的mpstat适用于 Linux 上 sysstat 提供的各版本如系统自带 v11.5.1 且已用-J输出 JSON则无需再经 jc 转换。流式解析支持mpstat 这类周期性输出如mpstat 1 10每 1 秒一行适合流式处理jc 的流式框架会把连续输出逐条解析夹具 tests/fixtures/centos-7.7/mpstat-A-streaming.json 即为流式解析的预期结果其格式与非流式一致对象流。流式用法的完整说明见 docs/streaming.md。小结jc 的 mpstat 解析器以“表头驱动”的方式把 mpstat 的多段表格扁平化为统一 Schema 的字典数组type区分 CPU 利用率与中断数据time/average标识样本percent_*与名称_s系列字段承载全部数值并自动转为float。结合jq过滤如select(.type cpu)即可把多核利用率、中断分布这类原本难以程序化消费的系统指标直接纳入监控与自动化脚本。赞分享开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载相关推荐fastfetch 内置的 Shell 补全脚本怎么用为 bash/zsh/fish 启用 tab 补全fastfetch 内置的 Shell 补全脚本怎么用为 bash/zsh/fish 启用 tab 补全 fastfetch 仓库自带三份 shell 补全脚开发工具jc mdadm 解析器将 RAID 阵列状态输出转为可查询的 JSON 结构jc mdadm 解析器将 RAID 阵列状态输出转为可查询的 JSON 结构 jc 的 mdadm 解析器将 Linux mdadm 工具 query 阵开发工具jc last 解析器详解将 last / lastb 登录审计日志转换为结构化 JSON 数据jc last 解析器详解将 last / lastb 登录审计日志转换为结构化 JSON 数据 本文基于 jc 项目的 last 解析器文档 docs/p开发工具上一篇Rapid YAML高效解析与生成YAML的C库下一篇如何快速参与开源项目contribute-to-open-source交互式学习教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考