too many open files(打开文件数超限)

  1. 查看当前传话限制:
  2. ulimit -n
  3. 根据PID查看:
  4. cat /proc/PID/limits 看 Max open files
  5. 修改系统全局 limits(所有用户生效)
  6. vi /etc/security/limits.conf
  7. 文件末尾追加:
  8. * soft nofile 65535
  9. * hard nofile 65535
  10. root soft nofile 65535
  11. root hard nofile 65535
  12. 修改 systemd 服务配置(关键!systemd 会单独限制进程句柄)
  13. vi /etc/systemd/system/xxx.service
  14. [Service]
  15. LimitNOFILE=65535
  16. # 原有配置保留,只加上面这一行
  17. 重载 systemd、重启服务
  18. # 重新加载systemd配置
  19. systemctl daemon-reload
  20. # 重启你的xxx服务
  21. systemctl restart xxx

/proc 文件系统完整讲解(结合你刚才的 too many open files 场景)

1. 本质是什么

/proc 不是真实磁盘文件夹,是 Linux 虚拟内存文件系统,内核实时把当前系统、进程、硬件的运行状态,以文件/目录形式暴露出来。

  • 不占用硬盘空间,数据全在内存里;
  • 读取文件时内核实时计算返回最新状态;
  • 很多文件可写入,用来修改内核运行参数。

2. 两大类目录

① 数字命名文件夹:/proc/[PID] 进程目录(你刚才用到的)

每个正在运行的程序,都会在 /proc 下生成以进程PID号命名的文件夹,专门存放该进程全部运行信息。 以你日志里 PID=1191 的 go 程序 /proc/1191 举例,里面关键文件:

  1. /proc/1191/limits 就是你刚才查看文件句柄上限的文件,记录该进程生效的资源限制:最大打开文件数、最大线程、内存限制等。 之前你改了系统 limits.conf 但程序还是报错,就是因为 systemd 单独限制进程,这里能直接看到真实生效值。
  2. /proc/1191/fd fd = file descriptor(文件描述符/句柄) 目录里每一个数字文件,代表进程打开的资源:TCP连接、数据库连接、日志文件、socket、标准输入输出等。 排查你 too many open files 核心命令:
    1. ls /proc/1191/fd | wc -l
    数字就是当前进程占用的全部句柄数量,持续暴涨=代码泄漏。
  3. /proc/1191/cmdline:启动这个程序的完整命令
  4. /proc/1191/status:进程内存、线程、CPU、句柄统计
  5. /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 排查:

  1. cat /proc/1191/limits → 确认进程真实最大句柄数,区分是系统限制还是systemd限制;
  2. ls /proc/1191/fd | wc -l → 实时看当前占用多少句柄,判断是否代码泄漏;
  3. ls -l /proc/1191/fd → 逐条看哪些文件/连接占用句柄,定位泄漏来源(数据库连接、HTTP请求、日志文件等)。

4. 补充小提示

  • 进程一旦结束,对应的 /proc/PID 文件夹会立刻消失;
  • 普通用户只能看自己启动的进程,root能查看全部进程;
  • 修改 /proc/sys 下文件是临时生效,重启服务器失效,永久配置要改 /etc/sysctl.conf。