---
title: E2B 沙箱双层资源遥测体系设计分析-官方技术文章-鲲鹏社区
description: E2B沙箱平台拥有两套资源监控体系，分别从宿主机内核、虚拟机内部两个视角，监控Firecracker微虚拟机资源使用情况。
keywords: 沙箱双层资源,遥测体系设计,分析,官方技术文章,鲲鹏社区,概述,Host,宿主机层监控
url: https://www.hikunpeng.com/developer/techArticles/20260525-1?envFlag=1
section: (其他)
---

# E2B 沙箱双层资源遥测体系设计分析-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20260525-1?envFlag=1
描述: E2B沙箱平台拥有两套资源监控体系，分别从宿主机内核、虚拟机内部两个视角，监控Firecracker微虚拟机资源使用情况。
关键词: 沙箱双层资源,遥测体系设计,分析,官方技术文章,鲲鹏社区,概述,Host,宿主机层监控

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

E2B 沙箱双层资源遥测体系设计分析

E2B 沙箱双层资源遥测体系设计分析

沙箱

发表于 2026/05/28

0

# E2B 沙箱双层资源遥测体系设计分析

## 1. 概述

E2B沙箱平台拥有两套资源监控体系，分别从宿主机内核、虚拟机内部两个视角，监控Firecracker微虚拟机资源使用情况。

宿主机层（HostStats）

核心文件：

orchestrator/internal/sandbox/hoststats_collector.go

orchestrator/internal/sandbox/cgroup/manager.go

观测视角：宿主机内核借助cgroup v2、gopsutil/process工具监控Firecracker进程

导出目标：ClickHouse

虚拟机层（Sandbox Metrics）

核心文件：

envd/internal/host/metrics.go

envd/internal/api/store.go

orchestrator/internal/metrics/sandboxes.go

观测视角：虚拟机内部envd守护进程，上报虚拟机系统资源状态

导出目标：ClickHouse

两套体系作用互补：HostStats用于精准计费、宿主机资源调度；Sandbox Metrics面向用户监控、异常告警、容量评估。

## 2. 宿主机层监控（Host-observed）

### 2.1 核心工作机制

1. 进程原子加入cgroup

创建CgroupHandle时，打开cgroup目录文件句柄与memory.peak文件句柄。启动Firecracker进程时，通过内核能力将进程直接划入指定cgroup，杜绝竞争问题。进程启动完成后，立刻cgroup目录句柄防止资源泄露，保留memory.peak句柄持续读取内存峰值数据。

2. 两层指标合并采集

进程层：使用gopsutil/process读取Firecracker进程的用户态CPU时间、内核态CPU时间、常驻内存、虚拟内存。

内核层：读取cgroup v2文件，获取CPU总耗时、用户态/内核态CPU耗时、当前内存、内存峰值。

数据聚合：HostStatsCollector整合进程层与内核层数据，统一推送至ClickHouse。

### 2.2 采集指标清单（共13项）

#### 沙箱基础元数据

SandboxID：字符串，沙箱唯一编号，来源runtime.SandboxID

SandboxExecutionID：字符串，单次运行实例编号，来源runtime.ExecutionID

SandboxTemplateID：字符串，沙箱模板编号，来源runtime.TemplateID

SandboxBuildID：字符串，构建编号，来源入参buildID

SandboxTeamID：唯一标识，团队/租户编号，来源runtime.TeamID

SandboxVCPUCount：长整型，分配给沙箱的虚拟CPU数量，来源config.Vcpu

SandboxMemoryMB：长整型，分配给沙箱的内存大小（单位MB），来源config.RamMB

Timestamp：时间类型，数据采样时间，来源系统当前时间

#### 进程级指标（读取/proc/进程ID文件）

FirecrackerCPUUserTime：浮点型，单位秒，进程用户态CPU运行时长，对应gopsutil的times.User

FirecrackerCPUSystemTime：浮点型，单位秒，进程内核态CPU运行时长，对应gopsutil的times.System

FirecrackerMemoryRSS：无符号长整型，单位字节，进程常驻内存大小，对应gopsutil的memInfo.RSS

FirecrackerMemoryVMS：无符号长整型，单位字节，进程虚拟内存大小，对应gopsutil的memInfo.VMS

