到目前为止,我正试图让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.30
,ruby-2.3.0
,postgresql-9.4
,pg-0.19.0
,rails-5.0.0.1
。 unicorn-5.1.0
也是如此。该应用正在lxc
容器中运行。主机和客户操作系统为ubuntu/xenial
。
答案 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