线上进程文件描述符持续上涨,如何定位是哪里泄漏的?
围绕“线上进程文件描述符持续上涨,如何定位是哪里泄漏的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 /proc/PID/fd 与 lsof 观察增长类型的诊断路径,并区分管道、socket 与文件泄漏。
程序员面试题库第 63 页,收录第 3101–3150 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
围绕“线上进程文件描述符持续上涨,如何定位是哪里泄漏的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 /proc/PID/fd 与 lsof 观察增长类型的诊断路径,并区分管道、socket 与文件泄漏。
围绕“进程能打开多少个文件描述符受什么限制,调优时应改哪个值”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分 RLIMIT_NOFILE、/proc/sys/fs/file-max 和 nr_open 三层限制。
围绕“Linux 中文件描述符在进程内核结构里是如何管理的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 fd 是每进程 fdtable 的索引而非全局编号,以及打开文件表项共享的含义。
围绕“为什么 printf 未换行就 fork 会让子进程重复输出同一段内容”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须归因于用户态 stdio 缓冲随进程复制而内核文件表无此问题。
围绕“数据库类程序该用 fsync 还是 fdatasync,为什么 fsync 是性能杀手”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分是否同步元数据以及等待磁盘确认的开销。
围绕“硬链接与符号链接在 inode 层面的本质区别是什么,为什么硬链接不能跨文件系统”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须从 inode 号共享与路径字符串两种机制解释,并说明 inode 号仅在单文件系统内唯一。
围绕“ext 文件系统的 inode 中保存了哪些元数据,又不保存什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 inode 存权限、时间戳、块指针而不存文件名,文件名在目录项里。
围绕“io_uring 相比 epoll + 线程池做磁盘异步 I/O 解决了什么核心问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明提交/完成双环形队列减少系统调用与拷贝、支持真正的文件异步。
围绕“用 lseek 跳过一段再写会形成稀疏文件,它如何影响磁盘占用与读取结果”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明空洞不落盘、读为零以及 du 与 ls 大小差异。
围绕“同一文件描述符上混用 fwrite 和 write 为什么可能乱序”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出两层缓冲(用户态与内核)各自排队导致顺序错位及 fflush 的作用。
围绕“访问 mmap 区域时收到 SIGBUS 通常是什么文件操作导致的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明映射后文件被截断导致缺页无法映射的机理及防护思路。
围绕“mmap 与 read/write 读写文件的性能与语义差异体现在哪里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须比较拷贝次数、缺页开销与页对齐粒度,并说明 mmap 不天然更快。
围绕“msync 与 madvise 在 mmap 文件使用中分别解决什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分强制回写与访问模式提示两类职责。
围绕“对普通磁盘文件设置 O_NONBLOCK 为什么基本无效”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出非阻塞语义只作用于管道、socket、设备等,磁盘 IO 仍可能阻塞,从而引出 AIO/io_uring 但不展开。
围绕“非阻塞 fd 上 read 返回 EAGAIN 后正确的事件循环写法是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 EAGAIN 表示暂无可读而非错误,以及边缘触发下必须读到 EAGAIN 为止。
围绕“为什么新建文件描述符推荐加 O_CLOEXEC,它解决了哪类问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 exec 时自动关闭避免子进程持有无关 fd,以及 open 与 fcntl 两步设置的竞态。
围绕“使用 O_DIRECT 绕过页缓存时对缓冲区和偏移有什么约束,适合什么场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出内存地址、长度、偏移的对齐要求及数据库自管缓存的典型动机。
围绕“Linux 页缓存如何让普通 read/write 变快,又带来什么内存统计上的误解”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明页缓存是内核透明缓存且可被回收,解释 free 输出中 available 的含义。
围绕“poll 相比 select 改进了什么,又保留了什么共同缺陷”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 pollfd 数组解除数量限制但仍需线性遍历。
围绕“向管道并发写入时,多大以内的写能保证原子性”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 PIPE_BUF 界限及其对日志交织问题的影响。
围绕“为什么「写临时文件 + fsync + rename」是安全的文件更新模式,还缺哪一步”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 rename 原子性,并指出还需 fsync 目录保证目录项持久。
围绕“select 在高并发下的三个主要瓶颈是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须列出 fd 数量上限、每次重置集合、内核到用户态线性扫描。
围绕“inotify 监控大量目录时会遇到什么实际限制,如何应对”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出每 watch 占内核内存且受 max_user_watches 限制,大目录树应改用 fanotify 或轮询。
围绕“sendfile 如何减少静态文件服务的 CPU 开销,它省掉了哪次拷贝”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出省去内核到用户态的一次拷贝与两次上下文切换中的数据搬运。
围绕“为什么启用 TLS 后 sendfile 零拷贝通常失效,内核有什么补救机制”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释用户态加密要求数据进用户态,并引出 kTLS 使加密在内核完成。
围绕“Shell 重定向和守护进程关闭 0/1/2 的实现依赖 dup2 的什么性质”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 dup2 能原子地指定目标 fd 从而替换标准流。
围绕“read/write 返回值小于请求长度一定是错误吗,正确处理姿势是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明短读写在管道、socket、信号中断下正常出现并给出循环重试模式。
围绕“为什么高并发服务用 epoll 而不是信号驱动 I/O(O_ASYNC/SIGIO)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出信号携带信息少、处理函数受限、队列溢出丢失事件。
围绕“splice 和 tee 借助管道缓冲实现了怎样的零拷贝转发”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明数据以内核管道页为中转在用户态不落地,可用于代理转发。
围绕“Linux 文件的 atime、mtime、ctime 分别因什么操作改变”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分内容修改、元数据修改与读取三者,并提 relatime 的折中。
围绕“C 标准库的 stdout 在终端和重定向到文件时缓冲策略为何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 isatty 驱动的行缓冲与全缓冲切换及 setvbuf 控制。
围绕“sync_file_range 为什么适合写前日志(WAL)这类需要细粒度回写的场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明可按字节范围启动回写而不必等待完成,比 fsync 粒度细。
围绕“删除一个仍被进程打开的文件,磁盘空间何时真正释放”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用 inode 的链接计数与打开计数解释空间延迟释放,并指出这在日志清理中的实战后果。
围绕“write 返回成功后,数据到达磁盘的顺序和时机由什么决定”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 write 只保证进页缓存、由 flusher 线程异步写回,及掉电风险。
围绕“进程写文件偶尔卡顿数秒,为什么可能是内核写回限流而非磁盘坏了”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 dirty_ratio/dirty_bytes 触发同步写回导致写阻塞,并给出观察 dirty 计数的路径。
围绕“伙伴系统如何管理物理页框,它如何缓解外部碎片”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确按 2 的幂分裂合并的机制。
围绕“为什么按行遍历二维数组比按列遍历快,缓存局部性如何影响程序性能”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 cache line 预取与空间局部性原理。
围绕“cgroup 内存限额达到上限时容器内进程会发生什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确回收尝试与 cgroup 级 OOM kill 的顺序。
围绕“为什么容器里读 /proc/meminfo 看到的不是自己的限额,应该读什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出 /proc 非命名空间化并给出 cgroup 接口的正确指标。
围绕“fork 之后父子进程如何通过写时复制共享内存页”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确只读共享加写保护触发复制的机制。
围绕“什么是按需调页,exec 一个新程序后为什么能立即开始运行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确页表先建立但页帧延迟分配的机制。
围绕“脏页是如何被写回磁盘的,dirty_ratio 和 dirty_background_ratio 起什么作用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确后台写回与同步阻塞写回两个阈值的行为。
围绕“多线程程序中什么是伪共享(false sharing),如何避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确同缓存行多核失效 ping-pong 的机制与对齐填充手段。
围绕“为什么 fork 一个大内存进程通常很快,什么情况下 fork 会变慢”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确复制页表而非页帧的成本模型及大页表场景。
围绕“大页(Huge Page)为什么能提升数据库等应用的性能”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确减少页表项与 TLB miss 的机制及适用负载。
围绕“KSM 内核同页合并如何为虚拟化场景节省内存”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确扫描合并相同页的机制与 CPU 开销。
围绕“Linux 如何通过 LRU 链表管理可回收页面”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 active/inactive 链表的页面迁移规则。
围绕“madvise 的 MADV_DONTNEED 和 MADV_WILLNEED 分别解决什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确丢弃与预读提示的行为及风险。
围绕“malloc 分配小内存和大内存分别走 brk 和 mmap 的原因是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确堆扩展与独立映射的碎片和归还差异。
围绕“为什么 free 之后进程的 RSS 往往不会立即下降”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确分配器缓存与堆顶归还条件。