Redisのタイムアウトのトラブルシューティング

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

Redisのタイムアウト(RedisTimeoutException)は、サーバーまたはクライアントによって引き起こされるさまざまな条件が原因で発生します。このトピックは、最も一般的なタイムアウト シナリオのいくつかの答えを見つけるのに役立ちます。詳細については、GithubMicrosoft Azureのドキュメントも参照してください。

サーバー側とクライアント側の問題

Azure Cache for Redisの状態、またはそれをホストしている仮想マシンが原因で発生する問題を解決する方法について説明します。

インフラストラクチャ関連の原因に対して考えられる解決策:

原因

解決

帯域幅/サイズの制限

Redis Serverのメトリクスを監視して、帯域幅/サイズの制限に達しているかどうかを確認します。考えられる解決策:

クライアントのCPU/メモリ/帯域幅の使用率が高い

CPU、メモリ、または帯域幅の使用量が多いと、要求がoperationTimeoutInMilliseconds間隔内に処理されず、要求がタイムアウトする可能性があります。考えられる解決策:

  • CPU、メモリ、帯域幅を消費しているものを調査します。

  • クライアントを、より多くのCPU/メモリ/帯域幅を備えたより大きなVMまたはアプリ サイズにアップグレードします。

  • compression=”true” がRedisセッション状態プロバイダーに対して有効になっていることを確認します。セッション状態データを圧縮すると、SitecoreインスタンスとRedisデータベース間で転送するデータ量が減ります。

    手記

    この解決策により、追加のCPUオーバーヘッドが発生する可能性があります。

サーバーとクライアント アプリケーションがAzureの同じリージョンにない

キャッシュとクライアントを同じAzureリージョンに配置することをお勧めします。たとえば、キャッシュが米国東部にあるが、クライアントが米国西部にあり、リクエストがoperationTimeoutInMilliseconds間隔内に完了しない場合、タイムアウトが発生する可能性があります。

アプリケーションの問題

高負荷は、いくつかの理由の組み合わせによりRedisTimeoutExceptionを引き起こす可能性があります。問題を解決するために、アプリケーションのセットアップ/負荷を調整してみてください。

アプリケーション関連の原因に対して考えられる解決策:

原因

解決

スレッドの制限

RedisTimeoutExceptionメッセージにWORKERとIOCPの値 (Busy) が含まれており、これらの値がメッセージのMin値より大きい場合は、ThreadPoolサイズを監視し、Min値を負荷に合わせて調整するThreadPoolSizeMonitorのパラメーターを変更できます。

大事な

設定ファイルを直接変更しないでください。代わりに、実行時に必要な変更を実行するパッチ ファイルを作成する必要があります。

  • パッチパラメータ: sitecore/pipelines/initialize/processortype="Sitecore.Analytics.Pipelines.Loader.StartThreadPoolSizeMonitor, Sitecore.Analytics"

    大事な

    値を高く設定しすぎると、アプリケーションの速度が低下する可能性があります。

リクエストが多すぎます

StackExchange.Redisクライアントは1つのTCP接続を使用し、一度に1つの応答しか読み取ることができません。最初の操作がタイムアウトした場合でも、サーバーとの間でのデータの送受信は停止しません。このため、他のリクエストがブロックされ、タイムアウトが発生します。RedisTimeoutExceptionメッセージでは、パラメーター qsは、送信されたが応答を処理していない要求の数を示します。

考えられる解決策:

  • Redisセッション状態プロバイダーで、connectionPoolSize設定を調整して、クライアント内のConnectionMultiplexerオブジェクトのプールを使用します。この設定は、Redisとの通信用に作成されるConnectionMultiplexersの数を制御します。デフォルト値は1です。

    環境に最適な値を見つけるには、マシンのCPUコアの数を2で割ってみてください。たとえば、16コア マシンにはconnectionPoolSize="8" を使用します。

operationTimeoutInMillisecondsまたはretryTimoutInMilliseconds

Sitecore Redisセッション状態プロバイダーは、操作にoperationTimeoutInMillisecondsとretryTimeoutInMillisecondsという名前の設定を使用します。指定された時間内に呼び出しが完了しない場合、Redisクライアントはタイムアウト エラーをスローします。

考えられる解決策:

  • operationTimeoutInMillisecondsretryTimeoutInMillisecondsの設定の値を増やします。

  • retryTimeoutInMilliseconds値がoperationTimeoutInMilliseconds値より大きいことを確認します。それ以外の場合、再試行は行われません。

この記事を改善するための提案がある場合は、 お知らせください!