2009-03-23 4 views
1

앞으로 며칠 이내에 기술력을 향상시킬 수있는 좋은 기회가 있습니다. 불행하게도 우리는 아직 살아 있지 않아서 시스템이 제작자를 어떻게 처리하는지 잘 추정하지 못했습니다.첨단 기술을 준비하는 방법

우리의 프로덕션 설정은 Postgres를 데이터베이스 서버로 사용하여 3 개의 잡식 인스턴스가있는 2 개의 EngineYard 슬라이스로 구성됩니다.

분명히 우리 앱이 어떻게 잡아 둘지에 대한 엄청난 부분은 실제 코드와 쿼리 등과 관련이 있습니다. 그러나 어떤 종류의 예상이나 경험에 대한 조언이나 조언이 있는지 살펴 보는 것이 좋습니다. 그것을 통해 살아온 사람들로부터 6 개의 잡동사니 인스턴스 (서버가 가져갈 수있는 경우 8 개)는 부하를 처리하는 것처럼 들리지만, 적어도 대부분은 그렇습니까?

+0

나는 EY의 요점이 수요와 일치하여 조각을 늘릴 수 있다고 생각 했단 말인가? – Chris

+0

물론 이것은 가능하지만 일어나고있는 시간과 그것을 깨닫는 사이에 지연 시간이 있으며, 또한 EY와 그들에게 실제로 상자를 설치하는 것을 말하면서 여러분 사이에 지연 시간이 있습니다. 아마존의 ECC –

답변

3

나는 페이스 북에서 바이러스 성 성장으로 인해 높은로드를 경험 한 여러 레일 애플리케이션에서 작업 해왔다.

귀하의 잡종 개수는 몇 가지 요인에 근거해야합니다. 잡종이 API 호출을하거나 전자 메일을 배달하고 응답을 기다려야하는 경우 최대한 많이 실행해야합니다. 그렇지 않으면 CPU 코어 당 하나의 잡종을 유지하려고합니다.

서버가 페어 프록시 밸런서 (라운드 로빈이 아님)를 사용하고 있는지 확인하십시오.이

가장 일반적인 문제는 응용 프로그램에 얼굴을 레일

액티브 : http://github.com/gnosek/nginx-upstream-fair/tree/master

그리고 여기 개선하고로드를 처리하는 응용 프로그램의 성능을 벤치 마크에 대한 몇 가지 다른 팁 : 다음은이가하는 Nginx에 모듈이다 ActiveRecord 객체의 사용 빈도가 낮습니다. 단 하나만 필요할 때 100 개의 검색어를 만드는 것은 매우 쉽습니다. 이것이 응용 프로그램에 문제가 될 수 있는지를 결정하는 가장 쉬운 방법은 New Relic을 설정하는 것입니다. 사이트의 각 주요 페이지에 대한 요청을 한 후, 새로운 SQL 개요를 살펴보십시오. 매우 유사한 검색어가 많이 표시되는 경우 (ID = 1 인 게시물에서 * 선택하고 ID가 2 인 게시물에서 *를 선택하고 게시물에서 *를 선택하십시오.) 다음과 같은 기호를 사용해야 할 수도 있습니다. ActiveRecord 호출 중 하나에 포함하십시오.

다른 어떤 기본적인 액티브 팁

(이 내 머리 위로 떨어져 내가 생각할 수있는 바로 그들이다) : 이미 그 일을하지 않는 경우

  1. 올바르게 사용해야합니다 데이터베이스 테이블의 색인.

  2. 뷰에서 데이터베이스 호출을 피하십시오. 특히 부분적으로보기에서 데이터베이스 조회를 얼마나 많이 수행하는지 쉽게 알 수 없습니다. 모든 쿼리 및 계산을 모델 또는 컨트롤러로 푸시합니다.

  3. 반복자에서 쿼리하는 것을 피하십시오. 일반적으로 이것은 : include를 사용하여 수행 할 수 있습니다.

  4. 대용량 데이터 세트의 ActiveRecord 객체를 가능한 한 많이 빌드하는 것을 피하십시오. Post.find (: all) .size와 같은 호출을하면 데이터베이스의 모든 Post에 대해 새 클래스가 인스턴스화됩니다 (큰 쿼리 일 수도 있음). 이 경우 Post.count (: all)를 사용하면 하나의 빠른 쿼리를 만들고 객체를 인스턴스화하지 않고 정수를 반환 할 수 있습니다.

  5. User..has_many :objects과 같은 연결은 user.objectsuser.object_ids 방법을 모두 만듭니다. 후자는 ActiveRecord 객체의 인스턴스 생성을 건너 뛰고 훨씬 빨라질 수 있습니다. 특히 많은 수의 객체를 처리 할 때 속도를 높이는 좋은 방법입니다.

  6. 가능한 한 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 호출이 실행되는 데 걸리는 시간에 대한 멋진 개요를 제공합니다.

