请求卡在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下运行它。

这是一些相关的 链接 。

我使用的是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应用程序。 它首先产生预加载器进程,它加载框架和所有库。 之后,预加载器进程在需要时生成工作进程,处理请求。 在生成工作进程时,所有文件描述符都从预加载器进程inheritance。 因此,如果您不重新建立与数据库的连接,则所有工作进程共享一个,由预加载器建立。 这会导致各种奇怪的行为。 喜欢请求花费太长时间。

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

更多相关信息:

如果使用带有代码预加载的分叉Web服务器,请断开连接
无意的文件描述符共享
在子URI下的同一主机和端口上运行Action Cable服务器