为什么我的Rails应用程序挂起?

我有一个运行在Apache / Passenger下的适度复杂的Rails应用程序,闲置一段时间后变得没有响应。 这需要几分钟的时间来响应,但可以通过重新启动Web服务器暂时恢复。

服务器负载是微不足道的,因为它是一个内部应用程序,很less有并发用户。

我也试过nginx,所以这不是Apache导致的问题。

Apache或Rails日志中没有任何有用的东西。 根据Passenger文档,我发送了一个SIGABRT并且有一个堆栈跟踪(在下面)。 它的数据库不是重载,我试过禁用任何可能导致locking的后台处理。

 SignalException(SIGABRT):
  乘客(3.0.17)lib / phusion_passenger / abstract_request_handler.rb:443:在`block in install_useful_signal_handlers'
   activerecord(3.2.8)lib / active_record / connection_adapters / mysql2_adapter.rb:73:在`call'
   activerecord(3.2.8)lib / active_record / connection_adapters / mysql2_adapter.rb:73:在'ping'
   activerecord(3.2.8)lib / active_record / connection_adapters / mysql2_adapter.rb:73:在`active?'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract_adapter.rb:219:在`verify!'中
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:327:in`block in checkout_and_verify'
   activesupport(3.2.8)lib / active_support / callbacks.rb:403:在_run__352340970312725798__checkout__1600727162984137669__callbacks'
   activesupport(3.2.8)lib / active_support / callbacks.rb:405:在`__run_callback'
   activesupport(3.2.8)lib / active_support / callbacks.rb:385:在`_run_checkout_callbacks'
   activesupport(3.2.8)lib / active_support / callbacks.rb:81:在`run_callbacks'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:326:in`checkout_and_verify'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:247:在`block(2 levels)in checkout'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:236:在`loop'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:236:在`block in checkout'
   /home/uuuuu/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in`mon_synchronize'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:233:在`checkout'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:96:在`block in connection'
   /home/uuuuu/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/monitor.rb:211:in`mon_synchronize'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:95:在`connection'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:404:在'retrieve_connection'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_specification.rb:170:在'retrieve_connection'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_specification.rb:144:在`connection'
   activerecord(3.2.8)lib / active_record / query_cache.rb:61:在`call'
   activerecord(3.2.8)lib / active_record / connection_adapters / abstract / connection_pool.rb:473:在`call'
   actionpack(3.2.8)lib / action_dispatch / middleware / callbacks.rb:28:在`block in call'
   activesupport(3.2.8)lib / active_support / callbacks.rb:405:在_run__1086758471249540907__call__1600727162984137669__callbacks'
   activesupport(3.2.8)lib / active_support / callbacks.rb:405:在`__run_callback'
   activesupport(3.2.8)lib / active_support / callbacks.rb:385:在`_run_call_callbacks'
   activesupport(3.2.8)lib / active_support / callbacks.rb:81:在`run_callbacks'
   actionpack(3.2.8)lib / action_dispatch / middleware / callbacks.rb:27:在`call'
   actionpack(3.2.8)lib / action_dispatch / middleware / remote_ip.rb:31:在`call'
   actionpack(3.2.8)lib / action_dispatch / middleware / debug_exceptions.rb:16:在`call'
   actionpack(3.2.8)lib / action_dispatch / middleware / show_exceptions.rb:56:在`call'
   railties(3.2.8)lib / rails / rack / logger.rb:26:在`call_app'
   railties(3.2.8)lib / rails / rack / logger.rb:16:在`call'
   actionpack(3.2.8)lib / action_dispatch / middleware / request_id.rb:22:在`call'
   rack(1.4.1)lib / rack / methodoverride.rb:21:在`call'
   rack(1.4.1)lib / rack / runtime.rb:17:在`call'
   activesupport(3.2.8)lib / active_support / cache / strategy / local_cache.rb:72:在`call'
   rack(1.4.1)lib / rack / lock.rb:15:在`call'
   actionpack(3.2.8)lib / action_dispatch / middleware / static.rb:62:在`call'
   rack-cache(1.2)lib / rack / cache / context.rb:136:在'forward'
   rack-cache(1.2)lib / rack / cache / context.rb:245:在`fetch'
   rack-cache(1.2)lib / rack / cache / context.rb:185:在`lookup'
   rack-cache(1.2)lib / rack / cache / context.rb:66:在`call!'中
   rack-cache(1.2)lib / rack / cache / context.rb:51:在`call'
   railties(3.2.8)lib / rails / engine.rb:479:在`call'
   railties(3.2.8)lib / rails / application.rb:223:在`call'
   railties(3.2.8)lib / rails / railtie / configurable.rb:30:在`method_missing'
   rack-pjax(0.6.0)lib / rack / pjax.rb:12:在`call'
  乘客(3.0.17)lib / phusion_passenger / rack / request_handler.rb:96:在`process_request'
  乘客(3.0.17)lib / phusion_passenger / abstract_request_handler.rb:516:在`accept_and_process_next_request'
  乘客(3.0.17)lib / phusion_passenger / abstract_request_handler.rb:274:在`main_loop'
  乘客(3.0.17)lib / phusion_passenger / rack / application_spawner.rb:206:在`start_request_handler'
  乘客(3.0.17)lib / phusion_passenger / rack / application_spawner.rb:171:在`block in handle_spawn_application'
  乘客(3.0.17)lib / phusion_passenger / utils.rb:470:在`safe_fork'
  乘客(3.0.17)lib / phusion_passenger / rack / application_spawner.rb:166:在`handle_spawn_application'
  乘客(3.0.17)lib / phusion_passenger / abstract_server.rb:357:在`server_main_loop'
  乘客(3.0.17)lib / phusion_passenger / abstract_server.rb:206:在`start_synchronously'
  乘客(3.0.17)lib / phusion_passenger / abstract_server.rb:180:在“开始”
  乘客(3.0.17)lib / phusion_passenger / rack / application_spawner.rb:129:在“开始”
  乘客(3.0.17)lib / phusion_passenger / spawn_manager.rb:253:在`block(2 levels)in spawn_rack_application'
  乘客(3.0.17)lib / phusion_passenger / abstract_server_collection.rb:132:在`lookup_or_add'
  乘客(3.0.17)lib / phusion_passenger / spawn_manager.rb:246:在`block in spawn_rack_application'
  乘客(3.0.17)lib / phusion_passenger / abstract_server_collection.rb:82:在`block in synchronize'
   :10:在`同步'
  乘客(3.0.17)lib / phusion_passenger / abstract_server_collection.rb:79:在`synchronize'
  乘客(3.0.17)lib / phusion_passenger / spawn_manager.rb:244:在`spawn_rack_application'
  乘客(3.0.17)lib / phusion_passenger / spawn_manager.rb:137:在`spawn_application'
  乘客(3.0.17)lib / phusion_passenger / spawn_manager.rb:275:在`handle_spawn_application'
  乘客(3.0.17)lib / phusion_passenger / abstract_server.rb:357:在`server_main_loop'
  乘客(3.0.17)lib / phusion_passenger / abstract_server.rb:206:在`start_synchronously'
  乘客(3.0.17)助手脚本/乘客产卵服务器:99:在“

