2011-10-14 2 views
2

나는 gunicorn의 max_requests 또는 apache의 MaxRequestsPerChild와 비슷한 유니콘에서 max-requests-per-worker 옵션을 찾았지만 찾지 못했습니다.유니콘의 최대 작업 당 요청 수

존재합니까?

그렇지 않다면 구현 한 사람이 있습니까?

나는 그것이 모든 요청 이후에 어쨌든 제어권을 얻었으므로 oobgc가있는 파일에 넣을 것을 고려하고 있습니다. 그게 옳은 것 같니?

문제는 유니콘 작업자가 커지고 뚱뚱해지고 가비지 수집이 CPU 사용량이 점점 더 커지고 있다는 것입니다.

답변

2

유니콘은 최대 요청을 제공하지 않습니다.

unicorn 마스터는 종료하는 작업자를 다시 스폰하고 현재 요청이 끝날 때 작업자가 receives a QUIT signal 일 때 정상적으로 종료하므로 작업자 요청 수명주기에 자신의 최대 요청 로직을 손쉽게 롤백 할 수 있습니다. 레일

의 응용 프로그램 컨트롤러에서 다음 (랙 미들웨어의 대안으로, 비슷한 논리) 같은

after_filter do 
    @@request_count ||= 0 
    Process.kill('QUIT',$$) if (@@request_count += 1) > MAX_REQUESTS 
end 
+0

@request_count에 대한 확신이 있습니까? 아마도 @@ request_count가 아니겠습니까? ([랙 미들웨어] (http : //)와 반대로 [요청 당 레일 컨트롤러의 새로운 인스턴스] (http://guides.rubyonrails.org/action_controller_overview.html#methods-and-actions)가 없습니까? railscasts.com/episodes/151-rack-middleware) –

+0

@TimDiggins 좋은 점은 클래스 var를 사용하는 대답을 편집했습니다. 당시 나는 위의 코드 조각을 실제로 테스트하지는 않았지만 각 요청에 대해 레일 컨트롤러가 인스턴스화된다는 것은 사실입니다. 실제로 나는 미들웨어를 사용한다. :) – dbenhur

6

가 난 그냥 보석 'unicorn-worker-killer'출시했습니다. 이렇게하면 요청에 영향을 미치지 않고 1) 최대 요청 수와 2) 프로세스 메모리 크기 (RSS)에 따라 Unicorn 작업자를 죽일 수 있습니다. 정말 사용하기 쉽습니다. 먼저이 줄을 Gemfile에 추가하십시오.

gem 'unicorn-worker-killer' 

그런 다음 config.ru에 다음 줄을 추가하십시오.

# Unicorn self-process killer 
require 'unicorn/worker_killer' 

# Max requests per worker 
use Unicorn::WorkerKiller::MaxRequests, 3072, 4096 

# Max memory size (RSS) per worker 
use Unicorn::WorkerKiller::Oom, (256*(1024**2)), (384*(1024**2)) 

모든 작업자를 동시에 죽이지 않도록 임계 값을 무작위 화하는 것이 좋습니다.

+0

나는 내 앱에 heroku를 시도했지만 작동하지 않는다. 어떤 힌트? – MKumar

관련 문제