背景:
最近我的 Rails 服务器出现问题,它会停止响应,需要反弹才能恢复运行。这个问题是由于 Controller 在接收到 POST 时进行一些 fork ,以进行一些重量级的并发处理——服务器响应时间不断增加,直到服务器完全停止响应。我很确定我已经解决了这个问题(在 fork 上复制的数据库连接没有在子进程中关闭),但是权威测试会很棒。
问题:
有没有办法从我的 Rails 应用程序中监控打开的文件描述符?它在 Linux 上运行,所以我一直在使用 proc
文件系统和 lsof
命令来观察打开的文件描述符;这很困惑,因为它只为您提供当前进程的快照。理想情况下,我想在处理之前、期间和之后打印父进程和子进程中打开的文件描述符,以确保文件描述符不会在他们欢迎之后保持打开状态。
最佳答案
要考虑的一种方法(可能是最简单的)是使用某种后台 worker ,例如使用 Workling,并使其每隔一段时间运行 lsof
,并使用语法获取输出:
`lsof | grep something` # shell command example.
像 lsof
这样的程序如果运行得太频繁,确实会影响性能。也许每 10 到 30 秒。也许下降到 5 秒,但这确实插入了它。我假设您有专用服务器或强大的虚拟机。
在您的后台工作程序中,您可以将这些命令结果存储到一个变量中,或者将其 grep 到您真正要查找的内容(如所示),并根据需要访问/操作数据。
关于linux - 如何在 Ruby on Rails 中监控打开的文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7578041/