Rails Thread Starvation

时间:2012-09-18 00:15:46

标签: ruby-on-rails ruby multithreading memory-leaks rake

我目前正在开发一项IMAP服务,该服务从Gmail中提取用户电子邮件的滑动窗口,并出于性能原因将其存储在本地。传输,解码和存储电子邮件是可行的,但是通过IMAP IDLE命令闲置的线程在保持活动方面遇到了困难。

会发生什么?线程通过运行rake任务启动,每个用户有一个线程。这工作正常,如果IMAP IDLE信号丢失,连接重置或线程死亡,我将重新启动有问题的线程。但代码似乎导致内存泄漏或其他原因,导致线程饥饿。换句话说,由于没有收到IMAP IDLE信号,线程被成功识别为已死,但是当我尝试重新启动它们时,线程将不会自行执行。

更具体地说,内存使用量在几天内从 64 MiB增加到> 300 MiB ,可能导致线程不足。不过,我对此并不确定。在暂存计算机上使用较少的线程(仅15个用户= 15个线程,以及Ruby IMAP库中的15个额外线程)进行调试时,并计算创建的对象,只能识别出可忽略不计的内存使用量增加。

因此我的问题是......;)

  • 如何正确调试?
  • Ruby是否存在线程饥饿问题?我们也尝试了JRuby,但无济于事。
  • 是否有其他人遇到或有其他人遇到类似问题?

1 个答案:

答案 0 :(得分:0)

这是一个很长的镜头,但如果您怀疑,您的代码或某些库泄漏了线程或内存,您可以尝试使用JRuby版本的应用程序Plumbr。 Plumbr主要用于在Java应用程序中查找内存泄漏,但我们也有一些基于JVM的语言的成功案例。