主要观点:在一个大型 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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。