2017-01-26 10 views
1

私は、私たちにapi/valuesコントローラを提供するAsp.NetコアWebアプリケーション(.Net Core)テンプレートを使用してdotnetコアWeb APIを作成しました。 Windows Azureストレージライブラリv8.0を使用している蒼穹ストレージキューhttps://www.nuget.org/packages/WindowsAzure.Storage/8.0.0Azureストレージキューのパフォーマンスが悪い - わずか200 RPS

現在のところ、私が単一のリクエストをするとき、キューは約平均をとる。メソッドをAddMessageAsync()を完了するために140msしかし、私は200の要求を毎秒の負荷テストを行う場合、同じメソッドが完了するために平均800msかかります。 azureストレージキューによると、毎秒2000リクエストを処理できるはずですが、毎秒200リクエストを取得することはできません。

私は誰かがWebアプリケーションのAPIが期待どおりに実行されない理由として何らかの情報を提供していただければ幸いです。

public class QueueAccessLayer : IQueueAccessLayer 
{ 
    private CloudQueueClient _queueClient;   
    private CloudStorageAccount _storageAccount; 

    private CloudQueue _emailQueue; 
    private ILogger<QueueAccessLayer> _logger; 


    public QueueAccessLayer(ILogger<QueueAccessLayer> logger) 
    { 
     _storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=test1;AccountKey=#####;"); 
     _queueClient = _storageAccount.CreateCloudQueueClient(); 
     _emailQueue = _queueClient.GetQueueReference("emailqueue"); 
     _emailQueue.CreateIfNotExistsAsync().Wait(); 

     _logger = logger; 
    } 

    public async Task<bool> SendMessage(string msg) 
    { 
     Stopwatch watch = new Stopwatch(); 
     watch.Start(); 
     CloudQueueMessage message = new CloudQueueMessage(msg); 
     await _emailQueue.AddMessageAsync(message); 
     watch.Stop(); 

     _logger.LogInformation(msg + " - " + watch.ElapsedMilliseconds + "ms"); 
     return true; 
    } 
} 

public interface IQueueAccessLayer 
{ 
    Task<bool> SendMessage(string msg); 
} 
+0

RPSもWebAppによって制限されています。[アプリケーションサービスプランの階層を変更したりスケールアウトしてみてください](https:// docs Microsoft.com/en-us/azure/app-service/azure-web-sites-web-hosting-plan-in-depth-overview)を参照して、RPSの改善点を確認してください。 –

+0

現在、私のWebアプリケーションはドッキング・コンテナでローカルに実行されています。 – user1754675

+0

私はこの行をコメントする場合は_queue.SendMessage(emailMessage)を待つことを理解します。私は72秒間の平均応答で約1814要求/秒を取得します。上記で私は600ms平均応答で152 rpsを得る。 – user1754675

答えて

0

することを確認してください

[Route("api/[controller]")] 
public class EmailController : Controller 
{ 
    private IQueueAccessLayer _queue; 

    public EmailController(IQueueAccessLayer queue) 
    { 
     _queue = queue; 
    } 

    // POST api/values 
    [HttpPost] 
    public async Task<IActionResult> Post([FromBody]string value) 
    { 
     var emailMessage = "Message Id - " + Guid.NewGuid(); 
     await _queue.SendMessage(emailMessage); 
     return new EmptyResult(); 
    } 
} 

QueueAccessLayer.cs ConfigureServices()

// Add QueueAccessLayer. 
services.AddSingleton<IQueueAccessLayer, QueueAccessLayer>(); 

Emailcontroller.cs -

私のコード例

Startup.csは、以下を参照してくださいfを設定するアプリケーション起動時にollowing:

  1. ServicePointManager.Expect100Continue = false;
  2. ServicePointManager.UseNagleAlgorithm = false;

Expect100Continueがfalseに設定されている - 要求を送信するときにサーバー側へのラウンドトリップを減らします。

UseNagleAlgorithmをfalseに設定 - Nagleの最適化が無効になり、パフォーマンスが大幅に向上します。

これを説明する素晴らしいブログがあります:Nagle’s Algorithm is Not Friendly towards Small Requests

Naglingは、送信側のTCPの最適化であり、背中の小さなセグメントを保持することによってこれが達成された...大きなTCPセグメントに小型の送信要求を合体することにより、ネットワークの輻輳を軽減するように設計されるか、TCPは、送信するための十分なデータを持ってまで、フルサイズのセグメントまたはすべての未処理データがレシーバによって確認されるまで...テストは、同じジオロケーションのストレージアカウントにアクセスするワーカーロールとして実行されます。これは、長さが480バイトのメッセージを挿入します。結果は、ネガリングをオフにして平均レイテンシが600%以上向上することを示しています

関連する問題