线上进程文件描述符持续上涨,如何定位是哪里泄漏的?
线上进程文件描述符持续上涨,如何定位是哪里泄漏的? 本文先给出可直接复述的结论,再用最小代码说明文件描述符泄漏 排查 /proc/pid/fd lsof的工作方式、判断依据、项目边界和常见误区。
程序员面试题库第 63 页,收录第 3101–3150 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
线上进程文件描述符持续上涨,如何定位是哪里泄漏的? 本文先给出可直接复述的结论,再用最小代码说明文件描述符泄漏 排查 /proc/pid/fd lsof的工作方式、判断依据、项目边界和常见误区。
进程能打开多少个文件描述符受什么限制,调优时应改哪个值? 本文先给出可直接复述的结论,再用最小代码说明ulimit nofile rlimit 文件描述符上限的工作方式、判断依据、项目边界和常见误区。
Linux 中文件描述符在进程内核结构里是如何管理的? 本文先给出可直接复述的结论,再用最小代码说明Linux 文件描述符表 files_struct的工作方式、判断依据、项目边界和常见误区。
为什么 printf 未换行就 fork 会让子进程重复输出同一段内容? 本文先给出可直接复述的结论,再用最小代码说明fork printf 重复输出 用户态缓冲区的工作方式、判断依据、项目边界和常见误区。
数据库类程序该用 fsync 还是 fdatasync,为什么 fsync 是性能杀手? 本文先给出可直接复述的结论,再用最小代码说明fsync fdatasync 区别 性能 持久化的工作方式、判断依据、项目边界和常见误区。
硬链接与符号链接在 inode 层面的本质区别是什么,为什么硬链接不能跨文件系统? 本文先给出可直接复述的结论,再用最小代码说明硬链接 软链接 inode 区别 跨文件系统的工作方式、判断依据、项目边界和常见误区。
ext 文件系统的 inode 中保存了哪些元数据,又不保存什么? 本文先给出可直接复述的结论,再用最小代码说明inode 元数据 不含文件名的工作方式、判断依据、项目边界和常见误区。
io_uring 相比 epoll + 线程池做磁盘异步 I/O 解决了什么核心问题? 本文先给出可直接复述的结论,再用最小代码说明io_uring 共享环形队列 系统调用次数 异步IO的工作方式、判断依据、项目边界和常见误区。
用 lseek 跳过一段再写会形成稀疏文件,它如何影响磁盘占用与读取结果? 本文先给出可直接复述的结论,再用最小代码说明lseek 稀疏文件 空洞 磁盘占用的工作方式、判断依据、项目边界和常见误区。
同一文件描述符上混用 fwrite 和 write 为什么可能乱序? 本文先给出可直接复述的结论,再用最小代码说明混用 stdio 与系统调用 缓冲 乱序的工作方式、判断依据、项目边界和常见误区。
访问 mmap 区域时收到 SIGBUS 通常是什么文件操作导致的? 本文先给出可直接复述的结论,再用最小代码说明mmap SIGBUS truncate 文件截断的工作方式、判断依据、项目边界和常见误区。
mmap 与 read/write 读写文件的性能与语义差异体现在哪里? 本文先给出可直接复述的结论,再用最小代码说明mmap 与 read 区别 零拷贝 缺页的工作方式、判断依据、项目边界和常见误区。
msync 与 madvise 在 mmap 文件使用中分别解决什么问题? 本文先给出可直接复述的结论,再用最小代码说明msync madvise mmap 脏页回写 预读的工作方式、判断依据、项目边界和常见误区。
对普通磁盘文件设置 O_NONBLOCK 为什么基本无效? 本文先给出可直接复述的结论,再用最小代码说明O_NONBLOCK 普通文件 无效 磁盘 IO 阻塞的工作方式、判断依据、项目边界和常见误区。
非阻塞 fd 上 read 返回 EAGAIN 后正确的事件循环写法是什么? 本文先给出可直接复述的结论,再用最小代码说明O_NONBLOCK EAGAIN 非阻塞 循环读取的工作方式、判断依据、项目边界和常见误区。
为什么新建文件描述符推荐加 O_CLOEXEC,它解决了哪类问题? 本文先给出可直接复述的结论,再用最小代码说明O_CLOEXEC exec 文件描述符泄漏的工作方式、判断依据、项目边界和常见误区。
使用 O_DIRECT 绕过页缓存时对缓冲区和偏移有什么约束,适合什么场景? 本文先给出可直接复述的结论,再用最小代码说明O_DIRECT 对齐 绕过页缓存 应用场景的工作方式、判断依据、项目边界和常见误区。
Linux 页缓存如何让普通 read/write 变快,又带来什么内存统计上的误解? 本文先给出可直接复述的结论,再用最小代码说明page cache 页缓存 buff/cache free 内存的工作方式、判断依据、项目边界和常见误区。
poll 相比 select 改进了什么,又保留了什么共同缺陷? 本文先给出可直接复述的结论,再用最小代码说明poll select 区别 共同缺陷 O(n)的工作方式、判断依据、项目边界和常见误区。
向管道并发写入时,多大以内的写能保证原子性? 本文先给出可直接复述的结论,再用最小代码说明PIPE_BUF 管道写原子性的工作方式、判断依据、项目边界和常见误区。
为什么「写临时文件 + fsync + rename」是安全的文件更新模式,还缺哪一步? 本文先给出可直接复述的结论,再用最小代码说明rename 原子替换 崩溃一致性 fsync 目录的工作方式、判断依据、项目边界和常见误区。
select 在高并发下的三个主要瓶颈是什么? 本文先给出可直接复述的结论,再用最小代码说明select FD_SETSIZE 1024 遍历 性能瓶颈的工作方式、判断依据、项目边界和常见误区。
inotify 监控大量目录时会遇到什么实际限制,如何应对? 本文先给出可直接复述的结论,再用最小代码说明inotify 监控目录 watch 上限 max_user_watches的工作方式、判断依据、项目边界和常见误区。
sendfile 如何减少静态文件服务的 CPU 开销,它省掉了哪次拷贝? 本文先给出可直接复述的结论,再用最小代码说明sendfile 零拷贝 静态文件服务的工作方式、判断依据、项目边界和常见误区。
为什么启用 TLS 后 sendfile 零拷贝通常失效,内核有什么补救机制? 本文先给出可直接复述的结论,再用最小代码说明sendfile TLS kTLS 零拷贝 失效的工作方式、判断依据、项目边界和常见误区。
Shell 重定向和守护进程关闭 0/1/2 的实现依赖 dup2 的什么性质? 本文先给出可直接复述的结论,再用最小代码说明dup2 标准输出重定向 实现原理的工作方式、判断依据、项目边界和常见误区。
read/write 返回值小于请求长度一定是错误吗,正确处理姿势是什么? 本文先给出可直接复述的结论,再用最小代码说明read write 短读 短写 部分读写的工作方式、判断依据、项目边界和常见误区。
为什么高并发服务用 epoll 而不是信号驱动 I/O(O_ASYNC/SIGIO)? 本文先给出可直接复述的结论,再用最小代码说明信号驱动IO SIGIO epoll 对比的工作方式、判断依据、项目边界和常见误区。
splice 和 tee 借助管道缓冲实现了怎样的零拷贝转发? 本文先给出可直接复述的结论,再用最小代码说明splice tee 管道 零拷贝 转发的工作方式、判断依据、项目边界和常见误区。
Linux 文件的 atime、mtime、ctime 分别因什么操作改变? 本文先给出可直接复述的结论,再用最小代码说明atime mtime ctime 区别 修改时间的工作方式、判断依据、项目边界和常见误区。
C 标准库的 stdout 在终端和重定向到文件时缓冲策略为何不同? 本文先给出可直接复述的结论,再用最小代码说明stdio 行缓冲 全缓冲 stdout 重定向的工作方式、判断依据、项目边界和常见误区。
sync_file_range 为什么适合写前日志(WAL)这类需要细粒度回写的场景? 本文先给出可直接复述的结论,再用最小代码说明sync_file_range 异步回写 WAL 细粒度的工作方式、判断依据、项目边界和常见误区。
删除一个仍被进程打开的文件,磁盘空间何时真正释放? 本文先给出可直接复述的结论,再用最小代码说明unlink 打开文件 磁盘空间 inode 引用计数的工作方式、判断依据、项目边界和常见误区。
write 返回成功后,数据到达磁盘的顺序和时机由什么决定? 本文先给出可直接复述的结论,再用最小代码说明write 写回 dirty page 回写 落盘时机的工作方式、判断依据、项目边界和常见误区。
进程写文件偶尔卡顿数秒,为什么可能是内核写回限流而非磁盘坏了? 本文先给出可直接复述的结论,再用最小代码说明写回限流 dirty_ratio 写卡顿 诊断的工作方式、判断依据、项目边界和常见误区。
伙伴系统如何管理物理页框,它如何缓解外部碎片? 本文先给出可直接复述的结论,再用最小代码说明伙伴系统 buddy allocator 物理页的工作方式、判断依据、项目边界和常见误区。
为什么按行遍历二维数组比按列遍历快,缓存局部性如何影响程序性能? 本文先给出可直接复述的结论,再用最小代码说明缓存局部性 行优先 遍历 性能的工作方式、判断依据、项目边界和常见误区。
cgroup 内存限额达到上限时容器内进程会发生什么? 本文先给出可直接复述的结论,再用最小代码说明cgroup 内存限制 memory.max OOM 容器的工作方式、判断依据、项目边界和常见误区。
为什么容器里读 /proc/meminfo 看到的不是自己的限额,应该读什么? 本文先给出可直接复述的结论,再用最小代码说明容器内存监控 memory.current 与 /proc/meminfo 不一致的工作方式、判断依据、项目边界和常见误区。
fork 之后父子进程如何通过写时复制共享内存页? 本文先给出可直接复述的结论,再用最小代码说明fork 写时复制 copy on write的工作方式、判断依据、项目边界和常见误区。
什么是按需调页,exec 一个新程序后为什么能立即开始运行? 本文先给出可直接复述的结论,再用最小代码说明按需调页 demand paging 惰性加载的工作方式、判断依据、项目边界和常见误区。
脏页是如何被写回磁盘的,dirty_ratio 和 dirty_background_ratio 起什么作用? 本文先给出可直接复述的结论,再用最小代码说明脏页写回 dirty_ratio 参数的工作方式、判断依据、项目边界和常见误区。
多线程程序中什么是伪共享(false sharing),如何避免? 本文先给出可直接复述的结论,再用最小代码说明伪共享 false sharing 缓存行 多线程的工作方式、判断依据、项目边界和常见误区。
为什么 fork 一个大内存进程通常很快,什么情况下 fork 会变慢? 本文先给出可直接复述的结论,再用最小代码说明fork 性能 页表复制 开销的工作方式、判断依据、项目边界和常见误区。
大页(Huge Page)为什么能提升数据库等应用的性能? 本文先给出可直接复述的结论,再用最小代码说明Huge Page 大页 TLB 性能的工作方式、判断依据、项目边界和常见误区。
KSM 内核同页合并如何为虚拟化场景节省内存? 本文先给出可直接复述的结论,再用最小代码说明KSM 同页合并 内存去重的工作方式、判断依据、项目边界和常见误区。
Linux 如何通过 LRU 链表管理可回收页面? 本文先给出可直接复述的结论,再用最小代码说明Linux LRU 链表 active inactive 页面回收的工作方式、判断依据、项目边界和常见误区。
madvise 的 MADV_DONTNEED 和 MADV_WILLNEED 分别解决什么问题? 本文先给出可直接复述的结论,再用最小代码说明madvise DONTNEED WILLNEED 用途的工作方式、判断依据、项目边界和常见误区。
malloc 分配小内存和大内存分别走 brk 和 mmap 的原因是什么? 本文先给出可直接复述的结论,再用最小代码说明malloc brk mmap 分配阈值的工作方式、判断依据、项目边界和常见误区。
为什么 free 之后进程的 RSS 往往不会立即下降? 本文先给出可直接复述的结论,再用最小代码说明free 内存不释放 RSS glibc的工作方式、判断依据、项目边界和常见误区。