【问题标题】:Ruby on Rails Errno::EPIPE Broken pipeRuby on Rails Errno::EPIPE 损坏的管道
【发布时间】:2011-05-20 02:14:50
【问题描述】:

我知道有很多人在网上发布此问题,但我一直无法找到解决方案。

在我的网站超过 6-8 小时未被访问后,我收到 Errno::EPIPE。我读到它可能与 ruby​​-mysql 驱动程序有关,但还没有找到解决方案。这是完整的跟踪。我正在使用乘客和 mysql 在 apache 上的 rails 服务器上运行 ruby​​。感谢您的帮助!!!

Errno::EPIPE Broken pipe

ruby-mysql (2.9.3) lib/mysql/protocol.rb:617:in `flush'
ruby-mysql (2.9.3) lib/mysql/protocol.rb:617:in `write'
/usr/lib/ruby/1.8/timeout.rb:53:in `timeout'
ruby-mysql (2.9.3) lib/mysql/protocol.rb:616:in `write'
ruby-mysql (2.9.3) lib/mysql/protocol.rb:640:in `simple_command'
ruby-mysql (2.9.3) lib/mysql/protocol.rb:545:in `synchronize'
ruby-mysql (2.9.3) lib/mysql/protocol.rb:638:in `simple_command'
ruby-mysql (2.9.3) lib/mysql/protocol.rb:413:in `statistics_command'
ruby-mysql (2.9.3) lib/mysql.rb:502:in `stat'
activerecord (3.0.0) lib/active_record/connection_adapters/mysql_adapter.rb:238:in `active?'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract_adapter.rb:148:in `verify!'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:250:in `checkout_and_verify'
activesupport (3.0.0) lib/active_support/callbacks.rb:413:in `_run_checkout_callbacks'
activesupport (3.0.0) lib/active_support/callbacks.rb:93:in `send'
activesupport (3.0.0) lib/active_support/callbacks.rb:93:in `run_callbacks'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:249:in `checkout_and_verify'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:245:in `checkout_existing_connection'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:192:in `checkout'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:190:in `loop'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:190:in `checkout'
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:189:in `checkout'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:96:in `connection'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:318:in `retrieve_connection'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_specification.rb:97:in `retrieve_connection'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_specification.rb:89:in `connection'
activerecord (3.0.0) lib/active_record/query_cache.rb:12:in `cache'
activerecord (3.0.0) lib/active_record/query_cache.rb:31:in `call'
activerecord (3.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:355:in `call'
actionpack (3.0.0) lib/action_dispatch/middleware/callbacks.rb:46:in `call'
activesupport (3.0.0) lib/active_support/callbacks.rb:415:in `_run_call_callbacks'
actionpack (3.0.0) lib/action_dispatch/middleware/callbacks.rb:44:in `call'
rack (1.2.1) lib/rack/sendfile.rb:107:in `call'
actionpack (3.0.0) lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
actionpack (3.0.0) lib/action_dispatch/middleware/show_exceptions.rb:46:in `call'
railties (3.0.0) lib/rails/rack/logger.rb:13:in `call'
rack (1.2.1) lib/rack/runtime.rb:17:in `call'
rack (1.2.1) lib/rack/lock.rb:11:in `call'
rack (1.2.1) lib/rack/lock.rb:11:in `synchronize'
rack (1.2.1) lib/rack/lock.rb:11:in `call'
actionpack (3.0.0) lib/action_dispatch/middleware/static.rb:30:in `call'
railties (3.0.0) lib/rails/application.rb:168:in `call'
railties (3.0.0) lib/rails/application.rb:77:in `send'
railties (3.0.0) lib/rails/application.rb:77:in `method_missing'
passenger (3.0.0) lib/phusion_passenger/rack/request_handler.rb:96:in `process_request'
passenger (3.0.0) lib/phusion_passenger/abstract_request_handler.rb:513:in `accept_and_process_next_request'
passenger (3.0.0) lib/phusion_passenger/abstract_request_handler.rb:274:in `main_loop'
passenger (3.0.0) lib/phusion_passenger/classic_rails/application_spawner.rb:321:in `start_request_handler'
passenger (3.0.0) lib/phusion_passenger/classic_rails/application_spawner.rb:275:in `send'
passenger (3.0.0) lib/phusion_passenger/classic_rails/application_spawner.rb:275:in `handle_spawn_application'
passenger (3.0.0) lib/phusion_passenger/utils.rb:479:in `safe_fork'
passenger (3.0.0) lib/phusion_passenger/classic_rails/application_spawner.rb:270:in `handle_spawn_application'
passenger (3.0.0) lib/phusion_passenger/abstract_server.rb:357:in `__send__'
passenger (3.0.0) lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
passenger (3.0.0) lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
passenger (3.0.0) lib/phusion_passenger/abstract_server.rb:180:in `start'
passenger (3.0.0) lib/phusion_passenger/classic_rails/application_spawner.rb:149:in `start'
passenger (3.0.0) lib/phusion_passenger/spawn_manager.rb:219:in `spawn_rails_application'
passenger (3.0.0) lib/phusion_passenger/abstract_server_collection.rb:132:in `lookup_or_add'
passenger (3.0.0) lib/phusion_passenger/spawn_manager.rb:214:in `spawn_rails_application'
passenger (3.0.0) lib/phusion_passenger/abstract_server_collection.rb:82:in `synchronize'
passenger (3.0.0) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
passenger (3.0.0) lib/phusion_passenger/spawn_manager.rb:213:in `spawn_rails_application'
passenger (3.0.0) lib/phusion_passenger/spawn_manager.rb:132:in `spawn_application'
passenger (3.0.0) lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application'
passenger (3.0.0) lib/phusion_passenger/abstract_server.rb:357:in `__send__'
passenger (3.0.0) lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
passenger (3.0.0) lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
/usr/share/phusion-passenger/helper-scripts/passenger-spawn-server:99</blink>

【问题讨论】:

  • 我看到在乘客 3.0.7、Rails 2.3.11 和 Rack 1.1.1 下运行 Redmine 的行为完全相同。我尝试过使用各种 MySQL gem(mysql、ruby-mysql、mysql2)并添加了各种额外的规范来控制Passenger 的连接池空闲时间和池大小,但无济于事。似乎很多人都遇到过这个问题,但我还没有找到可行的解决方案。
  • 给出的三个答案中的任何一个都是答案吗?如果有,请标记答案

标签: mysql ruby-on-rails apache passenger broken-pipe


【解决方案1】:

我将以下内容添加到 .../app/controllers/application_controller.rb

before_filter :verify_connection

def verify_connection
  Product.verify_active_connections!
end

(产品是我的模型之一 - 任何一个都应该工作)并且这个问题消失了。

【讨论】:

  • 似乎仍然失败。感谢您的建议!
【解决方案2】:

我在使用来自http://gaveen.owain.org/2008/04/errnoepipe-broken-pipe-mysql-error-in.html 的苹果推送通知解决方法时遇到了这个错误,解决了问题

创建一个定期使用数据库连接的睡眠线程 例如:

Thread.new do
 loop do
   sleep(30*60)
   logger.fatal("ActiveRecord::Base.verify_active_connections!")
   ActiveRecord::Base.verify_active_connections!
   ActiveRecord::Base.connection.select_value('select 1')
 end
end

【讨论】:

    【解决方案3】:

    除非你使用 ruby​​-mysql 有特殊原因, 删除它,安装'default' mysql gem

    gem install mysql2
    

    并在您的 Gemfile 中使用该文件:

    gem "mysql2"
    

    根据 Bohdan Pohorilets 提到的博客作者的说法,问题就是这样解决的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-20
      • 2012-06-14
      • 1970-01-01
      • 2021-01-04
      • 2017-04-22
      • 1970-01-01
      • 2014-04-28
      • 2013-04-16
      相关资源
      最近更新 更多