나는 페이스 북에서 바이러스 성 성장으로 인해 높은로드를 경험 한 여러 레일 애플리케이션에서 작업 해왔다.
귀하의 잡종 개수는 몇 가지 요인에 근거해야합니다. 잡종이 API 호출을하거나 전자 메일을 배달하고 응답을 기다려야하는 경우 최대한 많이 실행해야합니다. 그렇지 않으면 CPU 코어 당 하나의 잡종을 유지하려고합니다.
그리고 여기 개선하고로드를 처리하는 응용 프로그램의 성능을 벤치 마크에 대한 몇 가지 다른 팁 : 다음은이가하는 Nginx에 모듈이다 ActiveRecord 객체의 사용 빈도가 낮습니다. 단 하나만 필요할 때 100 개의 검색어를 만드는 것은 매우 쉽습니다. 이것이 응용 프로그램에 문제가 될 수 있는지를 결정하는 가장 쉬운 방법은 New Relic을 설정하는 것입니다. 사이트의 각 주요 페이지에 대한 요청을 한 후, 새로운 SQL 개요를 살펴보십시오. 매우 유사한 검색어가 많이 표시되는 경우 (ID = 1 인 게시물에서 * 선택하고 ID가 2 인 게시물에서 *를 선택하고 게시물에서 *를 선택하십시오.) 다음과 같은 기호를 사용해야 할 수도 있습니다. ActiveRecord 호출 중 하나에 포함하십시오.
다른 어떤 기본적인 액티브 팁
(이 내 머리 위로 떨어져 내가 생각할 수있는 바로 그들이다) : 이미 그 일을하지 않는 경우
올바르게 사용해야합니다 데이터베이스 테이블의 색인.
뷰에서 데이터베이스 호출을 피하십시오. 특히 부분적으로보기에서 데이터베이스 조회를 얼마나 많이 수행하는지 쉽게 알 수 없습니다. 모든 쿼리 및 계산을 모델 또는 컨트롤러로 푸시합니다.
반복자에서 쿼리하는 것을 피하십시오. 일반적으로 이것은 : include를 사용하여 수행 할 수 있습니다.
대용량 데이터 세트의 ActiveRecord 객체를 가능한 한 많이 빌드하는 것을 피하십시오. Post.find (: all) .size와 같은 호출을하면 데이터베이스의 모든 Post에 대해 새 클래스가 인스턴스화됩니다 (큰 쿼리 일 수도 있음). 이 경우 Post.count (: all)를 사용하면 하나의 빠른 쿼리를 만들고 객체를 인스턴스화하지 않고 정수를 반환 할 수 있습니다.
User..has_many :objects
과 같은 연결은 user.objects
과 user.object_ids
방법을 모두 만듭니다. 후자는 ActiveRecord 객체의 인스턴스 생성을 건너 뛰고 훨씬 빨라질 수 있습니다. 특히 많은 수의 객체를 처리 할 때 속도를 높이는 좋은 방법입니다.
가능한 한 named_scope을 배우고 사용하십시오. 코드를 작게 유지하고 효율적인 쿼리를 훨씬 쉽게 작성하는 데 도움이됩니다.
외부 API를 & ActionMailer
요청을 처리하는 동안 외부 서비스에 대한 API 호출을하지 않습니다, 당신이 할 수있는만큼. 서버는 응답이 수신 될 때까지 코드 실행을 중지합니다. 로드 시간이 늘어날뿐만 아니라 잡종이 새로운 요청을 처리 할 수 없습니다.
요청 중에 절대적으로 외부 호출을해야하는 경우 가능한 많은 수의 잡종을 실행해야합니다. 그 중 많은 수가 API 응답을 기다리고 있고 다른 작업을하지 않는 상황이 발생할 수 있습니다. (이것은 Facebook 응용 프로그램을 구축 할 때 매우 일반적으로 발생하는 문제입니다.)
경우에 따라 전자 메일을 보낼 때도 마찬가지입니다. 짧은 시간 내에 많은 사용자가 등록 할 것으로 예상되는 경우 ActionMailer가 메시지를 전달하는 데 걸리는 시간을 벤치마킹해야합니다. 거의 순간적이지 않다면 데이터베이스에 전자 메일을 저장하고 별도의 스크립트를 사용하여 전자 메일을 전달하는 것을 고려해야합니다.
이 문제를 해결하기 위해 BackgroundRB 같은 도구가 만들어졌습니다. 당신이 방법은 속도가 느려질 수 있습니다 의심되는 경우
캐싱
Here's a good guide on the different methods of caching in rails.
벤치마킹 (위치 성능 문제) , 콘솔에서 벤치마킹을 시도합니다. 예를 들면 다음과 같습니다.
>> Benchmark.measure { User.find(4).pending_invitations }
=> #<Benchmark::Tms:0x77934b4 @cutime=0.0, @label="", @total=0.0, @stime=0.0, @real=0.00199985504150391, @utime=0.0, @cstime=0.0>
애플리케이션 속도가 느린 메소드를 추적하십시오. 그것들은 자주 실행되는 것을 피하기를 원합니다. 어떤 경우에는 레일스가 쿼리 캐시를 가지고 있기 때문에 첫 번째 호출 만 느려질 수 있습니다. Memoization을 사용하여 메서드를 직접 캐싱 할 수도 있습니다.
NewRelic은 메서드와 SQL 호출이 실행되는 데 걸리는 시간에 대한 멋진 개요를 제공합니다.
행운을 빈다.
나는 EY의 요점이 수요와 일치하여 조각을 늘릴 수 있다고 생각 했단 말인가? – Chris
물론 이것은 가능하지만 일어나고있는 시간과 그것을 깨닫는 사이에 지연 시간이 있으며, 또한 EY와 그들에게 실제로 상자를 설치하는 것을 말하면서 여러분 사이에 지연 시간이 있습니다. 아마존의 ECC –