too many open files(打开文件数超限)
查看当前传话限制:ulimit -n根据PID查看:cat /proc/PID/limits 看 Max open files修改系统全局 limits(所有用户生效)vi /etc/security/limits.conf文件末尾追加:* soft nofile 65535* hard nofile 65535root soft nofile 65535root hard nofile 65535修改 systemd 服务配置(关键!systemd 会单独限制进程句柄)vi /etc/systemd/system/xxx.service[Service]LimitNOFILE=65535# 原有配置保留,只加上面这一行重载 systemd、重启服务# 重新加载systemd配置systemctl daemon-reload# 重启你的xxx服务systemctl restart xxx
/proc 文件系统完整讲解(结合你刚才的 too many open files 场景)
1. 本质是什么
/proc 不是真实磁盘文件夹,是 Linux 虚拟内存文件系统,内核实时把当前系统、进程、硬件的运行状态,以文件/目录形式暴露出来。
- 不占用硬盘空间,数据全在内存里;
- 读取文件时内核实时计算返回最新状态;
- 很多文件可写入,用来修改内核运行参数。
2. 两大类目录
① 数字命名文件夹:/proc/[PID] 进程目录(你刚才用到的)
每个正在运行的程序,都会在 /proc 下生成以进程PID号命名的文件夹,专门存放该进程全部运行信息。
以你日志里 PID=1191 的 go 程序 /proc/1191 举例,里面关键文件:
/proc/1191/limits就是你刚才查看文件句柄上限的文件,记录该进程生效的资源限制:最大打开文件数、最大线程、内存限制等。 之前你改了系统limits.conf但程序还是报错,就是因为 systemd 单独限制进程,这里能直接看到真实生效值。/proc/1191/fdfd = file descriptor(文件描述符/句柄) 目录里每一个数字文件,代表进程打开的资源:TCP连接、数据库连接、日志文件、socket、标准输入输出等。 排查你too many open files核心命令:
数字就是当前进程占用的全部句柄数量,持续暴涨=代码泄漏。ls /proc/1191/fd | wc -l
/proc/1191/cmdline:启动这个程序的完整命令/proc/1191/status:进程内存、线程、CPU、句柄统计/proc/1191/net:该进程所有网络连接(TCP/UDP)
② 非数字全局文件:系统整体信息
/proc/cpuinfo:CPU型号、核心数/proc/meminfo:内存使用情况/proc/loadavg:系统负载/proc/sys/:内核可调参数(可临时改系统限制) 比如调最大文件句柄全局上限:/proc/sys/fs/file-max
3. 和你报错场景关联总结
你遇到 accept4: too many open files,全程依赖 /proc 排查:
cat /proc/1191/limits→ 确认进程真实最大句柄数,区分是系统限制还是systemd限制;ls /proc/1191/fd | wc -l→ 实时看当前占用多少句柄,判断是否代码泄漏;ls -l /proc/1191/fd→ 逐条看哪些文件/连接占用句柄,定位泄漏来源(数据库连接、HTTP请求、日志文件等)。
4. 补充小提示
- 进程一旦结束,对应的
/proc/PID文件夹会立刻消失; - 普通用户只能看自己启动的进程,root能查看全部进程;
- 修改
/proc/sys下文件是临时生效,重启服务器失效,永久配置要改/etc/sysctl.conf。
