StackExchange.Redisノート-パフォーマンスのチューニング

2049 ワード

タイムアウトの問題は、(StackExchange.Redis.RedisTimeoutException)スレッドプールの表示を増やす:ThreadPool.SetMinThreads(100, 100); GetDatabase行の前にコードを追加:connection.PreserveAsyncOrder = false;

次にStackExchangeについて説明します。Redisの2つの神器ConnectionCountersとIProfiler


1、ConnectionCounters:connection.GetCounters().Interactiveが取得したオブジェクトの後に3つのプロパティが便利です

public class ConnectionCounters
{
    /// 
    /// Operations that have been requested, but which have not yet been sent to the server
    /// 
    public int PendingUnsentItems { get; }
 
    /// 
    /// Operations that have been sent to the server, but which are awaiting a response
    /// 
    public int SentItemsAwaitingResponse { get; }
 
    /// 
    /// Operations for which the response has been processed, but which are awaiting asynchronous completion
    /// 
    public int ResponsesAwaitingAsyncCompletion { get; }
}

各プロパティは、現在のredis接続の完了するコマンドが現在存在する状態を表します.
  • PendingUnsentItemsは、送信待ちキューがまだ送信されていないコマンドが実行されていることを示す.
  • SentItemsAwaitingResponseは、送信されたが応答結果を受信していないコマンドを示します.
  • R e s p o n s e s A waitingAsyncCompletionは、応答するコマンドが受信されたが、TaskCompletionSource()が呼び出されていないことを示す.TrySetResult()のコマンドです.

  • PendingUnsenntItemsとSentItems AwaitingResponseが大きすぎる原因は、基本的にネットワークがブロックされているためです.ネットワーク帯域幅やredisのvalueが大きいかどうかを確認する必要があります.ResponsesAwaitingAsyncCompletionは、上記の例のコードのようにawait以降のコードのため、スレッドが長い同期時間を費やし、コードの最適化とPreserveAsyncOrderをfalseに設定する必要がある.

    2、ConnectionCountersはスレッドの瞬時状態を分析していますが、IProfilerはリクエストが全部でどれだけのredisコマンドを実行したか、それぞれどのくらい使用したかを追跡することができます。具体的な詳細はコード体験を書いてください。


    参照ドキュメント(https://stackexchange.github.io/StackExchange.Redis/Profiling)
    参照先:https://blog.csdn.net/px01ih8/article/details/81278724