查询指标、记录字段、统计口径及接口参数时,使用以下参考页;了解功能和适用问题见核心特性。
| 参考 | 内容 |
|---|---|
| 指标参考 | 名称、单位、标签、来源和统计口径 |
| 自动追踪字段 | 触发指标、采集结果及 JSON 示例 |
| 异常事件字段 | 事件结构、字段、限制和兼容性 |
| 硬件事件字段 | RAS 计数、严重级别、寄存器和错误编码 |
| Profiling API | 任务创建、状态、结果查询及停止规则 |
| profiler 命令行参数 | 参数默认值、范围和适用模式 |
[i18n] print_printable_section [i18n] print_click_to_print.
查询指标、记录字段、统计口径及接口参数时,使用以下参考页;了解功能和适用问题见核心特性。
| 参考 | 内容 |
|---|---|
| 指标参考 | 名称、单位、标签、来源和统计口径 |
| 自动追踪字段 | 触发指标、采集结果及 JSON 示例 |
| 异常事件字段 | 事件结构、字段、限制和兼容性 |
| 硬件事件字段 | RAS 计数、严重级别、寄存器和错误编码 |
| Profiling API | 任务创建、状态、结果查询及停止规则 |
| profiler 命令行参数 | 参数默认值、范围和适用模式 |
本文列出指标名称、单位、标签、来源及统计口径。功能与排查场景见内核全景观测。
本文按 CPU、内存、网络、I/O、系统事件和 GPU 分类说明常用指标,供查询和排障时参考。实际输出取决于内核接口、设备驱动、采集器开关和过滤配置,完整指标以节点的 /metrics 输出为准。启用方式见节点配置。
huatuo_bamai_ 前缀。例如,cpu_util_total 的完整名称为 huatuo_bamai_cpu_util_total。host、region;容器指标另带 container_host、container_hostnamespace、container_level、container_name、container_type。表格仅列附加标签,— 表示无附加标签。rate() 或 increase() 分析变化;部分内核累计统计以 Gauge 导出,需结合字段语义判断,不能仅凭类型或名称推断。# TYPE huatuo_bamai_runqlat_latency counter
huatuo_bamai_runqlat_latency{host="hostname",region="dev",zone="0"} 35100
# TYPE huatuo_bamai_runqlat_container_latency counter
huatuo_bamai_runqlat_container_latency{container_host="coredns-855c4dd65d-8v5kg",container_hostnamespace="kube-system",container_level="burstable",container_name="coredns",container_type="normal",host="hostname",region="dev",zone="0"} 226
此例分别展示宿主机和容器的调度延迟分桶计数,zone 的范围见下文。
huatuo_bamai_build_info 和 huatuo_apiserver_build_info 是值恒为 1 的
Gauge,分别表示 bamai 和 apiserver 当前运行的构建。两者由各自程序的
/metrics 暴露,构建信息与该程序的 /version 一致。它们包含既有公共标签
host、region(apiserver 中为空),以及以下构建标签:
| 标签 | 含义 |
|---|---|
name |
程序名称,与 /version 中的 name 一致 |
version |
程序发布版本,与 /version 中的 version 一致 |
git_commit |
构建的 Git 标识,与 /version 中的 git_commit 一致;不保证是完整 SHA |
git_tree_state |
构建时的工作区状态:clean、dirty 或 unknown |
build_time |
/version 中的时间戳:优先使用注入的构建时间,缺失时回退为 VCS 提交时间或 (devel) |
go_version |
构建程序所用的 Go 工具链版本 |
compiler |
Go 编译器,例如 gc |
platform |
操作系统和架构,例如 linux/amd64 |
未提供发布版本时,version 使用 (devel)。git_commit 优先使用注入值,
其次读取 Go 构建信息中的 VCS 提交标识,两者均不可用时使用 (devel)。构建标签只附加到该指标,
业务指标的标签保持不变。Prometheus 抓取后,可通过相同的 job、instance
将构建信息与业务指标关联;跨集群查询还需纳入实际用于区分目标的集群标签。
调度延迟指任务进入可运行状态到实际获得 CPU 的等待时间。以下指标为 eBPF 采集的累计 Counter,按 zone 分桶:0 为 [0, 10) ms,1 为 [10, 20) ms,2 为 [20, 50) ms,3 为 ≥50 ms。
| 指标 | 说明 | 单位 | 范围 | 来源 | 附加标签 |
|---|---|---|---|---|---|
runqlat_container_latency |
调度延迟分桶计数 | 计数 | 容器 | eBPF | zone |
runqlat_latency |
调度延迟分桶计数 | 计数 | 宿主机 | eBPF | zone |
统计各 CPU 上软中断从触发到开始处理的等待时间,当前仅输出 NET_RX、NET_TX。该指标为累计 Counter;zone:0 为 [0, 10) μs,1 为 [10, 100) μs,2 为 [100, 1000) μs,3 为 ≥1 ms。
| 指标 | 说明 | 单位 | 范围 | 来源 | 附加标签 |
|---|---|---|---|---|---|
softirq_latency |
软中断响应延迟分桶计数 | 计数 | 宿主机 | eBPF | cpuid, type, zone |
宿主机利用率按在线 CPU 核数归一化,容器利用率按可用 CPU 容量归一化,输出范围为 0–100%。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
cpu_util_sys |
CPU 内核态利用率 | % | 宿主机 | — |
cpu_util_usr |
CPU 用户态利用率 | % | 宿主机 | — |
cpu_util_total |
CPU 总利用率 | % | 宿主机 | — |
cpu_util_container_sys |
CPU 内核态利用率 | % | 容器 | — |
cpu_util_container_usr |
CPU 用户态利用率 | % | 容器 | — |
cpu_util_container_total |
CPU 总利用率 | % | 容器 | — |
容器可用 CPU 容量取配额折算核数与有效 CPU 集合大小的较小值;未限制配额时使用有效 CPU 集合大小,无法获取有效集合时回退到宿主机在线核数。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
cpu_util_container_cores |
可用 CPU 容量(可为小数) | 核 | 容器 | — |
限流统计来自 cgroup CPU 接口,仅输出内核提供的字段。等待占比还要求内核导出 wait_sum,并启用 kernel.sched_schedstats=1。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
cpu_stat_container_nr_throttled |
cgroup 发生 CPU 限流的累计周期数 | 计数 | 容器 | — |
cpu_stat_container_throttled_time |
cgroup 被限流的累计时间 | 纳秒 | 容器 | — |
cpu_stat_container_wait_sum_percent |
采集区间内 cgroup 在父运行队列的等待时间占可调度时间的比例 | % | 容器 | — |
等待占比按采集区间计算:等待时间增量 /(等待时间增量 + CPU 使用时间增量)× 100%。它描述可调度时间中的等待比例,不是限流时间占比。
参考:
统计 cgroup 使用突发 CPU 容量的周期数和时间,仅在内核提供对应字段时输出。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
cpu_stat_container_burst_time |
使用突发 CPU 容量的累计时间 | 纳秒 | 容器 | — |
cpu_stat_container_nr_bursts |
使用突发 CPU 容量的累计周期数 | 计数 | 容器 | — |
宿主机输出 1、5、15 分钟平均负载;容器输出当前可运行和不可中断任务数,两者不是相同时间窗口的统计。
| 指标 | 说明 | 单位 | 范围 | 附加标签 | 备注 |
|---|---|---|---|---|---|
loadavg_load1 |
系统过去 1 分钟的平均负载 | 任务数 | 宿主机 | — | — |
loadavg_load5 |
系统过去 5 分钟的平均负载 | 任务数 | 宿主机 | — | — |
loadavg_load15 |
系统过去 15 分钟的平均负载 | 任务数 | 宿主机 | — | — |
loadavg_container_nr_running |
当前可运行任务数(含正在运行和等待 CPU 的任务) | 计数 | 容器 | — | 只支持 cgroup v1 |
loadavg_container_nr_uninterruptible |
容器中不可中断任务的数量 | 计数 | 容器 | — | 只支持 cgroup v1 |
内存回收和规整可能阻塞任务。以下指标分别记录宿主机累计耗时和容器直接回收事件数。
| 指标 | 说明 | 单位 | 范围 | 来源 | 附加标签 |
|---|---|---|---|---|---|
memory_free_allocpages_stall |
宿主机直接回收累计耗时 | 毫秒 | 宿主机 | eBPF | — |
memory_free_compaction_stall |
宿主机内存规整累计耗时 | 毫秒 | 宿主机 | eBPF | — |
memory_reclaim_container_directstall |
容器直接回收事件次数 | 计数 | 容器 | eBPF | — |
memory_others_container_directstall_time、memory_others_container_asyncreclaim_time、memory_others_container_local_direct_reclaim_time 依赖滴滴定制内核的 memory.directstall_stat、memory.asynreclaim_stat、memory.local_direct_reclaim_time 接口。
主线及常见发行版内核缺少这些接口时不会输出对应指标,无需额外加载模块。标准内核上的容器直接回收次数可使用 memory_reclaim_container_directstall 观测。
容器字段来自 memory.stat,宿主机字段来自 /proc/vmstat,均受 MetricCollector.Vmstat 过滤规则影响。字段是否存在及其含义取决于内核和 cgroup 版本。
容器内存
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_vmstat_container_active_file |
活跃文件内存大小 | 字节 | 容器 | — |
memory_vmstat_container_active_anon |
活跃匿名内存大小 | 字节 | 容器 | — |
memory_vmstat_container_inactive_file |
非活跃文件内存大小 | 字节 | 容器 | — |
memory_vmstat_container_inactive_anon |
非活跃匿名内存大小 | 字节 | 容器 | — |
memory_vmstat_container_file_dirty |
已修改且还未写入磁盘的文件内存大小 | 字节 | 容器 | — |
memory_vmstat_container_file_writeback |
正在写回的文件内存大小 | 字节 | 容器 | — |
memory_vmstat_container_dirty |
已修改且还未写入磁盘的内存大小 | 字节 | 容器 | — |
memory_vmstat_container_writeback |
正在写回的内存大小 | 字节 | 容器 | — |
memory_vmstat_container_pgdeactivate |
将页面从 active LRU 移动到 inactive LRU 的数量 | 页 | 容器 | — |
memory_vmstat_container_pgrefill |
在 active LRU 链表上被扫描的页面总数 | 页 | 容器 | — |
memory_vmstat_container_pgscan_direct |
直接回收时,在 inactive LRU 上扫描过的页面总数 | 页 | 容器 | — |
memory_vmstat_container_pgscan_kswapd |
kswapd 在 inactive LRU 链表上扫描过的页面总数 | 页 | 容器 | — |
memory_vmstat_container_pgsteal_direct |
直接回收时,成功从 inactive LRU 回收的页面总数 | 页 | 容器 | — |
memory_vmstat_container_pgsteal_kswapd |
kswapd 成功从 inactive LRU 回收的页面总数 | 页 | 容器 | — |
memory_vmstat_container_unevictable |
不可回收的页面字节数 | 字节 | 容器 | — |
宿主机内存
以下名称已包含 memory_vmstat_ 前缀;底层字段值原样导出,不统一换算为字节。pgpgin、pgpgout 按内核的 KiB 口径读取,见 Linux vmstat 实现。
页面状态与 LRU
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_vmstat_nr_free_pages |
空闲页面总数(伙伴系统可直接分配)。 | 页 | 宿主机 | — |
memory_vmstat_nr_inactive_anon |
非活跃匿名页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_inactive_file |
非活跃文件页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_active_anon |
活跃匿名页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_active_file |
活跃文件页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_unevictable |
不可回收页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_mlock |
被 mlock() 锁定的页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_shmem |
tmpfs / shmem 使用的页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_slab_reclaimable |
可回收 Slab 占用的页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_slab_unreclaimable |
不可回收 Slab 占用的页面数 | 页 | 宿主机 | — |
脏页与写回
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_vmstat_nr_dirty |
当前脏页数 | 页 | 宿主机 | — |
memory_vmstat_nr_writeback |
正在写回的页面数 | 页 | 宿主机 | — |
memory_vmstat_nr_dirty_threshold |
触发脏页限流的阈值 | 页 | 宿主机 | — |
memory_vmstat_nr_dirty_background_threshold |
后台写回开始的阈值 | 页 | 宿主机 | — |
缺页与换页
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_vmstat_pgfault |
总缺页异常次数 | 计数 | 宿主机 | — |
memory_vmstat_pgmajfault |
主缺页异常次数 | 计数 | 宿主机 | — |
memory_vmstat_pgpgin |
从块设备读入的数据量 | KiB | 宿主机 | — |
memory_vmstat_pgpgout |
写出到块设备的数据量 | KiB | 宿主机 | — |
memory_vmstat_pswpin |
从 Swap 换入的页面数 | 页 | 宿主机 | — |
memory_vmstat_pswpout |
换出到 Swap 的页面数 | 页 | 宿主机 | — |
回收与扫描
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_vmstat_pgscan_kswapd |
kswapd 扫描的页面数 | 页 | 宿主机 | — |
memory_vmstat_pgscan_direct |
直接回收扫描的页面数 | 页 | 宿主机 | — |
memory_vmstat_pgscan_khugepaged |
khugepaged 扫描的页面数 | 页 | 宿主机 | — |
memory_vmstat_pgsteal_kswapd |
kswapd 成功回收的页面数 | 页 | 宿主机 | — |
memory_vmstat_pgsteal_direct |
直接回收成功回收的页面数 | 页 | 宿主机 | — |
memory_vmstat_pgsteal_khugepaged |
khugepaged 成功回收的页面数 | 页 | 宿主机 | — |
透明大页(THP)
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_vmstat_thp_fault_alloc |
缺页时成功分配 THP 的次数 | 计数 | 宿主机 | — |
memory_vmstat_thp_fault_fallback |
缺页时分配 THP 失败而回落普通页的次数 | 计数 | 宿主机 | — |
memory_vmstat_thp_collapse_alloc |
khugepaged 折叠成 THP 的成功次数 | 计数 | 宿主机 | — |
memory_vmstat_thp_collapse_alloc_failed |
khugepaged 折叠 THP 的失败次数 | 计数 | 宿主机 | — |
NUMA
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_vmstat_numa_hit |
在首选 NUMA 节点分配成功的页面数 | 页 | 宿主机 | — |
memory_vmstat_numa_miss |
首选其他节点但在本节点分配的页面数 | 页 | 宿主机 | — |
memory_vmstat_numa_foreign |
首选本节点但在其他节点分配的页面数 | 页 | 宿主机 | — |
memory_vmstat_numa_local |
在当前 CPU 所属 NUMA 节点分配的页面数 | 页 | 宿主机 | — |
memory_vmstat_numa_other |
在当前 CPU 所属节点以外分配的页面数 | 页 | 宿主机 | — |
memory_vmstat_numa_pages_migrated |
由于自动 NUMA 平衡而成功迁移的页面总数 | 页 | 宿主机 | — |
参考:
以下字段来自 memory.events,记录回收、内存限制和 OOM 事件。主线内核在 cgroup v2 中提供该接口;滴滴定制内核也可在 cgroup v1 中提供。接口缺失时不输出。各字段的统计条件不同,不能相加作为独立事件总数。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
memory_events_container_low |
低于 memory.low 仍因压力发生回收的次数,通常表示低水位保护过量配置 | 计数 | 容器 | — |
memory_events_container_high |
超过 memory.high 后被节流并进入直接回收的次数 | 计数 | 容器 | — |
memory_events_container_max |
内存使用量即将超过 memory.max 的次数 | 计数 | 容器 | — |
memory_events_container_oom |
内存达到限制、分配即将失败并考虑 OOM 处理的次数 | 计数 | 容器 | — |
memory_events_container_oom_kill |
属于该 cgroup、被任意 OOM killer 杀死的进程数 | 计数 | 容器 | — |
memory_events_container_oom_group_kill |
发生组 OOM kill 的次数 | 计数 | 容器 | — |
展示每个 NUMA 节点、内存区域和阶数的空闲内存块数量。order=n 表示每块包含 2^n 个连续页面;指标值是块数,不是页面数。
| 指标 | 说明 | 单位 | 范围 | 来源 | 附加标签 |
|---|---|---|---|---|---|
memory_buddyinfo_blocks |
指定 NUMA 节点、内存区域和阶数的空闲块数 | 块 | 宿主机 | procfs | node, order, zone |
| 指标 | 意义 | 单位 | 对象 | 取值 | 标签 |
|---|---|---|---|---|---|
| memory_free_container_allocpages_stall | 容器任务参与全局直接回收的累计耗时 | 毫秒 | 容器 | eBPF | container_host, container_hostnamespace, container_level, container_name, container_type, host, region |
| memory_free_container_compaction_stall | 容器任务参与直接内存规整的累计耗时 | 毫秒 | 容器 | eBPF | 同上 |
两项为累计耗时 Gauge,统计全局直接回收与规整中的任务耗时。主机总量包含容器工作;缺失或归属不明确的容器记录不输出。容器采集失败仍保留主机数据,加载依赖容器探针,加载或挂载失败时该采集器不可用。容器重建后对应容器累计值重新开始,主机累计值不受影响;BPF 重载后两者均归零。
| 指标 | 意义 | 单位 | 对象 | 取值 | 标签 |
|---|---|---|---|---|---|
| memory_reclaim_directstall | 整台主机 memcg 限额回收累计次数 | 计数 | 物理机 | eBPF | host, region |
该 Gauge 统计全机 memcg 回收次数,排除 kswapd,不是全局回收次数或耗时。主机总量包含容器活动,不能与容器计数相加;BPF 重载后归零。
记录 TCP 内存使用量及其相对限制的占比。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
tcp_memory_limit_pages |
系统可使用的 TCP 总内存大小 | 页 | 宿主机 | — |
tcp_memory_usage_bytes |
系统已使用的 TCP 内存大小 | 字节 | 宿主机 | — |
tcp_memory_usage_pages |
系统已使用的 TCP 内存大小 | 页 | 宿主机 | — |
tcp_memory_usage_percent |
系统已使用的 TCP 内存百分比(相对 TCP 内存总限制) | % | 宿主机 | — |
宿主机 nf_conntrack 表的占用与容量,分别来自
/proc/sys/net/netfilter/nf_conntrack_count 与
/proc/sys/net/netfilter/nf_conntrack_max。仓库配置默认通过 BlackList 禁用 net_conntrack。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
net_conntrack_entry_count |
当前 nf_conntrack 表中的条目数 | 个 | 宿主机 | — |
net_conntrack_entry_max |
nf_conntrack 表可容纳的最大条目数 | 个 | 宿主机 | — |
按宿主机和容器网络命名空间统计 ARP 邻居项。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
arp_entries |
宿主机网络命名空间 ARP 条目数量 | 计数 | 宿主命名空间 | — |
arp_total |
宿主机所有网络命名空间 ARP 条目数量总和 | 计数 | 宿主机 | — |
arp_container_entries |
容器网络命名空间 ARP 条目数量 | 计数 | 容器 | — |
Qdisc 指标描述发送队列积压、发送量、丢包和重入队次数,不直接提供排队延迟。仅采集匹配设备的根 Qdisc,跳过 noqueue。仓库配置默认通过 BlackList 禁用 netdev_qdisc。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
netdev_qdisc_backlog |
排队待发送的字节数 | 字节 | 宿主机 | device, kind |
netdev_qdisc_current_queue_length |
当前排队报文数 | 计数 | 宿主机 | device, kind |
netdev_qdisc_overlimits_total |
超限次数 | 计数 | 宿主机 | device, kind |
netdev_qdisc_requeues_total |
由于网卡/驱动暂时无法发送而被重新入队的次数 | 计数 | 宿主机 | device, kind |
netdev_qdisc_drops_total |
主动丢弃的包数(因队列满、限速策略等原因) | 计数 | 宿主机 | device, kind |
netdev_qdisc_bytes_total |
累计发送字节数 | 字节 | 宿主机 | device, kind |
netdev_qdisc_packets_total |
已发送的包数 | 计数 | 宿主机 | device, kind |
统计支持的网卡驱动在接收方向的硬件丢包。优先使用 rx_missed_errors,否则尝试从 rx_dropped 中扣除 eBPF 统计的软件丢包。仓库配置默认通过 BlackList 禁用 netdev_hw。
| 指标 | 说明 | 单位 | 范围 | 来源 | 附加标签 |
|---|---|---|---|---|---|
netdev_hw_rx_dropped_total |
接收方向硬件丢包累计数 | 计数 | 宿主机 | sysfs、eBPF | device, driver |
netdev_rdma_link_<counter> 输出内核的逐端口计数,具体名称取决于驱动。附加标签为 device、nodeguid、index、num_ports 和 port。
新增 port 标签会产生新的时间序列,单端口设备也受影响。端口级查询保留该标签;对选定计数器,设备总量使用 sum by (region, host, device) (<metric>),设备速率使用 sum by (region, host, device) (rate(<metric>[5m])),将 <metric> 替换为完整指标名。只按 device 聚合会混合不同主机上的同名设备。
通过 proc 或 netlink 采集网卡统计,公共指标遵循 Linux /proc/net/dev 的统计口径:
receive_dropped:rx_dropped + rx_missed_errors。receive_frame_errors:rx_length_errors + rx_over_errors + rx_crc_errors + rx_frame_errors。transmit_carrier_errors:tx_carrier_errors + tx_aborted_errors + tx_window_errors + tx_heartbeat_errors。netlink 还提供细分错误指标和 receive_nohandler,细分错误可能已包含在上述聚合值中,不能与聚合值重复相加。表中列宿主机名称;容器名称在 netdev_ 后增加 container_。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
netdev_receive_bytes_total |
成功接收的总字节数 | 字节 | 宿主机、容器 | device |
netdev_receive_packets_total |
成功接收的数据包总数 | 计数 | 宿主机、容器 | device |
netdev_receive_multicast_total |
接收的组播包数 | 计数 | 宿主机、容器 | device |
netdev_receive_compressed_total |
接收到的已压缩数据包数 | 计数 | 宿主机、容器 | device |
netdev_receive_frame_errors_total |
接收长度、溢出、CRC 和帧对齐错误总数 | 计数 | 宿主机、容器 | device |
netdev_receive_errors_total |
接收错误总数 | 计数 | 宿主机、容器 | device |
netdev_receive_dropped_total |
接收丢包数,包含 missed errors | 计数 | 宿主机、容器 | device |
netdev_receive_fifo_errors_total |
接收 FIFO/环形缓冲区溢出错误数 | 计数 | 宿主机、容器 | device |
netdev_transmit_bytes_total |
成功发送的总字节数 | 字节 | 宿主机、容器 | device |
netdev_transmit_packets_total |
成功发送的数据包总数 | 计数 | 宿主机、容器 | device |
netdev_transmit_collisions_total |
发送冲突次数 | 计数 | 宿主机、容器 | device |
netdev_transmit_errors_total |
发送错误总数 | 计数 | 宿主机、容器 | device |
netdev_transmit_dropped_total |
发送过程中被丢弃的包数(队列满、策略丢弃等) | 计数 | 宿主机、容器 | device |
netdev_transmit_fifo_errors_total |
发送 FIFO/环形缓冲区错误数 | 计数 | 宿主机、容器 | device |
netdev_transmit_carrier_errors_total |
发送载波、中止、窗口和心跳错误总数 | 计数 | 宿主机、容器 | device |
netdev_transmit_compressed_total |
发送的已压缩数据包数 | 计数 | 宿主机、容器 | device |
读取网络命名空间的 /proc/<pid>/net/netstat 和 snmp,受 MetricCollector.Netstat 过滤规则影响。表中列宿主机名称;容器名称在 netstat_ 后增加 container_。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
netstat_TcpExt_ArpFilter |
因 ARP 过滤规则而被丢弃的数据包数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_BusyPollRxPackets |
通过 busy polling 机制接收到的数据包数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_DelayedACKLocked |
延迟 ACK 定时器到期,但 Socket 被用户态锁定而推迟发送的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_DelayedACKLost |
收到已确认报文的次数,可能由 ACK 丢失或网络重复报文导致 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_DelayedACKs |
延迟 ACK 定时器到期并发送 ACK 的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_EmbryonicRsts |
在 SYN_RECV 状态收到带 RST/SYN 标记的包个数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_ListenDrops |
LISTEN 状态 Socket 丢弃报文的次数,包括接受队列溢出、内存分配失败等情况 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_ListenOverflows |
TCP 接受队列溢出次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_OfoPruned |
乱序队列因内存不足被修剪的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_OutOfWindowIcmps |
收到的与当前 TCP 窗口无关的 ICMP 错误报文数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_PruneCalled |
因内存不足触发缓存清理的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_RcvPruned |
接收队列因内存不足被修剪(丢弃数据包)的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_SyncookiesFailed |
验证失败的 SYN cookie 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_SyncookiesRecv |
接收的 SYN cookie 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_SyncookiesSent |
发送的 SYN cookie 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPACKSkippedChallenge |
在处理 Challenge ACK 过程中跳过的其他 ACK 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPACKSkippedFinWait2 |
在 FIN-WAIT-2 状态下跳过的 ACK 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPACKSkippedPAWS |
因 PAWS 检查失败而跳过的 ACK 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPACKSkippedSeq |
因为序列号检查而跳过的 ACK 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPACKSkippedTimeWait |
在 TIME-WAIT 状态下跳过的 ACK 数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPAbortOnClose |
应用关闭连接时仍有未读取数据而中止连接的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPAbortOnData |
仍有在途数据时中止连接并发送 RST 的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPAbortOnLinger |
在 LINGER 状态下等待超时后中止连接的数量 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPAbortOnMemory |
因内存问题关闭连接的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPAbortOnTimeout |
因各种计时器的重传次数超过上限而关闭连接的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPLossFailures |
丢失数据包而进行恢复失败的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPLossProbeRecovery |
通过 TLP 检测并恢复丢包的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPLossProbes |
发送尾部丢包探测(TLP)报文的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPLossUndo |
在恢复过程中检测到丢失而撤销的次数 | 计数 | 宿主机、容器 | — |
netstat_TcpExt_TCPLostRetransmit |
丢包重传的数量 | 计数 | 宿主机、容器 | — |
表中仅列部分 TcpExt 字段;其余字段及版本差异见 Linux 内核文档。
参考:
读取网络命名空间的 /proc/<pid>/net/sockstat。表中列宿主机名称;容器名称在 sockstat_ 后增加 container_。mem、mem_bytes 仅在宿主机输出。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
sockstat_sockets_used |
当前使用的 Socket 数 | 计数 | 宿主机、容器 | — |
sockstat_TCP_inuse |
当前处于 TCP 连接状态(如 ESTABLISHED、LISTEN 等,除 TIME_WAIT 外)的 socket 数量 | 计数 | 宿主机、容器 | — |
sockstat_TCP_orphan |
不再关联用户态文件句柄的 TCP Socket 数 | 计数 | 宿主机、容器 | — |
sockstat_TCP_tw |
当前处于 TIME_WAIT 状态的 TCP Socket 数量 | 计数 | 宿主机、容器 | — |
sockstat_TCP_alloc |
当前已分配的 TCP Socket 对象总数 | 计数 | 宿主机、容器 | — |
sockstat_TCP_mem |
TCP 套接字当前占用的内核内存页数 | 页 | 宿主机 | — |
sockstat_UDP_inuse |
当前已绑定了本地端口的 UDP Socket 数量 | 计数 | 宿主机、容器 | — |
iotracing、iolatency、blk_throtl、iocost 和 io_health 默认启用。
向全局 BlackList 添加对应名称并重启 Huatuo 可关闭该功能。
关闭 iotracing 会同时停止磁盘指标和自动诊断;关闭 io_health 会停止
健康事件、取证及其指标,不影响 iotracing。
通过以下指标观测磁盘性能。指标使用 huatuo_bamai_iotracing_ 前缀,
均为区间 Gauge,带 disk 标签。
| 指标后缀 | 含义 |
|---|---|
read_bps、write_bps |
读写吞吐量,单位字节/秒 |
read_iops、write_iops |
每秒读写操作数 |
read_await_ms、write_await_ms |
读写平均完成时间,单位毫秒 |
io_util_percent |
磁盘忙碌时间占比 |
average_queue_size |
平均 IO 队列长度 |
指标覆盖整盘和支持的逻辑设备,不包含分区及 loop、ram、zram、fd 等伪设备。
iolatency 统计 SCSI/SAS、NVMe、virtio 磁盘及容器读写 IO 的延时和大小分布。
仅采集启动时已开启 iostats 和请求时间统计的磁盘,运行中不支持关闭这些配置。
启动时若软件 blk-crypto fallback 已初始化,整个 iolatency 不启动。
SCSI 下发大小沿用内核的 16 位扇区计数,达到 32 MiB 会回绕。 跨 blkcg 合并 request 时,容器下发大小为近似归属,宿主机统计不受影响。
块设备增删或重建时,iolatency、blk_throtl 和 iocost 重新开始统计,
过渡期间的所有磁盘数据可能缺失。
桶值为采集区间内小于等于 le 上界的 IO 数量,+Inf 为总数;延时边界
单位为秒,大小边界单位为字节。指标为区间 Gauge。
# TYPE huatuo_bamai_iolatency_q2d_seconds_bucket gauge
huatuo_bamai_iolatency_q2d_seconds_bucket{disk="sda",operation="read",host="hostname",region="dev",le="0.001"} 3
huatuo_bamai_iolatency_q2d_seconds_bucket{disk="sda",operation="read",host="hostname",region="dev",le="+Inf"} 5
# TYPE huatuo_bamai_iolatency_d2c_seconds_bucket gauge
huatuo_bamai_iolatency_d2c_seconds_bucket{disk="sda",operation="read",host="hostname",region="dev",le="+Inf"} 5
# TYPE huatuo_bamai_iolatency_q2g_seconds_bucket gauge
huatuo_bamai_iolatency_q2g_seconds_bucket{disk="sda",operation="read",host="hostname",region="dev",le="+Inf"} 5
# TYPE huatuo_bamai_iolatency_container_q2g_seconds_bucket gauge
huatuo_bamai_iolatency_container_q2g_seconds_bucket{container_host="etcd-hostname",container_hostnamespace="kube-system",container_level="burstable",container_name="etcd",container_type="normal",disk="sda",operation="read",host="hostname",region="dev",le="+Inf"} 2
| 指标 | 意义 | 单位 | 对象 |
|---|---|---|---|
| iolatency_q2d_seconds_bucket | 入队到最后一次下发的延时分布 | 计数 | 宿主 |
| iolatency_d2c_seconds_bucket | 最后一次下发到完成的延时分布 | 计数 | 宿主 |
| iolatency_q2g_seconds_bucket | 入队到 request 起始时间的延时分布 | 计数 | 宿主 |
| iolatency_container_q2d_seconds_bucket | 入队到最后一次下发的延时分布 | 计数 | 容器 |
| iolatency_container_d2c_seconds_bucket | 最后一次下发到完成的延时分布 | 计数 | 容器 |
| iolatency_container_q2g_seconds_bucket | 入队到 request 起始时间的延时分布 | 计数 | 容器 |
| iolatency_queued_io_size_bytes_bucket | 入队 bio 大小分布 | 计数 | 宿主 |
| iolatency_issued_io_size_bytes_bucket | request 大小分布;SCSI 取最后一次下发的完整大小,NVMe/virtio 取完成字节数 | 计数 | 宿主 |
| iolatency_container_queued_io_size_bytes_bucket | 入队 bio 大小分布 | 计数 | 容器 |
| iolatency_container_issued_io_size_bytes_bucket | request 大小分布;SCSI 取最后一次下发的完整大小,NVMe/virtio 取完成字节数 | 计数 | 容器 |
| iolatency_interval_start_timestamp_seconds | 本区间开始时间 | Unix 秒 | 宿主 |
| iolatency_interval_end_timestamp_seconds | 本区间结束时间 | Unix 秒 | 宿主 |
17 个延时桶界(秒)为 0.00005、0.0001、0.00025、0.0005、
0.001、0.002、0.004、0.008、0.016、0.032、0.064、0.128、
0.256、0.512、1、2、+Inf。
IO 总览展示各采集区间的延时分布和 IO 数量,点击柱状图可查看该时段的
延时与大小直方图。面板使用 Business Charts(volkovlabs-echarts-panel)。
升级后需更新自定义面板和告警,以下省略 huatuo_bamai_ 前缀:
| 旧指标 | 替换方式 |
|---|---|
iolatency_blkdisk_d2c |
iolatency_d2c_seconds_bucket |
iolatency_container_blkdisk_d2c |
iolatency_container_d2c_seconds_bucket |
iolatency_blkdisk_q2c、iolatency_container_blkdisk_q2c |
无直接等价指标,按所需阶段选择 Q2G、Q2D 或 D2C |
iolatency_blkdisk_freeze |
io_health_blkdisk_freeze,仍为 Counter |
disk 从 8:0 等设备号改为 sda 等磁盘名,新增 operation 区分读写。
旧 zone 编号改为以秒为单位的 le 累计上界;桶界见上文,不能按编号直接替换。
统计 (a, b] 范围的数量时,用 le=b 的值减去 le=a 的值。
旧延时指标仅统计 20 ms 及以上的 IO;新指标覆盖支持盘的全部读写 IO, D2C 从最后一次下发计时。旧告警需按新的阶段和桶界调整,不能只改指标名称。
新延时桶由累积 Counter 改为区间 Gauge,不能继续使用 rate() 或 increase()。
单个采集区间直接查询;例如,统计最近五分钟某盘读 IO 的 D2C 样本总数:
sum_over_time(huatuo_bamai_iolatency_d2c_seconds_bucket{disk="sda",operation="read",le="+Inf"}[5m])
# HELP huatuo_bamai_io_health_blkdisk_freeze the disk freeze event count
# TYPE huatuo_bamai_io_health_blkdisk_freeze counter
huatuo_bamai_io_health_blkdisk_freeze{disk="sda",host="hostname",region="dev"} 0
| 指标 | 意义 | 单位 | 对象 | 标签 |
|---|---|---|---|---|
| io_health_blkdisk_freeze | 宿主机磁盘 freeze 次数,换盘清零 | 计数 | 宿主 | host, region, disk |
可在宿主机仪表盘的 Overview → Selected Metric 中选择此指标。
blk_throtl 统计 IO 因 blk-throttle 限速而排队的数量和平均等待时间。
每个 IO 结束排队后计数一次,等待时间从首次排队算起。
| 指标 | 含义 |
|---|---|
blk_throtl_delayed_io_count |
采集区间内完成等待的 IO 数量 |
blk_throtl_average_wait_ms |
这些 IO 的平均排队时间,单位毫秒 |
blk_throtl_container_delayed_io_count |
容器采集区间内完成等待的 IO 数量 |
blk_throtl_container_average_wait_ms |
容器 IO 的平均排队时间,单位毫秒 |
指标按 disk 和 operation(read 或 write)区分,scope=host
表示宿主机总量,scope=other 表示其中无法归属容器的部分。
容器指标使用容器标签,不带 scope。四项均为区间 Gauge。
容器发现可选,宿主机采集不依赖 kubelet。容器查询失败或标签无效时,本轮数据
归入 other;关联恢复后不补报历史数据。临时采集失败后,首次成功采集仅重建
基线,下一次成功采集恢复输出,不补报失败区间。若错误导致采集停止,需排障后
重启 Huatuo。
cgroup 实际释放后,尚未采集的尾部等待增量归入 Host 和 Other,不再关联容器。 两次成功采集之间,同一统计项在单 CPU 上完成至少 67,108,864 次等待,或累计 等待约 274.9 万秒时,计数回绕可能导致少计。
iocost 统计预算不足造成的等待。等待时间从 IO 进入等待队列算到最终被唤醒,
计入等待结束所在的采集区间。
| 指标 | 含义 |
|---|---|
iocost_waitq_io_count |
本轮完成等待的读写 IO 数量 |
iocost_average_wait_ms |
这些 IO 的平均等待时间,单位毫秒 |
iocost_container_waitq_io_count |
容器本轮完成等待的读写 IO 数量 |
iocost_container_average_wait_ms |
容器 IO 的平均等待时间,单位毫秒 |
这些区间 Gauge 按 disk(如 sda、nvme0n1)和 operation
(read、write)分组。scope=host 表示设备总量,包含所有
容器;scope=other 表示其中未归属容器的部分。
容器发现可选,宿主机采集不依赖 kubelet。容器查询失败或标签无效时,本轮数据
归入 other;关联恢复后不补报历史数据。临时采集失败后,首次成功采集仅重建
基线,下一次成功采集恢复输出,不补报失败区间。若错误导致采集停止,需排障后
重启 Huatuo。
cgroup 实际释放后,尚未采集的尾部等待增量归入 Host 和 Other,不再关联容器。 两次成功采集之间,同一统计项在单 CPU 上完成至少 67,108,864 次等待,或累计 等待约 274.9 万秒时,计数回绕可能导致少计。例如,同一统计项的 10,240 次等待 各持续 270 秒、在同一区间由同一 CPU 结算,会超出等待时间容量。
采集需要支持 IOCOST 的非 PREEMPT_RT Linux 内核,具备 BPF/BTF 和 kprobe 能力。
io_health 记录以下事件:
| 事件类型 | 触发条件 |
|---|---|
block_error |
普通 block 请求完成时返回错误 |
nvme_timeout |
NVMe 请求超时 |
nvme_reset |
NVMe 控制器已接纳重置请求,不代表重置完成;仅记录事件,不触发取证 |
nvme_state_change |
NVMe controller 状态发生变化 |
scsi_timeout |
SCSI command 超时 |
scsi_dispatch_error |
SCSI command 派发失败 |
md_sync_action |
MD 同步动作发生变化 |
md_degraded |
MD 不可用成员数发生变化 |
md_member_state |
MD 成员状态发生变化或成员消失 |
NVMe 状态名不可用时,new_state 为 unknown,new_state_raw 保留状态码。
block 错误、NVMe 超时、SCSI 异常及 MD 成员进入 faulty、blocked、
write_error 或 removed 状态会触发只读健康取证:NVMe 使用 nvme-cli,
SCSI 使用 smartctl,结果随事件保存。无法唯一确定目标时仅保留事件,不扫描
其他设备。MD 监测不需要 mdadm。
事件中的 device 可保留 MD 成员的分区名;取证目标归整为唯一物理磁盘或
NVMe controller。
同设备取证执行中及结束后的 60 秒冷却期内不重复取证,原始事件仍独立保存。
huatuo_bamai_io_health_ Counter 记录进程启动后观察到的事件:
| 指标后缀 | 标签 | 含义 |
|---|---|---|
block_errors_total |
disk、operation、status | block 层错误次数 |
nvme_timeouts_total |
disk | NVMe timeout 次数 |
nvme_resets_total |
disk | NVMe 已接纳的重置请求次数 |
scsi_timeouts_total |
disk | SCSI timeout 次数 |
scsi_dispatch_errors_total |
disk、status | SCSI 派发失败次数 |
collection_errors_total |
disk、reason | 健康取证失败次数 |
event_persistence_failures_total |
reason | 事件保存返回错误的次数 |
MD 和 NVMe controller 状态变化以事件保存,不提供当前状态 Gauge。
Counter 先于事件保存更新;保存失败计入
event_persistence_failures_total{reason="save_error"}。
健康事件单独保存为文档,不可获得或不适用的可选字段省略:
| 字段 | 含义 |
|---|---|
type |
事件类型 |
device |
事件设备名;MD 成员事件可保留分区名 |
array、member |
MD 阵列和成员名 |
old_state、new_state |
MD 状态变化;NVMe 仅提供新状态 |
new_state_raw |
NVMe controller 状态码 |
operation、io_error_status、sector |
block 操作、错误及起始扇区 |
collection_status |
ok、partial、unsupported、timeout 或 error |
nvme、scsi |
事件触发后采集的协议健康证据 |
NVMe 证据包括 critical_warning、media_errors_total,以及最多八条包含
状态码、NSID 和 LBA 的错误日志。SCSI 证据包括整体健康状态、ASC/ASCQ、温度、
缺陷数量、读/写/校验错误计数,以及待处理缺陷数量和最多八个示例 LBA。
diskio 读取 /proc/diskstats 和 /proc/stat,提供设备级请求数、吞吐量、累计耗时和宿主机 CPU iowait。
磁盘名标签由 device 改为 disk,自定义查询的筛选和图例需同步更新;
指标名称和类型不变。
仓库配置默认通过 BlackList 禁用 diskio。从黑名单移除并重启 huatuo-bamai 服务后启用。
请求数、字节数和 I/O 耗时为累计 Counter,可用 rate() 计算 IOPS、吞吐量和耗时增长速率。平均请求耗时为耗时增长速率除以请求速率,计算时需排除请求速率为零的区间。io_in_progress 和 disk_iowait_percent 为 Gauge。
| 指标 | 说明 | 单位 | 范围 | 附加标签 |
|---|---|---|---|---|
diskio_read_requests_total |
累积读请求完成数,使用 rate() 计算读 IOPS |
计数 | 宿主机 | disk |
diskio_write_requests_total |
累积写请求完成数,使用 rate() 计算写 IOPS |
计数 | 宿主机 | disk |
diskio_read_bytes_total |
累积读取字节数,使用 rate() 计算读吞吐量 |
字节 | 宿主机 | disk |
diskio_written_bytes_total |
累积写入字节数,使用 rate() 计算写吞吐量 |
字节 | 宿主机 | disk |
diskio_read_time_seconds_total |
已完成读请求的累积耗时 | 秒 | 宿主机 | disk |
diskio_write_time_seconds_total |
已完成写请求的累积耗时 | 秒 | 宿主机 | disk |
diskio_io_in_progress |
当前正在进行的 I/O 请求数,即队列深度 | 计数 | 宿主机 | disk |
diskio_disk_iowait_percent |
采集区间内 CPU 等待 I/O 完成的时间占比 | % | 宿主机 | — |
xfs 从 sysfs 采集宿主机各设备的统计,附加标签为 device。xfs_log_free_bytes 为 Gauge,名称以 _total 结尾的指标为累计 Counter。
| 指标 | 说明 | 单位 |
|---|---|---|
xfs_log_free_bytes |
日志剩余可用空间 | 字节 |
xfs_log_space_sleep_total |
等待日志空间的累计次数 | 计数 |
xfs_alloc_blocks_total |
累计分配块数 | 块 |
xfs_alloc_extents_total |
累计分配 extent 数 | 计数 |
xfs_inode_attempts_total |
inode 缓存累计请求数 | 计数 |
xfs_inode_missed_total |
inode 缓存累计未命中次数 | 计数 |
xfs_buf_busy_locked_total |
缓冲区忙锁事件累计次数 | 计数 |
xfs_buf_locked_waited_total |
等待缓冲区锁的累计次数 | 计数 |
无法获取日志可用空间时不输出 xfs_log_free_bytes。新增 XFS 挂载后需重启 huatuo-bamai 服务。
记录内核检测到的 soft lockup 事件。
| 指标 | 说明 | 单位 | 范围 | 来源 | 附加标签 |
|---|---|---|---|---|---|
softlockup_total |
系统 softlockup 事件计数 | 计数 | 宿主机 | eBPF | — |
记录内核检测到的 hung task 事件。
| 指标 | 说明 | 单位 | 范围 | 来源 | 附加标签 |
|---|---|---|---|---|---|
hungtask_total |
系统 hungtask 事件计数 | 计数 | 宿主机 | eBPF | — |
| 指标 | 意义 | 单位 | 对象 | 取值 | 标签 |
|---|---|---|---|---|---|
| hungtask_container_total | 已归属容器的阻塞任务事件计数 | 计数 | 容器 | BPF + CSS 缓存 | container_host, container_hostnamespace, container_level, container_name, container_type, host, region |
容器计数包含在主机 Counter 中,不受追踪退避影响。容器归属无法解析的事件仍计入主机总量。容器退出后清理其计数,agent 重启后归零;同一阻塞任务重复上报按多次事件计数。
仓库配置默认通过 BlackList 禁用 metax_gpu,启用前需满足对应设备和 SDK 依赖。
| 指标 | 说明 | 单位 | 附加标签 |
|---|---|---|---|
metax_gpu_sdk_info |
GPU SDK 信息 | — | version |
metax_gpu_driver_info |
GPU 驱动信息 | — | version |
metax_gpu_info |
GPU 基本信息 | — | gpu, model, uuid, bios_version, bdf, mode, die_count |
metax_gpu_board_power_watts |
GPU 板级功耗 | W | gpu |
metax_gpu_pcie_link_speed_gt_per_second |
GPU PCIe 当前链路速率 | GT/s | gpu |
metax_gpu_pcie_link_width_lanes |
GPU PCIe 当前链路宽度 | 通道数 | gpu |
metax_gpu_pcie_receive_bytes_per_second |
GPU PCIe 接收吞吐率 | B/s | gpu |
metax_gpu_pcie_transmit_bytes_per_second |
GPU PCIe 发送吞吐率 | B/s | gpu |
metax_gpu_metaxlink_link_speed_gt_per_second |
GPU MetaXLink 当前链路速率 | GT/s | gpu, metaxlink |
metax_gpu_metaxlink_link_width_lanes |
GPU MetaXLink 当前链路宽度 | 通道数 | gpu, metaxlink |
metax_gpu_metaxlink_receive_bytes_per_second |
GPU MetaXLink 接收吞吐率 | B/s | gpu, metaxlink |
metax_gpu_metaxlink_transmit_bytes_per_second |
GPU MetaXLink 发送吞吐率 | B/s | gpu, metaxlink |
metax_gpu_metaxlink_receive_bytes_total |
GPU MetaXLink 接收数据总量 | 字节 | gpu, metaxlink |
metax_gpu_metaxlink_transmit_bytes_total |
GPU MetaXLink 发送数据总量 | 字节 | gpu, metaxlink |
metax_gpu_metaxlink_aer_errors_total |
GPU MetaXLink AER 错误次数 | 计数 | gpu, metaxlink, error_type |
metax_gpu_status |
GPU 状态 | — | gpu, die |
metax_gpu_temperature_celsius |
GPU 温度 | °C | gpu, die |
metax_gpu_utilization_percent |
GPU 利用率(0–100) | % | gpu, die, ip |
metax_gpu_memory_total_bytes |
显存总容量 | 字节 | gpu, die |
metax_gpu_memory_used_bytes |
已使用显存容量 | 字节 | gpu, die |
metax_gpu_clock_mhz |
GPU 时钟频率 | MHz | gpu, die, ip |
metax_gpu_clocks_throttling |
GPU 时钟降频原因 | — | gpu, die, reason |
metax_gpu_dpm_performance_level |
GPU DPM 性能等级 | — | gpu, die, ip |
metax_gpu_ecc_memory_errors_total |
GPU ECC 内存错误次数 | 计数 | gpu, die, memory_type, error_type |
metax_gpu_ecc_memory_retired_pages_total |
GPU ECC 内存退役页数 | 计数 | gpu, die |
摩尔线程 GPU 采集依赖 MTML 管理库,启动时依次查找 libmtml.so.2、libmtml.so。
从 BlackList 移除 mthreads_gpu 并重启 huatuo-bamai 服务后启用。MetricCollector.Mthreads 中的 EnableHealth、EnablePCIe、EnableMTLink 控制对应指标组。
| 指标 | 说明 | 单位 | 附加标签 |
|---|---|---|---|
mthreads_gpu_library_info |
MTML 库信息 | — | version |
mthreads_gpu_device_info |
GPU 信息 | — | gpu, name, brand, serial |
mthreads_gpu_device_pci_info |
GPU PCI 信息 | — | gpu, sbdf |
mthreads_gpu_device_spec |
GPU 规格 | — | gpu, cores |
mthreads_gpu_device_bios_version |
GPU BIOS 版本 | — | gpu, bios |
mthreads_gpu_device_musa_capability |
GPU MUSA 计算能力 | — | gpu, musa_capability |
mthreads_gpu_memory_info |
GPU 内存信息 | — | gpu, type, vendor, bus_width |
mthreads_gpu_pcie_link_max_speed_gt_per_sec |
GPU PCIe 最大链路速率(硬件能力) | GT/s | gpu |
mthreads_gpu_pcie_link_max_width_lanes |
GPU PCIe 最大链路宽度(硬件能力) | 通道数 | gpu |
mthreads_gpu_device_power_watts |
GPU 设备功耗 | W | gpu |
mthreads_gpu_gpu_temperature_celsius |
GPU 温度 | °C | gpu |
mthreads_gpu_memory_temperature_celsius |
GPU 内存温度 | °C | gpu |
mthreads_gpu_gpu_utilization_percent |
GPU 利用率(0-100) | % | gpu |
mthreads_gpu_memory_utilization_percent |
GPU 内存利用率(0-100) | % | gpu |
mthreads_gpu_memory_total_bytes |
GPU 总内存 | 字节 | gpu |
mthreads_gpu_memory_used_bytes |
GPU 已使用内存 | 字节 | gpu |
mthreads_gpu_gpu_clock_mhz |
GPU 时钟频率 | MHz | gpu |
mthreads_gpu_gpu_max_clock_mhz |
GPU 最大时钟频率 | MHz | gpu |
mthreads_gpu_memory_clock_mhz |
GPU 内存时钟频率 | MHz | gpu |
mthreads_gpu_memory_max_clock_mhz |
GPU 内存最大时钟频率 | MHz | gpu |
mthreads_gpu_gpu_voltage_volts |
GPU 电压 | V | gpu |
mthreads_gpu_gpu_power_limit_watts |
GPU 强制功耗限制 | W | gpu |
mthreads_gpu_gpu_power_default_limit_watts |
GPU 默认功耗管理限制 | W | gpu |
mthreads_gpu_fan_rpm |
GPU 风扇转速 | RPM | gpu, fan |
mthreads_gpu_fan_speed_percent |
GPU 风扇速度百分比 | % | gpu, fan |
mthreads_gpu_gpu_pstate |
GPU 性能状态(0=P0) | — | gpu |
mthreads_gpu_vpu_utilization_percent |
GPU VPU 利用率(0-100) | % | gpu |
mthreads_gpu_vpu_encoder_utilization_percent |
GPU VPU 编码器利用率(0-100) | % | gpu |
mthreads_gpu_vpu_decoder_utilization_percent |
GPU VPU 解码器利用率(0-100) | % | gpu |
mthreads_gpu_vpu_clock_mhz |
GPU VPU 时钟频率 | MHz | gpu |
mthreads_gpu_pcie_link_speed_gt_per_sec |
GPU PCIe 当前链路速率 | GT/s | gpu |
mthreads_gpu_pcie_link_width_lanes |
GPU PCIe 当前链路宽度 | 通道数 | gpu |
mthreads_gpu_pcie_replay_total |
GPU PCIe 重放计数器 | 计数 | gpu |
mthreads_gpu_mtlink_state |
GPU MtLink 状态(0=DOWN,1=UP,2=DOWNGRADE) | — | gpu, link |
mthreads_gpu_mtlink_link_bandwidth_gb_s |
GPU MtLink 每链路最大带宽(设备静态规格,非实时吞吐) | GB/s | gpu |
mthreads_gpu_mtlink_link_count |
GPU MtLink 最大支持链路数(设备静态规格) | 链路数 | gpu |
本文说明自动追踪记录的字段、单位和示例。适用场景见自动追踪,配置节和参数见节点配置。下文阈值为内置默认值,配置文件可覆盖。
自动追踪事件按已启用的存储配置写入 Elasticsearch 或本地文件。可通过 tracer_type=autotracing、tracer_name、主机或容器标识及时间范围筛选。下列 JSON 为说明字段结构的示例,并非实测结果。
CPU 示例使用 perf。使用 profiler 时,事件保留触发指标,profile 独立存入 Elasticsearch,并与事件共用 tracer_id。存储要求与查看方式见节点配置。
记录包含以下公共字段;容器字段仅在关联到容器时提供。
| 字段 | 说明 |
|---|---|
hostname |
节点主机名 |
region |
节点所属区域 |
uploaded_timestamp |
数据上传时间 |
container_id |
容器 ID |
container_hostname |
容器主机名 |
container_host_namespace |
容器的 Kubernetes 命名空间 |
container_type |
容器类型 |
container_qos |
容器 QoS 级别 |
tracer_name |
事件名称(如 cpusys、memburst 等) |
tracer_id |
本次追踪 ID |
started_timestamp |
开始追踪的时间 |
tracer_type |
观测类型,自动追踪记录固定为 autotracing |
tracer_data |
特定事件私有数据(详见各事件说明) |
追踪器:cpusys。通过 AutoTracing.CPUSys.Tool 选择 perf(默认)或 profiler。
周期性读取 /proc/stat,检测宿主机 system、user(user + nice)和总执行 CPU(user + nice + system + irq + softirq)突增,包含容器工作。任一组使用率及其增量同时严格超过阈值时触发采样。默认使用率/增量阈值分别为 system 45%/20 个百分点、user 75%/45 个百分点、total 90%/55 个百分点。
三组共用一次采集和默认 30 分钟冷却。阈值在 CPUSys 下独立配置,不与 CPUIdle 共用,见配置参考。事件保留原 system 字段,并增加对应的 user_percent*、total_percent* 字段;零值新增字段省略。
示例(省略部分公共字段):
{
"tracer_name": "cpusys",
"tracer_data": {
"system_percent": 52,
"system_percent_threshold": 45,
"system_percent_delta": 25,
"system_percent_delta_threshold": 20,
"flamedata": [
{"level": 0, "value": 1000, "self": 0, "label": "all"},
{"level": 1, "value": 350, "self": 350, "label": "do_syscall_64"}
]
}
}
| 字段 | 说明 |
|---|---|
system_percent |
触发时宿主机 CPU 系统态占用率(%) |
system_percent_threshold |
系统态占用率触发阈值(%) |
system_percent_delta |
相邻两次采样的系统态占用率增量(百分点) |
system_percent_delta_threshold |
系统态增量触发阈值(百分点) |
flamedata |
perf:火焰图帧列表,帧字段见下文;profiler:null,通过事件的 tracer_id 查询独立存储的 profile |
flamedata.level |
调用栈层级深度 |
flamedata.value |
该帧(含子帧)的采样计数 |
flamedata.self |
该帧自身(不含子帧)的采样计数 |
flamedata.label |
函数或进程名称标签 |
追踪器:cpuidle。通过 AutoTracing.CPUIdle.Tool 选择 perf(默认)或 profiler。
周期性读取容器 cgroup CPU 统计。用户态、系统态或总占用率中的任一项同时超过占用率阈值和相邻采样增量阈值时,触发容器级 CPU 采样。
同一容器默认冷却 30 分钟,目标范围由 AutoTracing.CPUIdle.Filter 控制。内置默认阈值如下:
| 指标 | 占用率阈值 | 增量阈值 |
|---|---|---|
| 用户态 | 75% | 45 个百分点 |
| 系统态 | 45% | 20 个百分点 |
| 总占用率 | 90% | 55 个百分点 |
示例(省略部分公共字段):
{
"tracer_name": "cpuidle",
"tracer_data": {
"user_percent": 80,
"user_percent_threshold": 75,
"user_percent_delta": 48,
"user_percent_delta_threshold": 45,
"system_percent": 12,
"system_percent_threshold": 45,
"system_percent_delta": 5,
"system_percent_delta_threshold": 20,
"total_percent": 92,
"total_percent_threshold": 90,
"total_percent_delta": 53,
"total_percent_delta_threshold": 55,
"flamedata": [
{"level": 0, "value": 1000, "self": 0, "label": "all"},
{"level": 1, "value": 800, "self": 800, "label": "java/com.example.App.main"}
]
}
}
| 字段 | 说明 |
|---|---|
user_percent / user_percent_threshold |
触发时容器 CPU 用户态占用率(%)及其阈值 |
user_percent_delta / user_percent_delta_threshold |
用户态占用率增量(百分点)及其阈值 |
system_percent / system_percent_threshold |
触发时容器 CPU 系统态占用率(%)及其阈值 |
system_percent_delta / system_percent_delta_threshold |
系统态占用率增量(百分点)及其阈值 |
total_percent / total_percent_threshold |
触发时容器 CPU 总占用率(%)及其阈值 |
total_percent_delta / total_percent_delta_threshold |
总占用率增量(百分点)及其阈值 |
flamedata |
perf:容器火焰图帧列表,帧字段同 cpusys;profiler:null,通过事件的 tracer_id 查询独立存储的 profile |
追踪器:dload。
通过 netlink 及 cgroup 读取容器内进程状态,计算不可中断(D 状态)进程负载的指数加权移动平均值(EMA)。EMA 超过阈值(默认 5)时触发,同一容器默认冷却 30 分钟。
结果包含容器及宿主机 D 状态进程的内核栈,通过 AutoTracing.IssuesList 标记已知问题。
示例(省略部分公共字段):
{
"tracer_name": "dload",
"tracer_data": {
"threshold": 5,
"nr_sleeping": 120,
"nr_running": 4,
"nr_stopped": 0,
"nr_uninterruptible": 8,
"nr_iowait": 3,
"load_avg": 7.23,
"dload_avg": 6.81,
"known_issue": "",
"stack": "task:java state:D stack: 0 pid: 12345 tgid: 12345 ...\n io_schedule+0x18/0x40\n ext4_file_write_iter+0x..."
}
}
| 字段 | 说明 |
|---|---|
threshold |
D 状态负载 EMA 触发阈值 |
nr_sleeping |
容器内睡眠状态进程数 |
nr_running |
容器内运行状态进程数 |
nr_stopped |
容器内停止状态进程数 |
nr_uninterruptible |
容器内不可中断(D 状态)进程数 |
nr_iowait |
容器内 I/O 等待状态进程数 |
load_avg |
触发时容器负载均值 |
dload_avg |
触发时容器 D 状态负载 EMA 值 |
known_issue |
命中的已知问题描述(为空表示未命中) |
stack |
D 状态进程的内核调用栈(多进程多行文本) |
追踪器:iotracing。
每 5 秒读取 /proc/diskstats。触发条件需连续两个采样周期成立:非 NVMe 设备检查利用率;NVMe 设备要求利用率和读、写吞吐率之一同时超阈值;各设备也会独立检查读、写平均等待时间。采集结果包含进程及文件 I/O 速率、I/O 调度等待栈。
直接运行 iotracing 时,可通过 --enable-pprof(默认关闭)在 http://127.0.0.1:6000/debug/pprof/ 提供 profile;若地址已被占用,命令启动失败。这些 profile 仅反映 iotracing 进程自身的 Go runtime,不包含 huatuo-bamai 或执行磁盘 I/O 的业务进程。自动追踪不会开启此选项。
示例(省略部分公共字段):
{
"tracer_name": "iotracing",
"tracer_data": {
"reason_snapshot": {
"type": "ioutil",
"device": "sda",
"major_num": 8,
"minor_num": 0,
"iostatus": {
"read_bps": 125829120,
"read_iops": 450,
"read_await": 12,
"write_bps": 2202009600,
"write_iops": 890,
"write_await": 145,
"io_util": 95,
"queue_size": 32
}
},
"process_file_io_stats": [
{
"pid": 12345,
"comm": "java",
"container_hostname": "app-pod-xxx",
"total_fs_read_bps": 0,
"total_fs_write_bps": 52428800,
"total_disk_read_bps": 0,
"total_disk_write_bps": 49152000,
"total_files": [
{
"path": "/data/logs/app.log",
"dev_name": "sda",
"fs_write_bps": 52428800,
"disk_write_bps": 49152000
}
],
"total_file_count": 1
}
],
"io_schedule_timeout_stacks": [
{
"pid": 12345,
"tid": 12346,
"cpu": 2,
"comm": "java",
"container_hostname": "app-pod-xxx",
"schedule_latency_us": 250000,
"stack": [
"io_schedule+0x18/0x40",
"ext4_file_write_iter+0x2a0/0x4c0"
]
}
]
}
}
| 字段 | 说明 |
|---|---|
reason_snapshot |
触发原因、设备及当时的磁盘指标;type 为 ioutil、read_bps、write_bps、read_await 或 write_await |
reason_snapshot.iostatus |
*_bps 为字节/秒,*_iops 为次/秒,*_await 为毫秒,io_util 为百分比,queue_size 为平均队列深度 |
process_file_io_stats |
按进程汇总采集窗口内的文件 I/O,包含 PID、进程名和容器主机名 |
total_fs_read_bps / total_fs_write_bps |
文件系统读、写速率(字节/秒) |
total_disk_read_bps / total_disk_write_bps |
磁盘读、写速率(字节/秒) |
total_files / total_file_count |
采集窗口内访问的文件明细子集及未截断的文件总数;文件明细中的 *_bps 为字节/秒,*_us 为微秒 |
io_schedule_timeout_stacks |
I/O 调度等待事件,包含 PID、TID、CPU、进程名和容器主机名 |
schedule_latency_us / stack |
I/O 调度等待时长(微秒)与内核栈帧列表 |
追踪器:memburst。
默认每 10 秒采样一次宿主机匿名内存,填满 60 个采样点的滑动窗口后开始判断。当前匿名内存达到窗口最早值的 2 倍,且占宿主机总内存至少 70% 时触发;默认冷却时间为 30 分钟。
结果按 RSS 降序记录前 N 个进程(默认 10 个),并依次尝试为排名前 min(N, 3) 个进程采集运行时快照。Go、HotSpot 和 CPython 使用对应采集器;不支持的运行时返回 unavailable,并在可用时保留进程内存计数。采集失败不代表内存使用为零。
每个进程的采集预算为 2 秒,每份快照最多保留 10 条内存对象记录,JSON 上限为 512 KiB。超时为协作式,不能中断正在执行的同步系统调用,因此不保证在 2 秒内返回。
整个 tracer_data 上限为 2 MiB,落盘排名最多 1,000 条。超限时先移除排名靠后的快照,再按需裁剪基础排名尾部,并设置 snapshot_reason;取消或降级记录也遵循这些限制。
示例(省略部分公共字段):
{
"tracer_name": "memburst",
"tracer_data": {
"top_memory_usage": [
{
"PID": 3456,
"ProcessName": "go-service",
"MemSize": 268435456
}
],
"process_snapshots": [
{
"pid": 3456,
"process_name": "go-service",
"language": "go",
"snapshot": {
"runtime_version": "go1.24.0",
"status": "complete",
"duration_ms": 25,
"entries": [
{
"kind": "inuse_space_objects",
"name": "main.allocate",
"bytes": 1048576,
"objects": 16,
"stack": [
"main.allocate fixture.go:42"
]
}
]
},
"process_memory": {
"status": "complete",
"rss_bytes": 268435456,
"rss_anon_bytes": 260046848
}
}
]
}
}
| 字段 | 说明 |
|---|---|
top_memory_usage |
按 RSS 降序排列的进程列表 |
top_memory_usage.PID |
进程 PID |
top_memory_usage.ProcessName |
进程名称 |
top_memory_usage.MemSize |
进程 RSS(字节) |
process_snapshots |
可选,按排名顺序记录进程快照;每项包含 pid、process_name、language、snapshot 和可选的 process_memory |
snapshot_reason |
可选,说明取消、队列满或整体事件裁剪;单进程失败原因见 snapshot.status_reason |
snapshot 字段:
| 字段 | 说明 |
|---|---|
runtime_version |
可选,目标运行时版本 |
status / status_reason |
状态及可选的原因说明;状态为 complete、partial、unavailable 或 failed |
duration_ms |
采集耗时(毫秒) |
output_truncated |
可选,表示快照输出被裁剪 |
entries |
可选,内存对象排序条目列表 |
entries.kind / entries.name |
条目类型和名称,含义取决于运行时 |
entries.bytes / entries.objects |
条目内存量(字节)和对象数 |
entries.average_bytes / entries.stack |
可选,平均对象大小(字节)和调用栈 |
process_memory 是与语言无关的进程内存计数,使用 status 和可选的 status_reason 表示可用性。以下字段均为可选,缺失表示不可用,不表示零:
| 字段 | 含义(单位:字节) |
|---|---|
virtual_bytes / rss_bytes |
虚拟内存 / RSS |
rss_anon_bytes / rss_file_bytes / rss_shmem_bytes |
RSS 中的匿名页 / 文件页 / 共享内存 |
swap_bytes / page_table_bytes |
交换空间 / 页表内存 |
本文说明异常事件的记录结构、字段和适用限制。功能介绍见异常事件诊断,采集设置见节点配置。
结果按已启用的存储配置写入 Elasticsearch 或本地文件。查询时按 tracer_type=event、事件名称、主机或容器及时间范围筛选。下列 JSON 为结构示例,省略部分公共字段;其中阈值说明使用内置默认值。
容器字段仅在关联到容器时提供;具体事件数据位于 tracer_data。
| 字段 | 说明 |
|---|---|
hostname |
节点主机名 |
region |
节点所属区域 |
uploaded_timestamp |
数据上传时间 |
container_id |
容器 ID |
container_hostname |
容器主机名 |
container_host_namespace |
容器的 Kubernetes 命名空间 |
container_type |
容器类型,例如 normal 普通容器,sidecar 边车容器等 |
container_qos |
容器 QoS 级别 |
tracer_name |
事件名称(如 sched_tick、memory_oom_kill 等) |
tracer_id |
本次追踪 ID |
observed_timestamp |
用户态观测时间 |
tracer_type |
观测类型,即时事件记录固定为 event |
tracer_data |
特定事件私有数据(详见各事件说明) |
观测器:sched_tick。
检测相邻调度 tick 的总间隔;间隔达到阈值时记录当前内核调用栈和进程信息。该事件可发现 IRQ 长时间关闭、CPU 停顿或虚拟化调度延迟等问题,但不能单独证明软中断被禁用。comm 和 pid 表示上报 tick 所中断的任务,不表示造成延迟的任务。
适用场景
使用边界
成功进入 NO_HZ 的正常停 tick 会被过滤。普通 CPU 高负载或 softirq backlog 本身不等同于 tick 延迟。
阈值应高于目标机器的正常 tick 周期;事件栈仅表示延迟结束后首个 tick 的现场,需要结合 IRQ、steal time 和硬件指标定位根因。
示例(省略部分公共字段):
{
"uploaded_timestamp": "2025-06-11T16:05:16.251152703+08:00",
"hostname": "***",
"tracer_data": {
"tick_interval_ns": 237328905,
"tick_interval_threshold_ns": 10000000,
"comm": "***-agent",
"pid": 688073,
"cpu": 1,
"stack": "scheduler_tick/..."
},
"observed_timestamp": "2025-06-11T16:05:16.251+08:00",
"tracer_type": "event",
"region": "***",
"tracer_name": "sched_tick"
}
| 字段 | 说明 |
|---|---|
comm |
上报 tick 所中断任务的进程名称 |
stack |
延迟结束后的首个调度 tick 上采集的内核调用栈 |
tick_interval_ns |
相邻调度 tick 的总间隔(纳秒) |
cpu |
发生事件的 CPU 编号 |
tick_interval_threshold_ns |
调度 tick 间隔阈值(纳秒),达到该值则记录事件 |
pid |
上报 tick 所中断任务的进程 ID |
观测器:softlockup。
记录内核报告 softlockup 时的进程、CPU 和 NMI 回溯信息;这些信息不能单独确定致因进程。触发时间由内核 watchdog 配置决定。
重复事件的上报间隔从 10 分钟递增至最长 3 小时,期间仍累计事件计数。
示例(省略部分公共字段):
{
"tracer_data": {
"cpu": 15,
"pid": 12345,
"comm": "kworker/15:0",
"cpus_stack": "2025-06-10 14:30:22 sysrq: Show backtrace of all active CPUs\nNMI backtrace for cpu 15\n..."
}
}
| 字段 | 说明 |
|---|---|
cpu |
发生 softlockup 的 CPU 编号 |
pid |
报告 softlockup 时的进程 PID |
comm |
报告 softlockup 时的进程名称 |
cpus_stack |
所有 CPU 的 NMI 回溯信息(多行文本,包含时间戳和调用栈) |
观测器:hungtask。
可识别容器的 hungtask 事件附带容器 ID,否则保留主机输出;诊断堆栈仍为全机范围。计数说明见 HungTask 指标。
检测系统 hungtask 事件,采集 D 状态(不可中断睡眠)进程的内核栈及 CPU 回溯信息。重复事件的上报间隔从 10 分钟递增至最长 3 小时,期间仍累计事件计数。内核未提供 hung_task_timeout_secs 时不注册观测器;将该值设为 0 会禁用内核 hungtask 检测。
示例(省略部分公共字段):
{
"tracer_data": {
"tid": 2567042,
"comm": "kworker/u48:2",
"cpus_stack": "2025-06-10 09:57:14 sysrq: Show backtrace of all active CPUs\nNMI backtrace for cpu 33\n...",
"blocked_processes_stack": "task:java state:D stack: 0 pid: 12345 ..."
}
}
| 字段 | 说明 |
|---|---|
tid |
触发 hungtask 检测的任务 TID |
comm |
触发 hungtask 检测的任务名称 |
cpus_stack |
所有 CPU 的 NMI 回溯信息(多行文本,包含时间戳和调用栈) |
blocked_processes_stack |
D 状态进程的内核栈信息 |
hung_task_timeout_secs |
内核 hungtask 检测超时设置,单位为秒 |
观测器:memory_oom_kill。
记录 OOM Killer 的触发进程(trigger)与被终止进程(victim),以及可获取的容器、cgroup 和宿主机内存信息。触发进程不一定是主要内存消耗者,需结合使用量和内存限制分析。
示例(省略部分字段):
{
"tracer_name": "memory_oom_kill",
"tracer_data": {
"trigger": {
"memory_cgroup_css_addr": "0xff4b8d8be3818000",
"container_id": "example-container",
"container_hostname": "app-pod",
"pid": 3218804,
"comm": "java"
},
"victim": {
"memory_cgroup_css_addr": "0xff4b8d8be3818000",
"container_id": "example-container",
"container_hostname": "app-pod",
"pid": 3218745,
"comm": "java",
"cgroup": {
"path": "kubepods.slice/...",
"current": 2143289344,
"max": 2147483648,
"stat": {
"anon": 1509949440,
"file": 83886080
},
"events": {
"oom": 1,
"oom_kill": 1
}
}
},
"memory_snapshot": {
"host_meminfo": {
"MemAvailable": 3355443200,
"Cached": 1073741824,
"Slab": 268435456
}
}
}
}
| 字段 | 说明 |
|---|---|
trigger / victim |
触发进程与被终止进程,均使用下列进程字段 |
pid / comm |
PID 与进程命令名 |
container_id / container_hostname |
关联到的容器 ID 与主机名;未关联时省略 |
memory_cgroup_css_addr |
memory cgroup 指针的十六进制表示 |
cgroup.path |
容器 cgroup 路径 |
cgroup.current / cgroup.max |
读取快照时的内存使用量与上限,单位为字节 |
cgroup.stat / cgroup.events |
原始 cgroup 内存统计与事件计数;字段依 cgroup 版本而异 |
memory_snapshot.host_meminfo |
宿主机 /proc/meminfo 选定字段,统一转换为字节 |
cgroup 位于 trigger 或 victim 内,仅在容器关联和快照读取成功时提供。宿主机快照也可能缺失;这些信息在用户态读取,并非与 OOM 发生时刻严格同步。
观测器:memory_reclaim_events。
记录线程单次直接内存回收的耗时。try_to_free_pages 返回时,若本次调用超过阈值(默认 900 毫秒),则上报进程、线程和容器信息。未解析到容器的事件保留到主机事件流。黑名单使用注册名 memory_reclaim_events,落盘记录的 tracer_name 为 memory_reclaim。
示例(省略部分公共字段):
{
"tracer_name": "memory_reclaim",
"tracer_data": {
"pid": 1896137,
"tid": 1896138,
"comm": "java",
"reclaim_duration_ns": 1412702917
}
}
| 字段 | 说明 |
|---|---|
comm |
触发直接内存回收的进程名称 |
pid |
触发进程的 PID |
tid |
触发线程的 TID |
reclaim_duration_ns |
直接回收耗时(纳秒) |
容器 ID 为空可能表示主机任务或容器归属未解析。已归属容器事件不重复输出到主机流。
观测器:dropwatch。
检测内核网络协议栈中的丢包行为,输出丢包时的内核调用栈、网络五元组、TCP 状态等信息。可通过可选的调用栈过滤器抑制经本机验证的噪声模式。type 字段为兼容 TCP 丢包类型而预留,当前未赋值。
示例(省略部分公共字段):
{
"observed_timestamp": "2026-07-23T02:14:40.304775546Z",
"tracer_data": {
"drop_reason": "SKB_DROP_REASON_NOT_SPECIFIED",
"source": "events",
"comm": "kubelet",
"pid": 1687046,
"net_namespace_cookie": 123456789,
"net_namespace_inum": 402653184,
"netdev_queue_mapping": 3,
"netdev_linkstatus": ["linkStatusUp"],
"netdev_name": "eth0",
"netdev_ifindex": 2,
"packet_eth_proto": "0x0800",
"packet_len_bytes": 1460,
"layers": {
"label": "IPv4/TCP",
"ipv4": {
"saddr": "10.79.68.62",
"daddr": "10.134.72.4",
"protocol": "TCP"
},
"tcp": {
"sport": 8080,
"dport": 49000,
"seq": 1009085774,
"ack_seq": 689410995,
"sk_state": "ESTABLISHED"
}
},
"stack": "kfree_skb/..."
}
}
| 字段 | 说明 |
|---|---|
type |
预留丢包类型,当前未赋值且不会出现在 JSON 中;预留编码为 1(通用丢包)、2(SYN 洪泛)、3(半连接队列溢出)、4(全连接队列溢出) |
drop_reason |
内核数据包丢弃原因 |
source |
事件来源(独立运行 dropwatch 时为 tools,由 huatuo-bamai 启动时为 events) |
comm |
触发丢包的进程名称 |
pid |
进程 ID |
net_namespace_cookie / net_namespace_inum |
用于容器归属解析的网络命名空间值 |
netdev_queue_mapping |
网卡队列索引 |
netdev_linkstatus |
网卡链路状态标志列表 |
netdev_name |
网卡设备名称 |
netdev_ifindex |
网卡接口索引 |
packet_len_bytes |
数据包长度(字节) |
packet_eth_proto |
以太网协议类型的十六进制表示 |
layers.ipv4.saddr / layers.ipv4.daddr |
源 IP 和目的 IP 地址 |
layers.tcp.sport / layers.tcp.dport |
源端口和目的端口 |
layers.tcp.seq / layers.tcp.ack_seq |
TCP 序列号和确认序列号 |
layers.tcp.sk_state |
丢包时 TCP 连接状态 |
stack |
丢包发生时的内核调用栈 |
观测器:net_rx_latency。
记录 TCP 报文从驱动接收点到 __netif_receive_skb、tcp_v4_rcv 和用户态拷贝点的延迟。这三个值均从驱动起算,不是相邻观测点之间的耗时;默认阈值依次为 5、10、115 毫秒。达到对应阈值时记录端点、TCP 状态、序列号及延迟值。
默认排除宿主机网络命名空间,仅观测容器网络。
示例(省略部分公共字段):
{
"observed_timestamp": "2025-06-11T00:00:00Z",
"tracer_data": {
"comm": "nginx",
"pid": 2921092,
"latency_stage": "RX_STAGE_USERCOPY",
"latency_ms": 95973,
"latency_threshold_ms": 115,
"tcp_state": "ESTABLISHED",
"tcp_saddr": "10.156.248.76",
"tcp_daddr": "10.134.72.4",
"tcp_sport": 9213,
"tcp_dport": 49000,
"tcp_seq": 1009085774,
"tcp_ack_seq": 689410995,
"net_namespace_cookie": 123456789,
"net_namespace_inum": 402653184,
"packet_len_bytes": 26064
}
}
| 字段 | 说明 |
|---|---|
comm |
触发事件的进程名称 |
pid |
触发事件的进程 ID |
latency_stage |
延迟发生的阶段(RX_STAGE_NETIF 网卡到内核 / RX_STAGE_TCPV4 驱动到 TCP / RX_STAGE_USERCOPY 驱动到用户态拷贝) |
latency_ms |
实际延迟时间(毫秒) |
latency_threshold_ms |
触发事件的延迟阈值(毫秒) |
tcp_state |
TCP 连接状态(支持所有状态,如 ESTABLISHED、SYN_SENT、FIN_WAIT、TIME_WAIT 等) |
tcp_saddr / tcp_daddr |
源 IP / 目的 IP 地址 |
tcp_sport / tcp_dport |
源端口 / 目的端口 |
tcp_seq / tcp_ack_seq |
TCP 序列号 / 确认序列号 |
net_namespace_cookie |
网络命名空间 cookie(内核 ≥ 5.14 可用,用于高效容器关联) |
net_namespace_inum |
网络命名空间 inum |
packet_len_bytes |
数据包长度(字节) |
观测器:netdev_events。
通过订阅内核 netlink RTM_NEWLINK 消息,检测网卡链路状态标志变化(如 AdminDown、CarrierDown),输出接口名称、链路状态、MAC 地址及驱动信息。观测器启动时会扫描 EventTracing.Netdev.DeviceList 中配置的网卡当前状态作为基线,后续仅上报状态变化事件。
示例(省略部分公共字段):
{
"tracer_data": {
"ifname": "eth1",
"index": 3,
"linkstatus": "linkStatusAdminDown, linkStatusCarrierDown",
"mac": "5c:6f:69:34:dc:72",
"start": false,
"driver": "ixgbe",
"driver_version": "5.1.0-k",
"firmware_version": "3.25 0x80000421 1.2163.0"
}
}
| 字段 | 说明 |
|---|---|
ifname |
网络接口名称(如 eth1) |
index |
接口索引号 |
linkstatus |
链路状态变化描述(可包含多个状态) |
mac |
网卡 MAC 地址 |
start |
启动扫描标记;当前只保存实时变化事件,值为 false |
driver |
网卡驱动名称 |
driver_version |
网卡驱动版本 |
firmware_version |
网卡固件版本 |
观测器:netdev_bonding_lacp。
仅在系统存在 IEEE 802.3ad bonding 接口时启用。LACP(Link Aggregation Control Protocol)状态变化时,读取并记录 /proc/net/bonding/ 下所有 bonding 接口的状态,包括模式、MII 状态、Actor/Partner 协商参数和 Slave 链路状态。
落盘记录的 tracer_name 为 lacp,配置黑名单使用注册名 netdev_bonding_lacp。
示例(省略部分公共字段):
{
"tracer_name": "lacp",
"tracer_data": {
"content": "/proc/net/bonding/bond0\nEthernet Channel Bonding Driver: v4.18.0...\nBonding Mode: IEEE 802.3ad Dynamic link aggregation\nMII Status: down\n..."
}
}
| 字段 | 说明 |
|---|---|
content |
完整的 bonding 接口状态信息(多行文本,包含所有 Slave 的 LACP 协商细节,等同于 /proc/net/bonding/bondX 文件内容) |
观测器:netdev_txqueue_timeout。
检测网卡发送队列超时(TX queue timeout)事件,记录发生超时的队列索引、设备名称和驱动名称,用于排查发送方向的设备、驱动或链路异常。
示例(省略部分公共字段):
{
"tracer_data": {
"queue_index": 3,
"device_name": "eth0",
"driver_name": "ixgbe"
}
}
| 字段 | 说明 |
|---|---|
queue_index |
发生超时的发送队列索引 |
device_name |
网卡设备名称 |
driver_name |
网卡驱动名称 |
OOM kill 追踪器现命名为 memory_oom_kill(此前为 memory_oom,更早为 oom),需同步更新黑名单、事件过滤器和告警查询。
指标前缀现为 huatuo_bamai_memory_oom_kill_,替代 huatuo_bamai_memory_oom_ 及更早的 huatuo_bamai_oom_,需同步更新指标仪表盘和记录规则。
历史事件保留原名称,跨版本查询需匹配这三个名称;内置事件仪表盘已覆盖三者。
本文说明 RAS 指标、事件结构、严重级别和来源字段。采集范围及启用方式见硬件故障诊断。
EventTracing.Ras.MceThrBackoff 控制阈值中断事件的保存间隔。冷却期间仍累计事件数,因此计数增长量不一定等于已保存记录数。
huatuo_bamai_ras_hw_err_total 为接收到的 RAS 事件累计数,按 type 区分 mce、edac、acpi、aer、thr 和 arm_ghes。标签存在不代表当前平台支持对应探针。
huatuo_bamai_ras_hw_err_total{hostname="node-01",region="region-01",type="edac"} 12
以上为示例值。计数单位是事件,并非 EDAC 记录中 err_count 的累加值。网卡硬件丢包及 PFC 指标见内核全景观测,网卡状态变化见异常事件诊断。
按 tracer_name=ras 和 tracer_type=event 查询。下面以 EDAC 为例,省略部分字段:
{
"hostname": "node-01",
"observed_timestamp": "2026-05-11T08:58:47.329Z",
"kernel_observed_timestamp": "2026-05-11T08:58:47.328548319Z",
"tracer_name": "ras",
"tracer_type": "event",
"tracer_data": {
"dev": "MEM",
"event": "EDAC",
"type": "Corrected",
"info": "{\"err_count\":1,\"err_type\":\"Corrected\",\"err_msg\":\"memory read error\",\"label\":\"CPU_SrcID#0_Ha#0_Chan#0_DIMM#0\",\"mc_index\":0,\"addr\":7860269056,\"grain\":128}"
}
}
| 字段 | 说明 |
|---|---|
tracer_data.dev |
设备或部件标识,如 CPU/MEM、MEM、ACPI、PCIe 0000:03:00.0 |
tracer_data.event |
错误来源,见采集范围 |
tracer_data.type |
归一化后的严重级别,见下表 |
tracer_data.info |
包含详细字段的 JSON 字符串,需再次解析;结构取决于事件来源 |
observed_timestamp |
用户态接收事件的时间 |
kernel_observed_timestamp |
内核观测时间转换后的时间戳 |
严重级别用于分类,不等同于恢复成功、业务无影响或必须重启的判断。
type |
含义 | 当前映射 |
|---|---|---|
Corrected |
已纠正 | MCE 无 UC/DEFERRED 标志、EDAC 0、ACPI 1、AER 2、THR |
UncorrectedRecoverable |
未纠正、可恢复类别 | MCE UC、EDAC 1、ACPI 2、AER 0 |
UncorrectedDeferred |
未纠正、延迟处理类别 | MCE DEFERRED、EDAC 2 |
UncorrectedFatal |
未纠正、致命类别 | EDAC 3、ACPI 3、AER 1 |
Info |
信息记录 | EDAC 4、ACPI 0 |
unknown |
无法映射严重级别 | 未识别的原始值或不携带严重级别的来源 |
MCE 同时设置 DEFERRED 和 UC 时,优先归为 UncorrectedDeferred。
以下字段位于解析后的 tracer_data.info 中。
寄存器与 Bank 的含义依 CPU 型号而异,诊断时需结合对应处理器手册。
| 字段 | 说明 |
|---|---|
mcg_cpu_cap / mcg_msr_status |
全局能力寄存器 MCG_CAP 与状态寄存器 MCG_STATUS |
banks_msr_status |
Bank 状态寄存器 MCi_STATUS,包含错误代码及 UC、DEFERRED、ADDRV、MISCV 等标志 |
banks_msr_addr |
MCi_ADDR 错误地址;仅在 ADDRV 有效时解读 |
banks_msr_misc |
MCi_MISC 补充信息;仅在 MISCV 有效时解读 |
mca_synd_msr / mca_ipid_msr |
AMD 综合征与实例 ID 寄存器 |
instr_pointer / code_seg |
指令指针与代码段;指令指针的有效性需结合 MCG_STATUS |
tsc_timestamp |
CPU 时间戳计数器值,不能直接作为 Unix 时间戳 |
walltime |
Unix 时间戳,单位为秒 |
cpu / cpuid / apicid / socketid |
逻辑 CPU、CPUID、APIC ID 和 CPU 插槽编号 |
bank |
Machine Check Bank 编号;部件映射依平台而异 |
cpuvendor |
内核记录的 CPU 厂商编码 |
| 字段 | 说明 |
|---|---|
vector |
中断向量 |
cpu |
逻辑 CPU 编号 |
| 字段 | 说明 |
|---|---|
err_count |
本条事件报告的错误次数 |
err_type / err_msg |
归一化严重级别与错误描述 |
label |
驱动报告的内存位置标签;实际插槽位置需结合机器拓扑确认 |
mc_index |
内存控制器编号,从 0 开始 |
top_layer / mid_layer / low_layer |
驱动定义的内存拓扑层次索引;-1 表示未指定 |
addr |
内核报告的错误地址 |
grain |
地址粒度,单位为字节 |
syndrome |
ECC 综合征值 |
driver |
驱动提供的补充错误信息,不一定是驱动名称 |
| 字段 | 说明 |
|---|---|
severity |
原始严重级别值,当前映射见严重级别表 |
sec_type |
错误段类型 GUID,表示为 16 字节十六进制字符串 |
fru_id / fru_text |
可更换部件标识及描述,是否提供取决于固件 |
data_len |
报告的数据长度,单位为字节 |
raw_data |
十六进制转储;需结合平台和厂商格式解读 |
非标准错误部分(NVDIMM、CXL 以及各厂商自定义载荷)可能超出复制的窗口。raw_data 只包含该错误部分起点之后实际可用的字节:长度会按剩余窗口截断;记录声明的长度有效时,窗口末尾未使用的字节不会作为载荷输出。窗口还要容纳记录固定字段和起点之前的数据,因此它不是每条记录的 raw_data 容量。data_len 仍上报内核记录中的原始长度。偏移和长度都来自内核记录,使用前会先做边界约束,因此畸形事件不会输出窗口之外的字节。
| 字段 | 说明 |
|---|---|
dev_name |
PCIe BDF 地址,如 0000:03:00.0(Domain:Bus:Device.Function) |
err_type |
Corrected、UncorrectedRecoverable、UncorrectedFatal 或 unknown |
err_reason |
AER 状态值对应的错误名称;当前按单一状态值匹配,未匹配时为 unknown |
tlp_header |
TLP 头部的四个十六进制字;头部不可用时为 not available |
错误名称描述上报的现象,不能直接推断为设备损坏。以下列出当前解析器识别的状态值。
| 状态值 | err_reason |
|---|---|
0x00000001 |
Receiver Error |
0x00000040 |
Bad TLP |
0x00000080 |
Bad DLLP |
0x00000100 |
REPLAY_NUM Rollover |
0x00001000 |
Replay Timer Timeout |
0x00002000 |
Advisory Non-Fatal Error |
0x00004000 |
Corrected Internal Error |
0x00008000 |
Header Log Overflow |
| 状态值 | err_reason |
|---|---|
0x00000001 |
Undefined |
0x00000010 |
Data Link Protocol Error |
0x00000020 |
Surprise Down Error |
0x00001000 |
Poisoned TLP |
0x00002000 |
Flow Control Protocol Error |
0x00004000 |
Completion Timeout |
0x00008000 |
Completer Abort |
0x00010000 |
Unexpected Completion |
0x00020000 |
Receiver Overflow |
0x00040000 |
Malformed TLP |
0x00080000 |
ECRC Error |
0x00100000 |
Unsupported Request Error |
0x00200000 |
ACS Violation |
0x00400000 |
Uncorrectable Internal Error |
0x00800000 |
MC Blocked TLP |
0x01000000 |
AtomicOp Egress Blocked |
0x02000000 |
TLP Prefix Blocked Error |
ARM_GHES 记录的严重级别为 unknown;平台可用性限制见采集范围。
| 字段 | 说明 |
|---|---|
mpidr / midr |
十六进制处理器标识;mpidr=0x0 也可能表示内核未提供该值 |
running_state |
running、stopped 或 N/A |
psci_state |
停止状态下的十六进制 PSCI 状态;不适用时为 N/A |
affinity_level |
十进制亲和层级;未提供时为 N/A |
本文列出性能剖析任务的请求、响应和状态约定。首次采集见性能剖析实践。
huatuo-apiserver 通过 /v1/profiling 创建、监督和停止 Profiling Job。每次 HTTP
创建请求都是一次独立执行。Job 持久化在 huatuo-apiserver,Node 只维护内存中的
Operation 和 profiler 进程。
Job 控制不依赖 Elasticsearch;查询原始结果和生成 Dashboard 链接时才要求配置 Elasticsearch。Node 和 Apiserver 必须使用同一索引。
huatuo-apiserver 默认监听 :12740。以下示例使用环境变量统一设置服务地址和 Bearer token:
API_BASE="http://127.0.0.1:12740"
API_TOKEN="REPLACE_WITH_RANDOM_HEX"
每个请求必须在 Authorization 请求头中传入配置的 Bearer token:
Authorization: Bearer REPLACE_WITH_RANDOM_HEX
非管理员用户需要配置 /v1/profiling 和 /v1/profiling/** 权限。权限可带
HTTP 方法前缀,例如 GET /v1/profiling/**。成功响应仅包含 data:
{
"data": {}
}
错误响应包含稳定错误码和可读消息:
{
"error": {
"code": "result_unavailable",
"message": "Job state does not provide a complete Profiling result"
}
}
客户端应根据 error.code 分支处理,不应解析 error.message。
创建任务前,建议先查询服务端支持的剖析类型、语言、CPU 模式、内存模式和运行参数:
curl -sS \
-H "Authorization: Bearer ${API_TOKEN}" \
"${API_BASE}/v1/profiling/capabilities"
data.items 是随版本发布的静态能力表,每项包含:
| 字段 | 说明 |
|---|---|
type |
剖析类型:cpu 或 memory |
language |
目标语言 |
modes |
此类型与语言组合允许的 mode |
supports_binary_match |
是否允许 binary_match_path |
supported_scopes |
允许的 scope |
当前 c、c++ 和 go CPU 剖析支持 oncpu、offcpu,java 和
python 仅支持 oncpu。内存剖析支持以下组合:
| 语言 | mode |
说明 |
|---|---|---|
c、c++、go |
virtual_alloc |
虚拟地址空间分配 |
c、c++、go |
physical_alloc |
物理页分配 |
c、c++、go |
physical_usage |
本次采样跟踪的物理页存活字节数 |
java |
object_alloc |
JVM 对象分配 |
java |
object_usage |
JVM 存活对象 |
POST /v1/profiling 的 JSON 参数如下:
| 参数 | 是否必需 | 说明 |
|---|---|---|
type |
是 | 剖析类型:cpu 或 memory |
language |
是 | 目标进程语言,必须与剖析类型匹配 |
mode |
是 | 能力表为对应类型和语言声明的模式 |
duration_seconds |
是 | 采集时长,单位为秒 |
hostname |
是 | 运行目标进程的节点主机名,用于任务调度 |
scope |
是 | 能力表允许的 host 或 container |
container_id |
container 范围必需 | 目标容器 ID |
binary_match_path |
否 | 能力表允许时使用的可执行文件路径匹配条件 |
即使请求内容相同,每次请求也会创建一个新 Job。超过每节点或进程级活动 Job 配额时返回 HTTP 429。
创建宿主机 Go CPU 剖析任务:
curl -sS -i \
-X POST \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"type": "cpu",
"language": "go",
"mode": "oncpu",
"scope": "host",
"duration_seconds": 60,
"hostname": "node-01"
}' \
"${API_BASE}/v1/profiling"
创建容器内 Java 存活对象剖析任务:
curl -sS -i \
-X POST \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"type": "memory",
"language": "java",
"mode": "object_usage",
"scope": "container",
"duration_seconds": 60,
"container_id": "9f4c2f1a8b7d",
"hostname": "node-01"
}' \
"${API_BASE}/v1/profiling"
创建成功返回 201 Created,Location 响应头指向新任务,响应体包含后续查询所需的任务 ID:
{
"data": {
"request_id": "<profile-job-id>",
"hostname": "node-01",
"duration_seconds": 60,
"scope": "host",
"type": "cpu",
"language": "go",
"mode": "oncpu",
"status": "pending",
"created_at": "2026-08-24T10:00:00Z",
"updated_at": "2026-08-24T10:00:00Z"
}
}
JOB_ID="<profile-job-id>"
任务列表
GET /v1/profiling 支持以下查询参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
limit |
100 |
每页数量,取值范围为 1 到 1000 |
offset |
0 |
起始偏移量,必须大于或等于 0 |
查询最新的 20 个 Profiling Job:
curl -sS -G \
-H "Authorization: Bearer ${API_TOKEN}" \
--data-urlencode "limit=20" \
--data-urlencode "offset=0" \
"${API_BASE}/v1/profiling"
服务端固定只返回 Profiling Job,并按 created_at 倒序排列。data.items
是任务数组,data.limit 和 data.offset 是实际使用的分页参数;
data.has_more 表示是否还有下一页。非管理员只能查看自己创建的任务。
任务详情
GET /v1/profiling/:request_id 返回单个任务:
curl -sS \
-H "Authorization: Bearer ${API_TOKEN}" \
"${API_BASE}/v1/profiling/${JOB_ID}"
任务信息位于 data 字段:
| 字段 | 说明 |
|---|---|
request_id |
后续所有请求使用的 Profiling Job ID |
container_id |
目标容器 ID;宿主机任务不返回该字段 |
hostname |
目标节点主机名 |
duration_seconds |
请求的剖析时长,单位为秒 |
scope |
host 或 container |
type |
cpu 或 memory |
language |
目标进程语言 |
mode |
从能力表中选择的剖析模式 |
binary_match_path |
可执行文件匹配路径;未使用时不返回该字段 |
status |
当前任务状态 |
terminal |
终态详情 {outcome, reason, message};非终态不返回 |
created_at |
任务创建时间 |
updated_at |
Job 状态最后更新时间 |
started_at |
实际开始执行时间;尚未观察到运行时不返回 |
ended_at |
进入终态的时间;运行期间不返回 |
result_url |
完整结果可用时,由单任务详情接口返回的 Dashboard 链接 |
任务状态如下:
| 状态 | 说明 |
|---|---|
pending |
任务已创建,正在等待 Agent 执行 |
running |
Agent 正在采集剖析数据 |
stopping |
停止意图已持久化,正在异步执行停止操作 |
terminal |
任务已结束,具体结果见 terminal.outcome |
terminal.outcome 可取 completed、failed、stopped 或
unknown。failed 时通过 terminal.reason 和 terminal.message 定位原因;
stopped 表示主动停止,结果可能不完整;unknown 表示 Apiserver 无法确认
Operation 最终状态,但持久发布的结果仍可能可用。
operation_lost 和 execution_timed_out 是 terminal.reason 的原因码,不是 Job
状态。其他失败原因包括等待启动或停止超时、Node 不可用、执行容量超过上限、
启动或执行失败、表示 Apiserver 构造的 Node 请求无效的
invalid_node_request,以及协议错误。
GET /v1/profiling/:request_id/raw 仅在持久发布标记仍存在时返回
terminal.outcome 为 completed 或 unknown 的 Job 原始剖析窗口。发布标记
不存在或已经过期时返回 result_not_found。活动状态返回 result_not_ready;
failed 和 stopped 返回
result_unavailable。
数据量可能较大,可以直接保存到文件:
curl -sS \
-H "Authorization: Bearer ${API_TOKEN}" \
-o profile-raw.json \
"${API_BASE}/v1/profiling/${JOB_ID}/raw?limit=100&offset=0"
剖析窗口位于响应体的 data.items 字段;data.limit、data.offset
和 data.has_more 描述分页。每条记录包含 uploaded_timestamp、started_timestamp、
profile_type 和兼容 pprof 的 profile 数据。
已持久发布但内容为空的结果仍返回成功,items 为空数组。显式 limit=0 返回参数
错误;只有未传 limit 才使用默认值。limit 默认值为 20,
最大值为 100。编码后的 Profile 数据超过 64 MiB 时返回
413 result_too_large,调用方应减小 limit 后重试。
火焰图每批读取并合并 100 个窗口,每次请求总上限为 100000 个窗口。一小时每秒产生 一个窗口时,全部 3600 个窗口都会参与合并。超过 100000 个窗口时返回错误,提示缩小 时间范围或过滤条件;查询或合并失败都不返回部分火焰图。原始 Profile 列表仍按 Job 查询,其每页上限不限制完整火焰图的聚合数量。
停止是异步意图,pending、running 或已经处于 stopping 的 Job 均可接收:
curl -sS \
-X POST \
-H "Authorization: Bearer ${API_TOKEN}" \
"${API_BASE}/v1/profiling/${JOB_ID}/stop"
成功返回 200 OK 和当前 Job 快照。终态 Job 返回 409 Conflict。由于结果可能
不完整,stopped Job 不提供结果查询。
Grafana 使用 /v1/profiling/flamegraph/ 下的 Pyroscope 兼容 Protobuf 接口。
SelectMergeStacktraces 的标签选择器必须指定 scope="host" 或 scope="container"。
region 是 Agent 配置的区域,hostname 仅表示采集节点,不隐含宿主机范围。
容器查询使用 container_id 或单个任务 id 定位目标;宿主机查询不能携带容器条件。
例如 {region="example",hostname="node-01",scope="container",container_id="…",id="…"}。
每个标签只接受一个等值条件。在本接口上,通配值 *、all 和空字符串只表示取消该标签
的限制,因此 {scope="host",hostname="*",id="job-1"} 仍只选中一个任务,scope 依旧必填。
重复同一个等值条件会被接受,而 {hostname="host-a",hostname="host-b"} 这类互相矛盾的
同名条件会返回 400,错误信息同时给出两个值,因为一次查询无法同时选中两台主机。
使用 = 以外运算符的条件(包括 hostname!="*")同样会被拒绝。
统一面板 UID 为 continuous-profiling,变量顺序为 Region、节点、范围、容器、指标、任务。
趋势图与火焰图使用相同任务过滤。容器选择 All 时,任务仍限定到一个目标;
physical_usage 始终要求单个任务并只取最新快照。
任务摘要使用 pyroscope.yaml 的 Infinity 数据源,需与 Pyroscope 数据源配置相同的 API token。
result_url 包含从已存储窗口取得的 Region 和实际指标;没有窗口的结果不返回该链接。
本文列出 profiler 的参数、默认值和适用范围。构建条件与采集示例见命令行采集,格式选择见输出格式。
--output-path 和 --output-format 都必须显式传入。--output-format 的声明默认值为 collapsed,但不能依靠该默认值省略参数。
| 参数 | 默认值 | 适用范围 | 说明 |
|---|---|---|---|
--type, -t |
无 | 全部 | 观测类型:cpu 或 memory,必填 |
--language, -l |
无 | 全部 | 目标语言:c、c++、go、java 或 python,必填 |
--pid, -p |
无 | 全部 | 目标 PID;Java、Python 可使用逗号分隔多个 PID,原生采集最多一个 PID |
--container-id |
无 | 全部 | 目标容器 ID;原生 CPU 采集可与 --pid(宿主机 PID)组合,两个过滤条件同时生效;其他采集类型与 --pid 互斥 |
--duration, -d |
10 |
全部 | 总采集时长,单位为秒,最小为 1 |
--aggr-interval |
10 |
全部 | 聚合周期,单位为秒,不得大于采集时长 |
--freq, -F |
99 |
CPU | 每秒采样次数;Java 最大为 1000 |
--output-path |
必填 | 全部 | 本地文件、目录或 stdout,remote-store 时为 Unix socket;新目录路径以 / 结尾 |
--output-format |
collapsed |
全部 | collapsed、flamegraph、svg、json 或 remote-store;必须与 --output-path 一起显式指定 |
--max-concurrent-procs |
0 |
Java、Python | 并发采集子进程上限;0 表示不限制 |
--tool-path |
无 | Java、Python | 外部采集工具统一根目录,必填 |
--binary-match-path |
无 | Java、Python | 按可执行文件路径匹配容器内目标进程 |
--huatuo-api-address |
127.0.0.1:19704 |
容器目标 | 用于解析容器元数据的 HUATUO API 地址 |
--task-id |
空;本地输出时内部生成 | 全部;remote-store 必填 |
toolstream 和远端存储共用的稳定采集任务 ID |
--enable-pprof |
false |
工具自身 | 在 127.0.0.1:6000 暴露工具自身的 Go runtime profile |
--version-format |
text |
版本查询 | --version 的输出格式:text、json 或 short |
--help, -h |
- | 全部 | 显示命令帮助 |
--version, -v |
- | 全部 | 显示版本与构建信息 |
这些 pprof 接口描述 profiler 进程自身的 Go runtime,不是 --pid 指定的目标或 Java/Python 采集子进程。监听范围由所有网卡收紧为 loopback;端口被占用时启动失败。
| 参数 | 默认值 | 适用范围 | 说明 |
|---|---|---|---|
--memory-mode |
无 | 原生内存、Java 内存 | 内存观测维度;使用 --type memory 时必填 |
--cpuid |
全部 CPU | 原生 CPU | CPU 列表或范围;off-CPU 样本按任务切出时所在 CPU 过滤 |
--cpu-mode |
oncpu |
原生 CPU | oncpu 按频率采样,offcpu 归因阻塞与可运行调度延迟 |
--require-hardware-pmu |
false |
原生 on-CPU | 强制使用硬件 PMU 采样;不可用时失败,不回退软件 CPU clock |
--offcpu-phase |
all |
原生 off-CPU | 累计 all、blocked 或 runqueue 时间 |
--offcpu-min-duration-us |
1000 |
原生 off-CPU | 丢弃持续时间小于该微秒数的阶段 |
--offcpu-stats |
false |
原生 off-CPU | 收集 BPF 诊断统计;错误和清理路径会产生额外开销 |
--thread-group |
false |
原生 | 同时采集目标 PID 所在线程组中的其他线程 |
--physical-memory-probability |
100 |
原生物理内存 | 物理内存事件采样概率,范围为 1~100 |
--log-bpf-debug |
false |
原生 | 输出 BPF 调试事件,常规采集不建议启用 |
硬件 PMU 事件或采样不受支持时,命令退出码为 1,标准错误以 Error: hardware_pmu_unavailable: 标识该错误;权限及其他启动错误不使用此标识。
| 参数 | 默认值 | 说明 |
|---|---|---|
--log-level |
error |
trace、debug、info、warn 或 error |
--log-file |
stdout |
日志文件路径,或 stdout |
--log-size |
100 |
日志轮转大小,单位 MB;0 表示不轮转,仅用于文件输出 |
--verbose |
false |
等价于 --log-level debug --log-file stdout,并覆盖显式日志设置 |