6

アプリケーション サーバーのストレス テスト中に、Redis から次の例外が発生しました。

ServiceStack.Redis.RedisException: redis-host:6379 で redis インスタンスに接続できませんでした ---> System.Net.Sockets.SocketException: システムに十分なバッファ領域がないか、キューが不足しているため、ソケットでの操作を実行できませんでしたいっぱいだった redis-host:6379 System.Net.Sockets.Socket.Connect(IPAddress[] アドレス、Int32 ポート) で System.Net.Sockets.Socket.Connect(文字列ホスト、Int32 ポート) で ServiceStack.Redis.RedisNativeClient.Connect() --- 終了内部例外スタック トレースの --- ServiceStack.Redis.RedisNativeClient.Connect() で ServiceStack.Redis.RedisNativeClient.AssertConnectedSocket() で ServiceStack.Redis.RedisNativeClient.SendCommand(Byte[][] cmdWithBinaryArgs) で ServiceStack.Redis.RedisNativeClient .SendExpectData(Byte[][] cmdWithBinaryArgs) で ServiceStack.Redis.RedisClient.GetValueFromHash(文字列 hashId、文字列キー) で ServiceStack.Redis.Generic.RedisTypedClient 1.GetValueFromHash[TKey](IRedisHash2 ハッシュ、TKey キー)

redis ホスト ポートで接続制限を超えているようです。Redis.conf またはサーバー構成を介してこのしきい値を増やす方法はありますか? Ubuntu サーバーで Redis インスタンスをホストしました。

4

1 に答える 1

1

ServiceStack を使用して、バッファー サイズの制限を超えたという同じ問題を再現できました。ストレス テストを行うコードはこちらです。アプリケーションの 20 インスタンスを少なくとも 20 分間実行します。https://github.com/ServiceStack/ServiceStack.Redis/commit/b01582f9c873f375794c04d46aad400590ca5bf3

最初に表示されるエラーは、「 Redis がビジー ロードで接続できない」で説明されているように、「Redis インスタンスに接続できませんでした」ですが、内部例外を展開すると、「システムに十分なリソースがないため、ソケットでの操作を実行できませんでした」と表示されます。バッファ スペースまたはキューがいっぱいだったためです。」

私の問題は Window7 で発生しましたが、Window Server 2008 rc では発生しませんでした。それで、それがOSの問題であるかどうかを調べ始めました。ServiceStack で Demis に電子メールを送信した後、ServiceStack がソケットを正しく閉じているという結論に達しました。OS を見ると、TcpTimeWaitDelay と MaxUserPort を設定することで問題が解決されました。

より多くの参照。TcpTimeWaitDelay を 45 秒に

および MaxUserPort http://mashijie.blogspot.com/2009/05/change-default-setting-of-tcp-ports.html

ポート範囲を 1025-64511 に調整しました

于 2014-02-06T16:37:03.050 に答える