中国电信 PaaS 运维一面:Linux 内存与分布式存储
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 请做一下自我介绍。
- 了解 CPU 和内存的详细底层参数吗?
- Linux 饱和是什么?
- 讲一下 cache 和 buffer 的区别。
- 讲一下 Linux swap。
- 如何手动释放内存?
- 看你背景里有做过 AI 项目,那你说下 MCP 和 Skill 的区别?
- 你说你最近在学习分布式存储的知识,那你讲下都学了什么?
- 多副本和 EC 的优缺点?
- 对象存储讲一下。
- 你说你用过 MinIO,具体是怎么用的?
- 简单说下 MinIO 的使用步骤。
- 文件存储讲一下。
- Linux 保存一个文件的流程是什么?
- 用过什么语言?
- C++ 里面堆栈的区别(数据结构的区别)?
- 指针和引用的区别?
- 类和对象的区别?
《参考解析》
**cache 与 buffer、swap 与手动释放内存:**cache 主要缓存文件数据(page cache,读时命中、写时标脏由内核回写),buffer 更多对应块设备的元数据与目录项缓冲;两者在 free 里合并成 buff/cache,绝大部分是可回收的,所以「可用内存」要看 available 而不是 free。swap 是内存紧张时把匿名页换出到磁盘,代价是缺页与 IO 抖动,vm.swappiness 决定内核多愿意换出;要在节点上做内存规整可以 swapoff -a && swapon -a 把页换回。手动释放内存一般是先 sync 再把 1/2/3 写进 /proc/sys/vm/drop_caches,但它只是丢掉可回收缓存,之后所有 IO 都要重新回源、性能反而下降,所以生产上要慎用——真出现内存打满,先查是泄漏、缓存膨胀还是负载超配。
**Linux 饱和是什么意思:**饱和指资源已经排队,不再是「忙」而是「来不及」。判据按资源分开看:CPU 看运行队列长度与上下文切换(vmstat 的 r 列、si/so),内存看直接回收与 swap 换入换出,磁盘看 iowait、await 与队列深度,网络看重传与丢包。面试官问这个是想确认你会不会区分「利用率高」和「饱和」——利用率 90% 但队列很短是健康的高负载,利用率 60% 却在排队才是问题。
**多副本与 EC 的取舍:**多副本(典型三副本)写三份,读任意一份,恢复快、延迟低、实现简单,代价是存储开销 200%;EC(纠删码)把对象切成 k 个数据片再加 m 个校验片,分散到 k+m 个节点,空间开销只有 (k+m)/k(如 4+2 是 1.5 倍),代价是任何一次读都要并行取回 k 片再解码、修复时要读 k 片重算、小文件与随机读的场景放大元数据与网络开销、并且编码解码消耗 CPU。结论是按数据温度分:热数据、小文件、低延迟要求用副本;冷数据、大对象、容量敏感用 EC,很多对象存储实际是两者的组合(小对象合并打包再 EC、热层放副本)。
**对象存储、文件存储与块存储:**块存储是裸设备挂给单机,性能最好、只能单机用,云盘属于这类;文件存储是目录树 + POSIX 语义,多客户端共享(NFS/CIFS),适合共享配置、容器存储、AI 训练数据集;对象存储用桶 + 对象的两层模型、扁平命名空间、HTTP/REST 接口,天然适合海量非结构化数据与冷数据,代价是改名/追加这类操作不友好、强一致与目录语义弱。MinIO 的实操步骤:部署单机或分布式集群(分布式用纠删码)、配好访问密钥与 TLS、建桶、用 mc 或 SDK 上传下载、需要时开版本控制与生命周期规则、按业务配桶策略和配额。被问到「你具体怎么用的」,要说清场景(存什么、多大、读多还是写多)和为什么选它,而不是只背命令。
**Linux 保存一个文件的流程:**应用 write 先把数据写进 page cache 并标脏,随后由内核的回写线程在阈值或超时后刷盘,fsync/fdatasync 则是应用主动要求落盘;往下文件系统负责分配数据块、更新 inode 与位图,元数据变更先记 journal 再落地;再往下是块层做 IO 合并与调度、最后由设备驱动写进磁盘,写完更新元数据。这条链路串起了 page cache、writeback、journal、fsync 与掉电一致性,也解释了为什么大量小文件写会慢(元数据与随机 IO 多),以及为什么数据库要自己控制 fsync 的时机。
**MCP 和 Skill 的区别:**MCP(Model Context Protocol)是模型与外部能力之间的标准接入协议,解决「模型能用什么」——它把工具、数据源以统一描述暴露出来,让客户端做能力发现和调用,屏蔽各家实现的差异。Skill 更像是把一套可复用的流程、知识和脚本打包成按需加载的指令集,解决「模型知道怎么做」——它不引入新能力,而是把已有的工具和步骤组织成可靠的作业路径。一句话区分:MCP 接资源,Skill 定流程;前者是接口标准,后者是经验沉淀。
**C++ 基础三连:堆与栈、指针与引用、类与对象:**堆由 new/malloc 手动申请释放,地址空间大、分配慢、容易产生碎片,需要自己管理生命周期;栈由编译器管理,连续分配、速度快、大小受限,生命周期跟随作用域,递归过深会爆栈。指针是一个存放地址的变量,可以为空、可以重绑、可以做算术运算;引用是对象的别名,必须在定义时绑定且不能改绑、没有空引用、不参与算术,实现上通常也是指针但语义更严,因此接口里用引用表达「一定非空」。类是类型定义,描述数据成员、成员函数和访问控制(还有 vtable 等编译产物);对象是类的一个实例,占用内存并持有自己的状态,同一个类的不同对象共享代码段但不共享数据段。