database.yml的:

生产:
  适配器:mysql2
  编码:utf8
  数据库:[db]
  主持人:[主持人]
  游泳池:5
  用户名:[用户]
  密码:[pass]
  超时:2000

我运行Ubuntu 12.04.1 LTS,Ruby 1.9.3p194通过RVM和Passenger 3.0.18。

我从来没有在WEBrick的开发模式下遇到这个问题。

我正面临与ruby 2.0.0-p0相同的问题。

../bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/connection_adapters/mysql2_adapter.rb:73:in`ping'

我曾尝试过独angular兽,瘦身和乘客。 这不会改变任何东西。

production: adapter: mysql2 database: *** username: *** password: *** host: an IP reconnect: true wait_timeout: 3 # I've tried with this option and without 

有任何想法吗 ?

libmysqlclient 5.1.66-0 + squeeze1
mysql-server 5.1.66-0 + squeeze1

编辑

这似乎是TCP Keepalive的防火墙问题 。 如果MySQL客户端的TCP Keepalive大于防火墙的Keepalive,则会出现此问题。

详情: http : //tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/

我使用的是Google Compute Engine,并且一直持续点击这个相同的问题 – 闲置约10分钟后,对Rails应用程序的请求将完全挂起,没有明显的日志或指示问题出在哪里。

经过多次debugging和跟踪,结果是防火墙超时 – 在GCE实例的TCP连接闲置10分钟后自动超时。 我通过configurationTCP keepalive在60秒空闲时间(而不是默认的2小时)发送它的第一个探测,成功解决了这个问题,这样长时间的到数据库的TCP连接保持活动状态。 这里也提到了这个: https : //cloud.google.com/sql/docs/gce-access

 # Set tcp_keepalive_time to 60 seconds and make it permanent across reboots. $ echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf