창 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에서 제안 된 솔루션, 당신 때문에 돈 시간 의존성에 대해 걱정할 필요가 없습니다.
루프에서 Console.WriteLine()을 제거하면 어떻습니까? – cirrus
그러면 몇 밀리 초 빨라지지만 여전히 약 4 메시지/초입니다. – shaft
필자는 500/s가 단일 대기열의 전체적인 확장 성 성능이라고 생각합니다. 반드시 직렬 읽기/쓰기가 필요하지는 않습니다. 단일 스레드는 확장 방법이 아니므로 왕복 지연 일 수 있습니다. 비동기로 전환하거나 배치 작업을 시도 할 수 있습니까? http://msdn.microsoft.com/en-us/library/windowsazure/hh528527.aspx – cirrus