Rack :: Lock#调用太多时间

时间:2016-04-29 07:34:22

标签: ruby-on-rails ruby mongodb nginx puma

Newrelic说2[System.Data.DataRow,System.Object]],System.Object]大约需要9秒。

请参阅下面的快照:

http://prntscr.com/ay7ccx

我们有以下服务器配置

  • Ubuntu 14.04 64位
  • Puma有2个工人,1到6个最大线程
  • Nginx作为前端
  • Rails 4和Ruby 2
  • 7 GB RAM和4核心cpu

任何人都可以帮助解决为什么在中间件中花费这么多时间吗?

1 个答案:

答案 0 :(得分:0)

这听起来像rails的多线程模式已关闭。这会添加func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { //This is the stream IO function. It allows RW of the stream switch (eventCode){ case NSStreamEvent.ErrorOccurred: NSLog("ErrorOccurred") break case NSStreamEvent.EndEncountered: NSLog("EndEncountered") break case NSStreamEvent.None: NSLog("None") break case NSStreamEvent.HasBytesAvailable: NSLog("HasBytesAvaible") var buffer = [UInt8](count: 4096, repeatedValue: 0) if ( aStream == inputstream){ while (inputstream.hasBytesAvailable){ var len = inputstream.read(&buffer, maxLength: buffer.count) if(len > 0){ var output = NSString(bytes: &buffer, length: buffer.count, encoding: NSUTF8StringEncoding) if (output != ""){ NSLog("server said: %@", output!) } } } } break case NSStreamEvent.allZeros: NSLog("allZeros") break case NSStreamEvent.OpenCompleted: NSLog("OpenCompleted") break case NSStreamEvent.HasSpaceAvailable: NSLog("HasSpaceAvailable") break default: // default code here break } 中间件,后者又使用互斥锁来确保每个rails实例一次处理一个请求。您看到的数字表明这导致请求在您的rails实例中排队。

这是Rack::Lock设置的控制器,默认为false。

作为旁注,MRI并不擅长于concurency(如果你是cpu绑定的) - 你可能最好用更少的线程运行更多的工人。您也可以切换到jruby(没有GIL),但这显然是一项更大的任务。