Redisタイムアウトのトラブルシューティング
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
Redisのタイムアウト(RedisTimeoutException)は、サーバーまたはクライアントのいずれかによって引き起こされるさまざまな条件によって発生します。このトピックは、最も一般的なタイムアウトシナリオのいくつかに対する答えを見つけるのに役立ちます。詳細については、GithubおよびMicrosoft Azureドキュメントも参照してください。
サーバー側およびクライアント側の問題
Azure管理のRedisの状態やそれをホストする仮想マシンによって引き起こされる問題の解決方法を学びましょう。
インフラ関連の原因に対する可能な解決策:
原因
解決策
帯域幅/サイズ制限
Redis Serverの指標を監視し、帯域幅やサイズの制限に達していないか確認してください。可能な解決策:
- Redisサーバーのアップグレード価格 帯 。
- Redisのセッションステートプロバイダーでcompression=”true”が有効になっていることを確認してください。セッションステートデータを圧縮することで、SitecoreインスタンスとRedisデータベース間で転送されるデータ量が減ります。
クライアントのCPU/メモリ/帯域幅使用率が高い
高いCPU、メモリ、または帯域幅の使用量は、 operationTimeoutInMilliseconds 間隔内でリクエストが処理されず、リクエストがタイムアウトされる原因となることがあります。可能な解決策:
- CPU、メモリ、帯域幅を消費しているものを調べましょう。
- クライアントをより大きなVMやアプリサイズ、より多くのCPU/メモリ/帯域幅にアップグレードしましょう。
- Redisのセッションステートプロバイダーでcompression=”true”が有効になっていることを確認してください。セッションステートデータを圧縮することで、SitecoreインスタンスとRedisデータベース間で転送されるデータ量が減ります。
Azureではサーバーアプリケーションとクライアントアプリケーションは同じリージョンに属していません
キャッシュとクライアントが同じAzureリージョンにあることを推奨します。例えば、キャッシュが米国東部にあってもクライアントが米国西部にいて、リクエストが operationTimeoutInMilliseconds 期間内に完了しない場合にタイムアウトが発生することがあります。
適用上の問題点
高負荷は複数の原因でRedisTimeoutExceptionを引き起こすことがあります。問題を解決するためにアプリケーションのセットアップや負荷を調整してみてください。
応用関連の原因に対する可能な解決策:
原因
解決策
スレッドの制限
RedisTimeoutExceptionメッセージにWORKERとIOCPのBusyの値が含まれていて、これらの値がメッセージの最小値より大きい場合、ThreadPoolのサイズを監視し、最小値を負荷に応じて調整するThreadPoolSizeMonitorのパラメータを変更できます。
>[!重要]
> 設定ファイルに直接変更を加えないでください。代わりに、実行時に必要な変更を行うパッチファイルを作成しなければなりません。
- パッチパラメータは以下の sitecore/pipelines/initialize/processortype="Sitecore.Analytics.Pipelines.Loader.StartThreadPoolSizeMonitor, Sitecore.Analytics"]。
リクエストが多すぎる
StackExchange.Redisクライアントは単一のTCP接続を使用し、一度に1つの応答しか読み取れません。最初の操作がタイムアウトしても、サーバーへのデータの送信は止まりません。そのため、他のリクエストをブロックし、タイムアウトを引き起こします。RedisTimeoutExceptionメッセージのパラメータqsは、送信されたが応答が処理されていないリクエスト数を示しています。
可能な解決策:
- Redisのセッションステートプロバイダーで、クライアントの ConnectionMultiplexer オブジェクトのプールを connectionPoolSize 設定で調整します。この設定はRedisとの通信のために作成される ConnectionMultiplexers の数を制御します。デフォルト値は 1です。
環境に最適な値を見つけるために、マシンCPUコア数を2で割ってみると良いでしょう。例えば、16コアマシンに対しては connectionPoolSize="8" を使います。
operationTimeoutInMillisecondsまたはretryTimoutInMilliseconds
Sitecore Redis セッション状態プロバイダーは、操作に対して operationTimeoutInMillisecondsとretryTimeoutInMilliseconds という設定を使用します。指定された時間内に通話が完了しない場合、Redis クライアントはタイムアウトエラーを出します。
可能な解決策:
- operationTimeoutInMillisecondsやretryTimeoutInMilliseconds設定の値を上げてください。
- retryTimeoutInMilliseconds値がoperationTimeoutInMilliseconds値より高くなっていることを確認してください。そうでなければリトライは起こりません。