Получаем ошибку ThreadError и сервер зависает - PullRequest
0 голосов
/ 13 ноября 2018

Я использую rails 5.2.1 приложение на сервере ec2 типа экземпляра t3.small . Но сервер завис после нескольких дней работы. В файле puma_access.log есть следующий журнал ошибок

Listen loop error: #<ThreadError: can't create Thread: Resource temporarily unavailable>
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:87:in `initialize'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:87:in `new'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:87:in `spawn_thread'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:162:in `block in <<'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:154:in `synchronize'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/thread_pool.rb:154:in `<<'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/server.rb:398:in `block in handle_servers'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/server.rb:385:in `each'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/server.rb:385:in `handle_servers'
/var/www/rails/rails-api/shared/bundle/ruby/2.5.0/gems/puma-3.12.0/lib/puma/server.rb:358:in `block in run'

На сервере мы подключаемся к двум экземплярам RDS, второй с помощью класса

class SecondDbBase < ActiveRecord::Base
  establish_connection "#{Rails.env}_sec".to_sym
  self.abstract_class = true

  def readonly?
     true
  end

  def write_attribute(name, value)
    raise NotImplementedError, 'read only table'
  end

end

и в соответствующей модели я расширил класс

class Student < SecondDbBase

файл puma.rb

workers 1
# Min and Max threads per worker
threads 1, 6

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
tmp_dir = "#{app_dir}/tmp"

# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

# Set up socket location
bind "unix://#{tmp_dir}/sockets/puma.sock"

# Logging
stdout_redirect "#{tmp_dir}/log/puma.stdout.log", "#{tmp_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{tmp_dir}/pids/puma.pid"
state_path "#{tmp_dir}/pids/puma.state"
preload_app!
activate_control_app

on_worker_boot do
    require "active_record"
    ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
    ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end

Связана ли проблема с каким-либо пулом соединений с базой данных? Как я могу решить это?

...