#### cgroup内核级指标（读取/sys/fs/cgroup/e2b/sbx-编号/目录文件）

CgroupCPUUsageUsec：无符号长整型，单位微秒，cgroup内CPU总使用时长，来源cpu.stat文件usage_usec字段

CgroupCPUUserUsec：无符号长整型，单位微秒，cgroup内用户态CPU时长，来源cpu.stat文件user_usec字段

CgroupCPUSystemUsec：无符号长整型，单位微秒，cgroup内内核态CPU时长，来源cpu.stat文件system_usec字段

CgroupMemoryUsage：无符号长整型，单位字节，cgroup当前内存使用量，来源memory.current文件

CgroupMemoryPeak：无符号长整型，单位字节，cgroup运行以来内存使用最大值，来源memory.peak文件

### 2.3 CgroupHandle 完整生命周期

1. 初始化：创建沙箱专属cgroup目录，打开目录句柄、memory.peak句柄，状态变为已创建

2. 句柄持有：对外提供目录句柄，用于启动Firecracker进程

3. 进程启动：内核将进程划入对应cgroup，进程启动完成

4. 释放句柄：cgroup目录句柄，保留memory.peak句柄

5. 循环采集：定时读取进程与cgroup资源数据，持续上报至ClickHouse

6. 停止采集：终止定时任务，完成最后一次数据采样

7. 销毁清理：memory.peak句柄，删除cgroup目录，流程结束

补充说明：cgroup目录句柄仅用于启动进程，用完立即释放；memory.peak句柄全程保留，适配高版本内核内存峰值重置能力。

## 3. 虚拟机层监控（Guest-reported）

### 3.1 虚拟机内envd进程采集指标

envd是运行在Firecracker虚拟机内部的守护进程，负责采集虚拟机系统资源：

Timestamp：长整型，虚拟机内部UTC时间戳，来源系统时间转换

CPUCount：无符号整型，虚拟机识别到的CPU核心数，来源cpu.Counts接口

CPUUsedPercent：浮点型，虚拟机整体CPU使用率（保留2位小数），来源cpu.Percent接口

MemTotalMiB：无符号长整型（已废弃），内存总大小（单位MB），来源内存信息换算

MemUsedMiB：无符号长整型（已废弃），内存已用大小（单位MB），来源内存信息换算

MemTotal：无符号长整型，内存总大小（单位字节，精准数据），来源内存原始数据

MemUsed：无符号长整型，内存已用大小（单位字节，精准数据），来源内存原始数据

DiskTotal：无符号长整型，根分区总容量（单位字节），来源磁盘分区统计接口

DiskUsed：无符号长整型，根分区已用容量（单位字节），来源磁盘分区统计接口计算结果

### 3.2 宿主机Orchestrator处理规则

Orchestrator中的SandboxObserver模块，接收虚拟机上报数据，转换为标准监控指标，配套多项校验与处理逻辑。

#### 版本兼容规则

minEnvdVersionForMetrics：版本≥0.1.5，允许基础指标采集

minEnvVersionForMetricsTimestamp：版本≥0.1.3，开启虚拟机与宿主机时钟校验

minEnvdVersionForMemoryPrecise：版本≥0.2.4，直接使用字节单位内存数据；低版本需将MB换算为字节

minEnvdVersionForDiskMetrics：版本≥0.2.4，开启磁盘指标采集

#### 时钟漂移校验

对比宿主机UTC时间、虚拟机上报时间戳，两者差值超过2秒时，打印警告日志。用于排查虚拟机时间未同步、虚拟化时钟异常问题。

#### 并发请求限制

为避免大量沙箱同时请求拖垮服务，按照沙箱总数除以5计算最大并发数，限制HTTP请求并发量。

#### 资源阈值告警

虚拟机CPU使用率、内存使用率任意一项超过80%，立即打印警告日志。

### 3.3 对外输出监控指标

cpu_total：整型指标，代表虚拟CPU核心数，附带标签：沙箱ID、租户ID

cpu_used：浮点型指标，代表CPU使用率（百分比），附带标签：沙箱ID、租户ID

memory_total：整型指标，代表内存总大小（字节），附带标签：沙箱ID、租户ID

