打开的文件太多

主要观点:在一个大型 Rust 项目中,运行cargo test时因文件描述符过多导致所有测试失败,通过对文件描述符的研究和相关命令的使用,找到问题根源是 shell 的软限制导致,并通过ulimit命令提高软限制解决了该问题。
关键信息

  • 文件描述符可代表多种资源,如常规文件、目录、管道、套接字、设备等,每个 Unix 进程开始自动打开至少三个标准文件描述符(0:标准输入,1:标准输出,2:标准错误)。
  • 不同操作系统对每个进程可打开的文件描述符数量有限制,如 macOS 的kern.maxfiles(系统全局最大文件描述符数)、kern.maxfilesperproc(单个进程的硬限制)和ulimit -n(shell 的软限制)。
  • 可使用lsof命令检查打开的文件描述符,通过创建监控脚本可观察cargo test进程的文件描述符数量变化,当达到软限制时测试失败,提高软限制后cargo test正常运行。
    重要细节
  • 在 macOS 中通过sysctl命令查看系统限制,在终端运行相关命令可获取限制值。
  • 监控脚本通过pgrep找到cargo test的进程 ID,使用lsof过滤并统计打开的文件描述符数量,每秒钟打印一次状态,遇到Ctrl+C退出。
  • 实际运行中由于 Rust 运行速度快和监控脚本速度慢,未能精确捕捉到达到软限制的时刻,但能看到测试在文件描述符达到 237 左右开始失败,提高软限制到 8192 后运行正常,新的软限制下最大文件描述符数量约为 1600。
阅读 10
0 条评论