确认是文件描述符(fd)耗尽:日志中出现“too many open files”“emfile”等提示,或连接静默丢弃、http 500无堆栈、nginx 502无上游错误等伪装现象;结合cat /proc/sys/fs/file-nr和lsof -p pid验证用量与占用分布,区分配置不足与真实泄漏。

直接看日志里有没有 “Too many open files”、“EMFILE” 或 “open failed (24: Too many open files)” 这类明确提示,基本就能确认是文件描述符(FD)耗尽导致的拒绝服务。重点不是找“错误”,而是找“失败但没报错”的现象——比如连接被静默丢弃、HTTP 500 响应里没有堆栈、Nginx 返回 502 却查不到 upstream 错误,这些往往是 FD 耗尽的典型伪装。
查日志时盯紧这三类线索
别只 grep “error”,要结合上下文和时间线交叉验证:
-
服务日志中的“打开失败”类语句:比如 Nginx 报
open("/var/log/nginx/access.log") failed (24: Too many open files);Java 应用抛java.io.IOException: Too many open files;MySQL 出现Can't create thread (Errno: 11)(其实是创建 socket 失败) -
systemd 服务状态异常:运行
systemctl status your-service,如果看到Active: failed或Exited with code=exited, status=1/FAILURE,再配合journalctl -u your-service --since "1 hour ago"查最近日志,往往在崩溃前几秒就有 FD 相关报错 -
内核或系统级提示:执行
dmesg -T | grep -i "file descriptor\|EMFILE",有时内核会在资源紧张时打 warning;journalctl -k --since "1 day ago" | grep -i "limit"也能发现隐性告警
快速定位哪个进程在吃光 FD
光看日志不够,得马上确认是不是真耗尽、谁在占用:
- 查系统总用量:
cat /proc/sys/fs/file-nr—— 第二列是当前已用 FD 数,接近第三列(file-max)就危险 - 查单个服务用了多少:
ls /proc/$(pgrep -f "your-service-name")/fd/ 2>/dev/null | wc -l - 全系统按 FD 数排序找出“大户”:
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head -5 - 对高嫌疑 PID,看它开了啥:
lsof -p PID | awk '$5 ~ /^(REG|IPv4|IPv6|pipe|anon_inode)$/ {print $5,$9}' | sort | uniq -c | sort -nr | head -10,重点关注大量 socket、eventpoll 或未关闭的日志文件
区分是配置不足还是真的泄漏
调大限制能临时缓解,但掩盖问题只会让故障延迟爆发:
- 如果
lsof -p PID显示大量CLOSE_WAITsocket 或重复路径的日志文件(如/var/log/app.log.1、/var/log/app.log.2…),大概率是应用没关闭流或轮转逻辑有缺陷 - 如果 FD 类型高度集中(比如全是
IPv4),且连接数随请求量线性增长、不回落,说明连接没复用或没设超时,不是泄漏,是配置不合理 - Java 应用注意
FileInputStream、Socket、OkHttpClientresponse body 是否都 close;Go 注意defer是否覆盖所有 return 分支;Nginx 检查worker_connections和worker_rlimit_nofile是否匹配
调参后必须验证是否生效
改了配置不等于进程真拿到了新限制:
- 用户级 limits 修改后,得重新登录或新开 shell 才生效;systemd 服务必须加
LimitNOFILE=65536到 service 文件里,并执行systemctl daemon-reload && systemctl restart your-service - 重启后立刻验证:
cat /proc/$(pgrep -f "your-service")/limits | grep "Max open files",确保软硬限制值已更新 - 同时跑
ls /proc/PID/fd/ | wc -l对比重启前后数值,确认实际使用量是否可控、是否持续缓慢上涨











