我有一个运行在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