6

在对我们的应用服务器进行压力测试时,我们从 Redis 中得到了以下异常:

ServiceStack.Redis.RedisException: could not connect to redis Instance at redis-host:6379 ---> System.Net.Sockets.SocketException: 由于系统缺少足够的缓冲区空间或队列,无法对套接字执行操作已满 redis-host:6379 在 System.Net.Sockets.Socket.Connect(IPAddress[] 地址,Int32 端口) 在 System.Net.Sockets.Socket.Connect(String host, Int32 端口) 在 ServiceStack.Redis.RedisNativeClient.Connect() --- 结束内部异常堆栈跟踪 --- 在 ServiceStack.Redis.RedisNativeClient.AssertConnectedSocket() 在 ServiceStack.Redis.RedisNativeClient.SendCommand(Byte[][] cmdWithBinaryArgs) 在 ServiceStack.Redis.RedisNativeClient 的 ServiceStack.Redis.RedisNativeClient.Connect() .SendExpectData(Byte[][] cmdWithBinaryArgs) at ServiceStack.Redis.RedisClient.GetValueFromHash(String hashId, String key) at ServiceStack.Redis.Generic.RedisTypedClient 1.GetValueFromHash[TKey](IRedisHash2 hash, TKey key)

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。所以我开始看看这是否是操作系统问题。在 ServiceStack 向 Demis 发送电子邮件后,得出的结论是 ServiceStack 正确关闭了套接字。查看操作系统,通过设置 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 回答