阿里云 Agent Infra 一面:SGX、EPC、512MB、吞吐不升反降
- 轮次
- 一面
- 结果
- 通过
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
SGX 与沙箱 Infra
- 现在平台有一台 Intel SGX 机器,面向多租户提供计算服务,用户数据量约 1GB,怎么设计方案?
- EPC 资源只有 512MB,用户数据需要不断切入切出 EPC,怎么保证安全?
- 用户数据量提升,PV 变成原来 4 倍,但吞吐量没有上升,可能是什么原因?
- 上述场景可能遇到的瓶颈有哪些?怎么定位?
- 多租户场景下,Agent 沙箱怎么设计才能防止租户数据泄露?
- 如果沙箱里的 Agent 试图访问宿主机文件系统,怎么拦截?
- 容器重启后,会话状态怎么恢复?存了什么?存在哪里?
- 沙箱是常驻还是用完销毁?起沙箱速度怎么优化?
- Agent 调用 Sandbox 的链路如何做容错?Sandbox 运行过程中挂掉怎么办?
- 上下文通信怎么优化?
通用 Agent Runtime 与状态
- 通用 Agent Runtime 怎么设计才能兼容通义千问、文心一言、GPT-4 等多个模型?
- 不同模型 API 接口、上下文格式、工具调用方式都不一致,怎么抽象?
- Agent 状态持久化有哪些方案?
- Agent Infra 的 Data Infrastructure 主要做什么?
训练与推理显存
- 长序列训练中,显存占用主要来自哪些部分?
- 激活值显存比模型参数还大,怎么优化?
- FlashAttention 能省多少显存?
- KV Cache 显存占用怎么计算?
- vLLM 的 PagedAttention 原理是什么?
- 如果 vLLM 出现内存泄漏,从哪些方向定位?
计算机基础与手撕
- 为什么操作系统需要区分用户态和内核态?什么情况下会发生用户态到内核态的切换?
- 进程和线程的区别?进程间通信方式有哪些?
- TCP 三次握手四次挥手?一定需要四次吗?
- 多台机器如何生成唯一 ID?要求自增呢?
- 排序算法手撕:真的假的?
- 手撕:解析嵌套字符串,如 3[ab2[c]] 解析为 abccabccabcc,怎么用递归实现?如果嵌套深度超过 1 万层怎么办?
项目追问
- 介绍蚂蚁实习的 Agent 自进化:Agent 自进化是怎么做的?进化指标怎么来?Agent 怎么采集?
- 你觉得这个项目最有价值的是什么?
- 实习的 DAU 是多少?关注过项目哪些其他指标?
《参考解析》
1. SGX 场景下 1GB 数据与 512MB EPC 的设计。 Enclave 是可信计算区而不是数据仓库:数据以密文放在普通内存或磁盘,密钥在 Enclave 内生成并密封保存,只把当前计算需要的工作集(如 64MB 一片)载入 EPC,用完立即清零并释放,跨片用状态机推进、进度同样密封落盘。EPC 换页极贵,所以工作集要一次装够。多租户按 Enclave 实例与密封密钥隔离,宿主机被攻破也拿不到明文。要讲清边界:SGX 保护运行态内存的机密性与完整性,挡不住侧信道与拒绝服务,所以分片大小与访问顺序也要避免可观测的规律。
2. 切入切出的安全风险与“PV 变 4 倍吞吐不升”的定位。 切入切出的风险在三处:残留(卸载不清零会被下一个租户读到)、密钥与会话复用(等于绕过隔离)、换页模式泄露(主机侧能从访问时序推断业务)。原则是最小驻留、用后即焚、每租户独立密钥。PV 翻四倍吞吐不升,说明瓶颈在一个串行资源上:EPC 换页与加解密吃掉 CPU(sys 占比高)、全局锁或单线程调度压在饱和点、下游(磁盘、网络、推理集群、连接池)已满、或者压测端自己封顶(连接数、keep-alive、限流阈值没跟着放大)。定位顺序:看资源利用率与 user/sys 分布 → 火焰图看热点是否集中在加解密与缺页 → 查锁竞争与队列深度 → 单变量压测画 QPS-延迟曲线找拐点。延迟线性涨而 QPS 持平是排队;延迟不变而 QPS 不涨多半是上游或压测端封顶。
3. 沙箱隔离、逃逸拦截与状态恢复。 隔离分四层:独立内核(microVM、gVisor、Kata)避免共用内核攻击面;命名空间加只读根与独立 overlay,让容器看不到别家挂载;cgroup 限 CPU、内存、PID 与 IO;seccomp 白名单裁掉 ptrace、mount、bpf 并去掉全部 capability,网络默认断网或走白名单代理。Agent 试图访问宿主机文件系统时,靠不挂宿主目录、最小化 /proc 与 /sys、拦 open_by_handle_at 这类绕过路径、不暴露 docker.sock 来拦截,并记录告警所有越权尝试。容器重启后的状态恢复要分“可重建”与“必须持久”:代码与依赖靠镜像重建,会话状态(对话历史、工具中间结果、产物、进度)必须外置到对象存储与数据库或 Redis 检查点,按 sessionId 拉回并重放未完成步骤。沙箱应“用完销毁”,要保活的是会话状态;冷启动用预热池摊平,而不是让容器常驻。
4. 通用 Agent Runtime 的抽象与状态持久化。 抽象的做法是定义内部协议、把差异挡在适配器里。协议至少四件:消息模型(role、文本与图片分块、工具结果单独成消息)、工具描述(统一 JSON Schema,适配器再转各家 function calling)、生成参数(温度、最大 token、思考等级、结构化输出)、流式事件(文本增量、工具调用增量、结束原因、用量)。适配器负责请求改写、能力降级(不支持原生工具调用就用提示词模拟加重试解析)、错误与配额治理(区分 429 与 5xx 与 400,做退避与跨厂商切换)。持久化三种方案:数据库分表存会话与检查点(事务性好但写放大);Redis 加热状态落盘(快,需要重建策略);append-only 事件日志(可从任意时刻重放,便于审计,代价是存储与重放成本)。生产常用组合是事件日志做事实源、Redis 做热缓存、数据库做归档与查询。Data Infrastructure 负责文档接入与解析、切分与索引、多租户数据边界、版本与失效管理,以及评测用的采样与标注。
5. 长序列训练显存与 vLLM。 显存四块:模型参数与优化器状态、激活值、注意力矩阵、KV Cache。激活值占大头时的手段:梯度检查点(用约三成计算换数倍显存)、序列并行与张量并行、ZeRO 或 FSDP 分片、混合精度、算子融合。FlashAttention 用分块在 SRAM 里算注意力、不物化 L×L 矩阵,激活显存从 O(L²) 降到 O(L),顺带减少 HBM 读写所以更快,数学结果不变。KV Cache 按 2 × 层数 × 头数 × head_dim × 序列长 × batch × 字节数 估,例如 32 层、32 头、head_dim 128、fp16、序列 4096、batch 1 约 2GB。PagedAttention 借操作系统的分页思想,把 KV Cache 切成固定 block、用块表把逻辑连续映射到物理不连续,消掉“按最大长度预留连续空间”的碎片,配合前缀共享还能省多轮对话的重复缓存。vLLM 内存泄漏先区分真泄漏与碎片或缓存策略造成的“看起来不释放”,再查异常路径下 block 引用计数未归还是否让池被占满、prefix caching 的引用管理、进程内重复创建模型或 CUDA 上下文、Python 循环引用,用 torch.cuda.memory_summary 与 block 表 dump 定位。
6. 嵌套字符串解析与计算机基础连环问。 3[ab2[c]] 展开成 abccabccabcc 用双栈(次数栈 + 字符串栈)或递归:遇数字累计(注意多位)、遇 [ 把当前串与次数入栈并重置、遇字母追加、遇 ] 弹栈把当前串重复 n 次接回。追问“深度超一万层”考的是把递归改成显式栈——把调用栈搬到堆上,不受运行时栈上限约束;第二个坑是输出规模指数爆炸(10[10[10[a]]]),必须先做长度上限校验或惰性产出,否则 OOM;第三是非法输入(括号不配、数字后无 [)要给明确错误。用户态与内核态的区分是为了保护:特权指令、页表、中断与设备访问收在特权级,用户程序只能通过受限入口请求服务;进内核的触发有三类:系统调用、异常(缺页、除零)、外设中断。进程是资源分配单位(独立地址空间与文件描述符表),线程是调度单位(共享进程资源,只独享栈、寄存器与 TLS)。IPC 有管道、消息队列、共享内存(最快但需自己同步)、信号量、信号、Socket、内存映射文件。TCP 四次挥手是因为全双工、关闭是单向的;若被动方收到 FIN 时已无数据要发,ACK 与 FIN 可以搭同一个包,实际变成三步。多机唯一 ID:UUID 无序且伤索引;雪花(时间戳 + 机器 ID + 序列号)唯一且趋势递增,但依赖时钟与机器编号;数据库自增分段扩展性差;Redis INCR 或号段模式是实用的折中;要求严格自增就要接受中心化发号器的单点与延迟。