背景:
最近,我的Rails服务器出现了一个问题,它将停止响应,需要反弹才能恢复运行。这个问题是由于一个控制器在收到POST后进行一些分叉,以进行一些繁重的并发处理——服务器响应时间不断增加,直到服务器完全停止响应。我很确定我已经解决了这个问题(在fork上复制的数据库连接在子进程中没有关闭(,但权威性地测试一下会很好。
问题:
有没有一种方法可以从我的Rails应用程序中监控打开的文件描述符?它在Linux上运行,所以我一直在使用proc
文件系统和lsof
命令来观察打开的文件描述符;这很混乱,因为它只提供了当前流程的快照。理想情况下,我希望在处理之前、期间和之后在父进程和子进程中打印打开的文件描述符,以确保文件描述符不会保持打开状态。
需要考虑的一种方法(可能是最简单的(是使用某种后台工作程序,例如Workling,并使其每隔一段时间运行lsof
,并使用语法获取输出:
`lsof | grep something` # shell command example.
如果运行过于频繁,像lsof
这样的程序确实会影响性能。也许每隔10到30秒。也许可以降到5秒,但这真的很难。我假设你有一台专用服务器或一台野兽般的虚拟机。
在后台工作程序中,您可以将这些命令结果存储到一个变量中,或者将其grep为您真正想要的结果(如图所示(,并根据需要访问/操作数据。