2014-04-08 5 views
3

나는 Heroku에서 레일 응용 프로그램을 실행 중입니다.동시성 데이터베이스 연결 Heroku Unicorn rails 응용 프로그램

나는 하나의 dyno를 가지고 있습니다. 저는 취미 기본 데이터베이스 인 $ 9를 1 개월에 20 개로 제한하고 있습니다.

내 응용 프로그램이 Unicorn에서 실행 중입니다. 그러나 여러 데이터베이스 호출이 만들어지면 여전히 느립니다. 동시 연결을 관리하는 방법에 대한

# config/unicorn.rb 
worker_processes 3 
timeout 30 
preload_app true 

before_fork do |server, worker| 

    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
end 

after_fork do |server, worker| 

    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT' 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

이 문서 회담 : https://devcenter.heroku.com/articles/concurrency-and-database-connections

하지만, 난 여전히 혼란 스러워요

이것은 내 unicorn.rb 파일에있는 것입니다. 현재 설정으로, 동시에 여러 데이터베이스 연결을 허용 할 수 있습니까? 그리고 최대 연결에서 데이터베이스는 (20)을 허용합니까? 헤로 쿠의 레일 앱을 스케일링하는 사람이 나에게 올바른 방향을 가르쳐 줄 수 있다면 정말 고마워.

+0

데이터베이스 연결마다 "유니콘"작업자 한 명이 필요합니다. 각 작업자는 단일 연결을가집니다. 물론, 나는 결코 유니콘을 사용하지 않았습니다. 그것은 포크를 사용했을 때 나타나는 방식입니다. –

답변

1

제한된 취미 계획을 사용할 때 데이터베이스가 병목 현상이 될 수 있다고 가정하는 것은 공정합니다. (아래 코드와 같이) 관계없이 연결 풀링을 개선하는 데 도움이되는 몇 가지 최적화가있을 수 있습니다. 그러나 이것이 병목 현상 일 때 속도 저하뿐만 아니라 종종 발생하는 시간 초과를 예상 할 수 있습니다. 문제가있는 곳을 더 잘 이해하려면 NewRelic 플러그인을 추가하는 것이 좋습니다.

NewRelic Stark 계획 (권장) 또는 Wayne 계획 (제 생각에는 너무 제한적 임)은 무료이며 Apps 성능 및 추적 오류를 시각화하는 데 도움이됩니다. dyno 큐잉 시간과 메모리 소비가 당신이 얻는 속도 저하에 기여한다는 것을 알게 될 것이며, 데이터베이스 연결을 망칠 필요없이 이것이 향상 될 수있는 몇 가지 방법이 있습니다. 코드 응답 시간을 향상시키고 데이터베이스 히트를 (캐싱을 통해) 제한하는 것은 조사 할 좋은 영역입니다.

그렇다면 내가 언급 한 기사에서 설명한대로 유니 코드 파일에 다음 코드를 추가하는 것이 좋습니다.

after_fork do |server, worker| 

    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT' 
    end 

    # other settings 
    if defined?(ActiveRecord::Base) 
    config = ActiveRecord::Base.configurations[Rails.env] || 
      Rails.application.config.database_configuration[Rails.env] 
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds 
    config['pool']   = ENV['DB_POOL'] || 2 
    ActiveRecord::Base.establish_connection(config) 
    end 
end 
+0

파일의 어느 부분에 넣을까요? 결국? –

+1

네,'before_fork' 블록 다음에 파일의 끝에 추가하십시오. – blotto

+0

죄송합니다, 명확하지 않았습니다. 현재 after_fork 블록을 대체합니까, 아니면 현재 after_fork 블록 아래에 두겠습니까? –

0

Heroku는 관리되는 Postgres 데이터베이스를 제공합니다. 계층 구조가 다른 데이터베이스의 연결 제한이 다릅니다. Starter Tier "Dev"및 "Basic"데이터베이스는 20 개의 연결로 제한됩니다.

및 작업자가 필요로하는 하나의 연결. 20 명이 넘는 직원이있는 경우 pgbouncer와 같은 연결 풀을 사용하여 문제를 해결할 수 있습니다. pgbouncer를 사용하는 경우 환경에서 트랜잭션 풀 모드를 사용하기 때문에 서버를 작업자간에 재사용 할 수 있습니다.