행운을 빈다.

1

WEBLoad과 같은 부하 테스트 소프트웨어를 살펴 보거나 돈이 있으면 Quick Test Pro를 확인하십시오. 이것은 당신에게 약간의 아이디어를주는 것을 도울 것입니다. WEBLoad는 귀하의 상황에서 가장 좋은 테스트 일 수 있습니다.

사이트에 수천 개의 가상 노드를 생성 할 수 있으며 해당로드에서 서버의 성능을 검사 할 수 있습니다.

+0

과 같은 탄력적 인 척도가 없습니다. 정보가 아니라 컨텍스트를 제공합니다 ... 나는 그 위치에 있었고 어떤 스트레스를 받았는지 사람들에게 경험이 필요합니다. 초당 간단한 요청 통계는 필자의 시스템이 그 시나리오에서 잘 살아남 으면 반드시 알려주지는 않습니다. –

+0

사실 초당 요청 수가 아닙니다. 사이트에 도달하는 수천 개의 노드를 생성 할 수 있으며 해당로드에서 서버의 성능을 검사 할 수 있습니다. – BobbyShaftoe

0

우리 고객 중 일부가 사고를 당했을 때 트래픽은 상당히 완만했으나 뼈를 부수는 스파이크 사람들은 기대하지 않는 것으로 나타났습니다. 자, 당신이 신디케이트로 조직되고 야후의 페이지 또는 뭔가를 만들면, 상황은 다를 수 있습니다. 당신은 그들이 그것을 처리하는 방법에 대해 읽으려면 Facestat.com의 경험을

검색 (야후 FP를.) 내 조언은 바로 가입을 끄거나 좀 더 정적 버전으로 갈 수 있도록 준비되어

귀하의 서버가 너무 뜨거워지면 귀하의 사이트. 모니터링/프로파일 링 도구를 사용하는 것도 좋은 생각입니다. 설치가 쉽도록 FiveRuns Manage 도구를 좋아합니다.

0

당신이 EngineYard를 사용하고 있기 때문에, 당신이 필요

0

귀하의 큰 문제는 아마도 들어오는 요청의 수를하지 않을 경우에는 부하를 처리하기 위해 더 많은 기계를 할당 할 수 있어야하지만, 데이터의 양이 될 것입니다 데이터베이스가 예상하는 색인을 사용하지 않는 위치를 표시하거나 너무 많은 데이터를 반환합니다. 사용자 목록 페이지는 10 명의 사용자와 함께 작동하지만 페이지 매김을 추가하지 않았기 때문에 한 페이지에 10,000 명의 사용자를 표시하려고하면 사망합니다 (will_paginate 플러그인은 거의 친구입니다 - 'select count (*)'쿼리에주의하십시오.

)으로 생성 그래서 두 가지보고 : 1 페이지의

  • 너무 많은 데이터를

    1. 누락 된 인덱스,이 '설명 실행하는 플러그인이있다. .. '쿼리마다 매번 쿼리하므로 인덱스 사용량을 수동으로 확인할 수 있습니다.

      이러한 쿼리를 테스트하기 위해 데이터베이스를 채우는 데 도움이되는 다양한 유형의 데이터에 대해 데이터를 생성 할 수있는 플러그인이 있습니다.

      # 2의 경우 will_paginate 플러그인 또는 다른 방법으로 페이지 당 데이터를 줄이십시오.

  • 0

    우리는 EY에서 기본적으로 동일한 설정, 2 개의 슬라이스 조각 및 준비 슬라이스를 가지고 있습니다. 우리는 ab가 훌륭한로드 테스트 도구라는 것을 알았습니다. bash 스크립트를 작성할 때 예상되는 URL을 여러분의 슬라이스에서 가리 키기 만하면됩니다.NewRelic의 통계를 살펴보면 앱에서 처리 할 수있는 부하와 최적화해야 할 위치를 알 수 있습니다.

    query_reviewer도 매우 유용합니다. 인덱싱되지 않은 테이블과 n + 1 개의 쿼리를 찾는 데 유용합니다.