请求卡在PG :: Connection #async_exec中

时间:2016-10-14 13:39:45

标签: ruby-on-rails ruby postgresql passenger

到目前为止,我正试图让rails应用程序在passenger下工作,但没有运气。它使用sequel连接到postgresql。请求随机需要花费太多时间才能完成。我能够找到应用程序花费时间的地方:

 %self      total      self      wait     child     calls  name
 99.92     65.713    65.713     0.000     0.000        5   PG::Connection#async_exec
  0.00      0.002     0.002     0.000     0.000      264   Set#delete
...

据说,webrick不会发生这种情况,我将尝试在unicorn下运行它。

以下是一些related links

我正在使用passenger-5.0.30ruby-2.3.0postgresql-9.4pg-0.19.0rails-5.0.0.1unicorn-5.1.0也是如此。该应用正在lxc容器中运行。主机和客户操作系统为ubuntu/xenial

1 个答案:

答案 0 :(得分:0)

我们开始重新建立与数据库的连接后问题得以解决。我们在项目中使用sequel,而Passenger仅在使用ActiveRecord时处理问题。

为了对其进行扩展,默认情况下,Passenger使用智能生成来处理ruby应用程序。它首先产生预加载器进程,它加载框架和所有库。之后,预加载器进程在需要时生成工作进程,处理请求。当产生工作进程时,所有文件描述符都从预加载器进程继承。因此,如果您不重新建立与数据库的连接,则所有工作进程共享一个,由预加载器建立。这会导致各种奇怪的行为。像请求花了太长时间。

在此之前,我们还将处理WebSocket连接转移到单独的进程。但是不确定它是否有助于解决这个问题。

更多相关内容:

Disconnect If Using Forking Webserver with Code Preloading
Unintentional file descriptor sharing
Running the Action Cable server on the same host and port, under a sub-URI