memory_used：整型指标，代表内存已用大小（字节），附带标签：沙箱ID、租户ID

disk_total：整型指标，代表磁盘总大小（字节），附带标签：沙箱ID、租户ID

disk_used：整型指标，代表磁盘已用大小（字节），附带标签：沙箱ID、租户ID

## 4. 两套监控体系对比

采集位置：

HostStats：宿主机Orchestrator服务

Sandbox Metrics：虚拟机内部envd进程

监控视角：

HostStats：宿主机内核视角

Sandbox Metrics：虚拟机操作系统视角

CPU相关数据：

HostStats：进程CPU时长、cgroup CPU耗时

Sandbox Metrics：虚拟机整体CPU使用率

内存相关数据：

HostStats：进程常驻/虚拟内存、cgroup当前内存/内存峰值

Sandbox Metrics：虚拟机总内存、已用内存

磁盘相关数据：

HostStats：无磁盘监控

Sandbox Metrics：虚拟机根分区总容量、已用容量

时间戳来源：

HostStats：宿主机系统时间

Sandbox Metrics：虚拟机系统时间（用于时间校验）

数据传输方式：

HostStats：本地函数读取文件，无网络请求

Sandbox Metrics：HTTP接口上报数据

数据最终去向：

HostStats：ClickHouse

Sandbox Metrics：OpenTelemetry Collector

数据精度特点：

HostStats：可精准定位到单个进程

Sandbox Metrics：反映虚拟机整体资源状态

## 5. 整体业务流程说明

### 5.1 宿主机层HostStats数据流转

1. 沙箱实例启动，初始化宿主机数据采集器

2. 绑定Firecracker进程ID、cgroup管理句柄，启动后台采集协程

3. 采集器同时读取两类数据：一是Firecracker进程内存、CPU数据；二是cgroup内核CPU、内存数据

4. 整合所有数据，统一推送至ClickHouse数据库存储

### 5.2 虚拟机层数据流转（虚拟机→宿主机→监控平台）

1. 虚拟机内envd守护进程，读取系统CPU、内存、磁盘信息

2. 宿主机Orchestrator通过HTTP接口（超时100毫秒）拉取虚拟机指标

3. 宿主机完成版本校验、时间校验、阈值判断后，将数据转为标准监控指标

4. 指标推送至OpenTelemetry Collector，最终在Prometheus、Grafana等平台展示

### 5.3 双层监控整体流转

1. 宿主机层：采集器读取进程与cgroup数据，推送至ClickHouse

2. 虚拟机层：envd采集系统数据，通过HTTP接口上报给宿主机

3. 宿主机统一处理虚拟机上报数据，转为标准监控指标对外提供查询

4. 两套数据相互补充、对照分析

### 5.4 虚拟机层完整定时采集流程（每5秒执行一轮）

1. 监控框架注册定时回调，每5秒触发一次全量沙箱指标采集

2. 遍历所有正在运行的沙箱，控制HTTP请求并发数量，防止服务过载

3. 逐个校验沙箱内envd版本，版本低于0.1.5直接跳过，不采集数据

4. 版本合规则发起HTTP请求，调用虚拟机/metrics接口获取原始指标

5. 虚拟机内envd读取本地CPU、内存、磁盘数据，组装成数据报文返回宿主机

6. 宿主机接收数据后，第一步做时间校验：虚拟机与宿主机时间差超过2秒则告警

7. 根据envd版本处理内存单位，低版本完成单位换算，高版本直接使用原始数据

8. 将CPU、内存、磁盘数据注册为标准监控指标，并绑定沙箱、租户标识

9. 计算CPU、内存使用率，超过80%阈值则输出资源告警日志

10. 当前沙箱处理完毕，继续处理下一个沙箱，直至全部遍历完成

11. 本轮所有数据汇总后，统一推送至监控采集器，供前端监控页面展示

## 6. 两套体系使用定位总结

1. HostStats（宿主机监控）：统计Firecracker进程真实占用的硬件资源，核心用途是业务计费、宿主机整体资源调度。

2. Sandbox Metrics（虚拟机自监控）：展示虚拟机内部系统感知到的资源压力，核心用途是面向终端用户展示监控、资源异常告警、集群容量规划。
