请求卡在 PG::Connection#async_exec

Requests get stuck in PG::Connection#async_exec

我正在尝试让 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 下尝试 运行。

这里有一些 links.

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

我们开始重新建立与数据库的连接后,问题已解决。我们在项目中使用 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