[i18n] print_printable_section [i18n] print_click_to_print.

[i18n] print_show_regular.

参考手册

查询指标、记录字段、统计口径及接口参数时,使用以下参考页;了解功能和适用问题见核心特性。

参考 内容
指标参考 名称、单位、标签、来源和统计口径
自动追踪字段 触发指标、采集结果及 JSON 示例
异常事件字段 事件结构、字段、限制和兼容性
硬件事件字段 RAS 计数、严重级别、寄存器和错误编码
Profiling API 任务创建、状态、结果查询及停止规则
profiler 命令行参数 参数默认值、范围和适用模式

1 - 指标参考

本文列出指标名称、单位、标签、来源及统计口径。功能与排查场景见内核全景观测。

阅读说明

本文按 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。表格仅列附加标签,— 表示无附加标签。
  • 计数与单位:计数值表示事件或对象数量,不等于延迟值。累计 Counter 可用 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

调度延迟

调度延迟指任务进入可运行状态到实际获得 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 重载后两者均归零。

主机 memcg 回收累计次数

指标 意义 单位 对象 取值 标签
memory_reclaim_directstall 整台主机 memcg 限额回收累计次数 计数 物理机 eBPF host, region

该 Gauge 统计全机 memcg 回收次数,排除 kswapd,不是全局回收次数或耗时。主机总量包含容器活动,不能与容器计数相加;BPF 重载后归零。

网络

TCP 内存

记录 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 邻居项。

指标 说明 单位 范围 附加标签
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

RDMA 端口统计

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

TCP 统计

读取网络命名空间的 /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 内核文档。

参考:

Socket 使用量

读取网络命名空间的 /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 数量 计数 宿主机、容器 —

I/O

配置

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 等伪设备。

延时与 IO 大小分布

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。

Grafana

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-throttle 排队等待

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 等待统计

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

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 容器归属与计数

指标 意义 单位 对象 取值 标签
hungtask_container_total 已归属容器的阻塞任务事件计数 计数 容器 BPF + CSS 缓存 container_host, container_hostnamespace, container_level, container_name, container_type, host, region

容器计数包含在主机 Counter 中,不受追踪退避影响。容器归属无法解析的事件仍计入主机总量。容器退出后清理其计数,agent 重启后归零;同一阻塞任务重复上报按多次事件计数。

GPU

MetaX

仓库配置默认通过 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

MThreads

摩尔线程 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

2 - 自动追踪字段

本文说明自动追踪记录的字段、单位和示例。适用场景见自动追踪,配置节和参数见节点配置。下文阈值为内置默认值,配置文件可覆盖。

结果

自动追踪事件按已启用的存储配置写入 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 特定事件私有数据(详见各事件说明)

宿主机 CPU

追踪器: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 函数或进程名称标签

容器 CPU

追踪器: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

容器 D 状态负载

追踪器: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 状态进程的内核调用栈(多进程多行文本)

磁盘 I/O

追踪器: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 交换空间 / 页表内存

3 - 异常事件字段

本文说明异常事件的记录结构、字段和适用限制。功能介绍见异常事件诊断,采集设置见节点配置。

事件记录

结果按已启用的存储配置写入 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 特定事件私有数据(详见各事件说明)

CPU 调度

调度 tick 间隔

观测器:sched_tick。

检测相邻调度 tick 的总间隔;间隔达到阈值时记录当前内核调用栈和进程信息。该事件可发现 IRQ 长时间关闭、CPU 停顿或虚拟化调度延迟等问题,但不能单独证明软中断被禁用。comm 和 pid 表示上报 tick 所中断的任务,不表示造成延迟的任务。

适用场景

  • 内核或驱动长时间关闭本地中断,或 hardirq/NMI 长时间占用 CPU。
  • 虚拟机 vCPU 被宿主机长时间抢占,包括高 steal time 和调度停顿。
  • SMI、固件停顿、clockevent 延迟投递或丢失等底层异常。

使用边界

成功进入 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 检测超时设置,单位为秒

内存

OOM 终止

观测器: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 网卡固件版本

LACP 状态

观测器: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 名称迁移

OOM kill 追踪器现命名为 memory_oom_kill(此前为 memory_oom,更早为 oom),需同步更新黑名单、事件过滤器和告警查询。

指标前缀现为 huatuo_bamai_memory_oom_kill_,替代 huatuo_bamai_memory_oom_ 及更早的 huatuo_bamai_oom_,需同步更新指标仪表盘和记录规则。

历史事件保留原名称,跨版本查询需匹配这三个名称;内置事件仪表盘已覆盖三者。

4 - 硬件事件字段

本文说明 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 中。

MCE

寄存器与 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 厂商编码

MCE 阈值中断

字段 说明
vector 中断向量
cpu 逻辑 CPU 编号

EDAC

字段 说明
err_count 本条事件报告的错误次数
err_type / err_msg 归一化严重级别与错误描述
label 驱动报告的内存位置标签;实际插槽位置需结合机器拓扑确认
mc_index 内存控制器编号,从 0 开始
top_layer / mid_layer / low_layer 驱动定义的内存拓扑层次索引;-1 表示未指定
addr 内核报告的错误地址
grain 地址粒度,单位为字节
syndrome ECC 综合征值
driver 驱动提供的补充错误信息,不一定是驱动名称

ACPI GHES

字段 说明
severity 原始严重级别值,当前映射见严重级别表
sec_type 错误段类型 GUID,表示为 16 字节十六进制字符串
fru_id / fru_text 可更换部件标识及描述,是否提供取决于固件
data_len 报告的数据长度,单位为字节
raw_data 十六进制转储;需结合平台和厂商格式解读

非标准错误部分(NVDIMM、CXL 以及各厂商自定义载荷)可能超出复制的窗口。raw_data 只包含该错误部分起点之后实际可用的字节:长度会按剩余窗口截断;记录声明的长度有效时,窗口末尾未使用的字节不会作为载荷输出。窗口还要容纳记录固定字段和起点之前的数据,因此它不是每条记录的 raw_data 容量。data_len 仍上报内核记录中的原始长度。偏移和长度都来自内核记录,使用前会先做边界约束,因此畸形事件不会输出窗口之外的字节。

PCIe AER

字段 说明
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

ARM_GHES 记录的严重级别为 unknown;平台可用性限制见采集范围。

字段 说明
mpidr / midr 十六进制处理器标识;mpidr=0x0 也可能表示内核未提供该值
running_state running、stopped 或 N/A
psci_state 停止状态下的十六进制 PSCI 状态;不适用时为 N/A
affinity_level 十进制亲和层级;未提供时为 N/A

5 - Profiling API

本文列出性能剖析任务的请求、响应和状态约定。首次采集见性能剖析实践。

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 和实际指标;没有窗口的结果不返回该链接。

6 - profiler 命令行参数

本文列出 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,并覆盖显式日志设置