2012-10-16 2 views
2

창 azure 큐의 경우 저장소 당 확장 성 대상은 약 500 메시지/초 (http://msdn.microsoft.com/en-us/library/windowsazure/hh697709.aspx)로 가정됩니다. 몇 가지 메시지를 대기열에 그냥 쓰는 다음 간단한 프로그램이 있습니다. 프로그램을 완료하는 데 10 초 (4 메시지/초) 걸립니다. 나는 가상 머신 (서유럽에서) 내부에서 프로그램을 실행 중이며 내 스토리지 계정 또한 서유럽에 있습니다. 내 저장 장치에 대한 위치 정보 복제 설정이 없습니다. 내 연결 문자열이 http 프로토콜을 사용하도록 설정되었습니다.하늘 큐 성능

 // http://blogs.msdn.com/b/windowsazurestorage/archive/2010/06/25/nagle-s-algorithm-is-not-friendly-towards-small-requests.aspx 
     ServicePointManager.UseNagleAlgorithm = false; 

     CloudStorageAccount storageAccount=CloudStorageAccount.Parse(ConfigurationManager.AppSettings["DataConnectionString"]); 

     var cloudQueueClient = storageAccount.CreateCloudQueueClient(); 

     var queue = cloudQueueClient.GetQueueReference(Guid.NewGuid().ToString()); 

     queue.CreateIfNotExist(); 
     var w = new Stopwatch(); 
     w.Start(); 
     for (int i = 0; i < 50;i++) 
     { 
      Console.WriteLine("nr {0}",i); 
      queue.AddMessage(new CloudQueueMessage("hello "+i));  
     } 

     w.Stop(); 
     Console.WriteLine("elapsed: {0}", w.ElapsedMilliseconds); 
     queue.Delete(); 

어떻게 성능을 향상시킬 수 있습니까?

편집 : 나는 원래 게시 한 코드를-분석을 다시하고 오류를 재현하기에 충분 완료되지 않았 음을 발견 Sandrino 디 마티아의 답변에 따라

. 사실 ServicePointManager.UseNagleAlgorithm = false를 호출하기 바로 전에 대기열을 만들었습니다. 내 문제를 재현하는 코드는 더 다음과 같습니다

 CloudStorageAccount storageAccount=CloudStorageAccount.Parse(ConfigurationManager.AppSettings["DataConnectionString"]); 

     var cloudQueueClient = storageAccount.CreateCloudQueueClient(); 

     var queue = cloudQueueClient.GetQueueReference(Guid.NewGuid().ToString()); 

     //ServicePointManager.UseNagleAlgorithm = false; // If you change the nagle algorithm here, the performance will be okay. 
     queue.CreateIfNotExist(); 
     ServicePointManager.UseNagleAlgorithm = false; // TOO LATE, the queue is already created without 'nagle' 
     var w = new Stopwatch(); 
     w.Start(); 
     for (int i = 0; i < 50;i++) 
     { 
      Console.WriteLine("nr {0}",i); 
      queue.AddMessage(new CloudQueueMessage("hello "+i));  
     } 

     w.Stop(); 
     Console.WriteLine("elapsed: {0}", w.ElapsedMilliseconds); 
     queue.Delete(); 

응용 프로그램이 시작될 때 ServicePointManager가 초기화 장점을 app.config 파일을 한 사용 ServicePointManager을 구성하는 Sandrino에서 제안 된 솔루션, 당신 때문에 돈 시간 의존성에 대해 걱정할 필요가 없습니다.

+0

루프에서 Console.WriteLine()을 제거하면 어떻습니까? – cirrus

+0

그러면 몇 밀리 초 빨라지지만 여전히 약 4 메시지/초입니다. – shaft

+0

필자는 500/s가 단일 대기열의 전체적인 확장 성 성능이라고 생각합니다. 반드시 직렬 읽기/쓰기가 필요하지는 않습니다. 단일 스레드는 확장 방법이 아니므로 왕복 지연 일 수 있습니다. 비동기로 전환하거나 배치 작업을 시도 할 수 있습니까? http://msdn.microsoft.com/en-us/library/windowsazure/hh528527.aspx – cirrus

답변

10

며칠 전에 비슷한 질문에 대답했습니다 : How to achive more 10 inserts per second with azure storage tables.

테이블 저장소에 1000 개의 항목을 추가하는 데 3 분 이상 걸리고 변경 사항에 대해서는 4 초 (250 요청/초)로 떨어졌습니다. 결국 테이블 스토리지 및 스토리지 큐가 모두 다르지는 않습니다. 백엔드는 동일하며 데이터는 단순히 다른 방식으로 저장됩니다. 또한 테이블 저장소와 대기열은 REST API를 통해 노출되므로 요청 처리 방식을 향상 시키면 더 나은 성능을 얻을 수 있습니다.

가장 중요한 변화 :

  • expect100Continue : 거짓
  • useNagleAlgorithm : false 관련 connectionManagement/maxconnection
+0

나는 당신의 제안을 시도하고 즉시 (다른 게시물에서 system.net 구성 섹션을 사용하여) 일했습니다. 고맙습니다! 그러나 app.config의 변경없이 내 코드가 제대로 작동하지 않는 이유가 궁금해서 프로그래밍 방식으로 false로 Nagle 알고리즘을 설정했습니다. ServicePointManager를 프로그래밍 방식으로 구성 할 때 큐를 인스턴스화하기 전에이 작업을 수행해야합니다. – shaft

+0

나는 perf 문제가 너무있어, 당신은 4m/s 개선을 당신에게 줬어? – pkr2000

1

, ServicePointManager와 함께

  • 병렬 요청을 (이미이 일을하고 있습니다). 서비스 지점을 만들기 전에 DefaultConnectionLimit를 늘려야합니다. 실제로 Sandrino의 답변은 같은 것을 말하지만 config를 사용합니다.

    클라우드에서도 프록시 검색을 사용 중지합니다. 프록시 구성 요소에서 자동 감지. 초기화가 느려집니다.

    분산 파티션 키를 선택하십시오.

    귀하의 계정을 가까이 배치하여 계산하고 고객을 확보하십시오.

    필요에 따라 더 많은 계정을 추가하도록 디자인합니다. 내가 정확히 2012 세션을 구축보고 있었다으로

    마이크로 소프트는 7 일 2012 년

    내가 Sandrino의 링크 대답을 읽어 보지 않았

    의로 큐와 테이블에 2,000 TPS에 SLA를 설정, 죄송합니다, 바로이 질문에 있던 .