푸마는 실제로 다중 스레드와 다중 프로세스입니다. MRI의 다른 코어에서 실행되는 여러 포크 작업자를 스폰하는 "클러스터 모드"로 호출 할 수 있습니다. Puma는 멀티 스레드이므로 서버의 코어 수와 동일한 수의 프로세스를 실행하는 것이 적절합니다. 이 같은 4 코어 서버 무언가가 적절할 것 같다 이처럼 :
puma -t 8:32 -w 4 --preload
이는 최대 4 개 개의 스레드가 동시에 CPU에서 실행하는 32 개 개의 동시 스레드를 처리되고에 CPU 자원을 극대화 할 수 있어야한다 섬기는 사람. --preload
인수는 응용 프로그램을 미리로드하고 RAM 사용을 줄이기 위해 가비지 수집에 대한 ruby 2.0 COW 개선 사항을 이용합니다.
앱이 다른 서비스 (검색 서비스, 데이터베이스 등)를 기다리는 데 많은 시간을 소비하는 경우 크게 개선 될 것입니다. 스레드가 차단되면 동일한 프로세스의 다른 스레드가 CPU를 잡고 작업을 수행 할 수 있습니다. 이 예에서 최대 32 개의 요청을 병렬로 지원할 수 있으며 RAM에서 4 개의 프로세스 만 실행하면됩니다.
유니콘을 사용하면 32 명의 작업자를 포크해야만 RAM에서 32 개의 프로세스를 실행해야하므로 낭비가 큽니다.
모든 응용 프로그램이 CPU 크런치 인 경우 이는 매우 비효율적이며 유니콘 수를 줄여 유니온보다 푸마의 이점을 줄일 수 있습니다. 그러나 유니콘의 경우, 앱을 벤치마킹하고 올바른 숫자를 찾아야합니다. Puma는 더 많은 스레드를 생성하여 성능을 최적화하는 경향이 있으며 성능은 Unicorn (순수 CPU의 경우)에서 Unicorn (Apple의 경우 많이 사용하는 경우)보다 훨씬 뛰어납니다.
물론 Rubinius 또는 JRuby를 사용하면 해당 경연 대회가없고 멀티 코어를 실행하고 32 개의 스레드를 모두 처리하는 프로세스를 생성 할 수 있습니다.
TL; DR은 Puma가 실제로 두 모델을 모두 사용하기 때문에 Puma보다 Unicorn에 많은 이점이 있다고 생각하지 않습니다.
물론 퓨마와 유니콘의 신뢰성에 대해서는 전혀 알지 못합니다. 걱정할 필요가있는 한 가지는 한 스레드에서 전역 상태를 쓸어 넘기면 동시에 실행되는 다른 요청에 영향을 미쳐 결과가 불확실해질 수 있다는 것입니다. Unicorn은 쓰레드를 사용하지 않기 때문에 동시성 문제는 없습니다. 나는이 시간에 Puma와 Rails가 동시성 문제와 관련하여 성숙해졌으며 퓨마가 프로덕션에서 사용할 수 있었으면 좋겠다. 그러나 GitHub에서 발견 한 모든 레일즈 플러그인과 루비 젬이 threadsafe가 될 것으로 기대하지는 않을 것이고 추가 작업을해야 할 것으로 예상됩니다. 그러나 제 3 자 라이브러리에서 스레드 문제를 발견하는 데 성공하면 많은 유니콘 프로세스를 실행하는 데 드는 RAM 비용을 감당할 수 없을만큼 커질 수 있습니다. OTOH, 동시성 버그를 이해하고 Ruby를 잘 사용하기 때문에 디버깅 비용이 클라우드에서 RAM을 구입하는 비용보다 훨씬 적습니다. YMMV.
하이퍼 스레딩 된 코어 또는 실제 코어를 '-w'로 전달할 값을 계산해야하는지 잘 모르겠다면 perf 테스트를 통해 perf 테스트를 통해 사용할 값을 테스트해야합니다. -t의 경우. 필요한 프로세스 수를 두 배로 늘리는 경우에도 커널의 프로세스 스케줄러가 CPU를 포화시킬 때까지 아무 문제없이 문제를 처리 할 수 있어야합니다. 어떤 경우이든 더 큰 문제가 발생할 수 있습니다. 아마도 각 하이퍼 스레드 코어 (MRI)의 프로세스를 시작하는 것이 좋습니다.
스튜어트에게 큰 진상을 감사드립니다! – Ryan
루비 2.0은 "write on write friendly"는 GC가 힙의 쓰기 페이지에서 사본과 휴지통을 공유하지 않는다는 것을 의미합니다. 1.9를 사용하면 많은 유니콘을 포크하고 GC가 실행되어 개체를 이동하고 GC 시작 전 해당 프로세스간에 발생했을 수있는 모든 COW 공유 이점을 완전히 휴지통에 버립니다. – lamont