在对我们的应用程序服务器进行压力测试时,我们从Redis得到以下例外:
ServiceStack.Redis.RedisException:无法连接到redis-host上的redis实例:6379 ---> System.Net.Sockets.SocketException:无法执行套接字上的操作,因为系统缺少足够的缓冲区空间或因为队列已满Redis-host:6379 在System.Net.Sockets.Socket.Connect(IPAddress []地址,Int32端口) 在System.Net.Sockets.Socket.Connect(String host,Int32 port) 在ServiceStack.Redis.RedisNativeClient.Connect() ---内部异常堆栈跟踪结束--- 在ServiceStack.Redis.RedisNativeClient.Connect() 在ServiceStack.Redis.RedisNativeClient.AssertConnectedSocket() at ServiceStack.Redis.RedisNativeClient.SendCommand(Byte [] [] cmdWithBinaryArgs) at ServiceStack.Redis.RedisNativeClient.SendExpectData(Byte [] [] cmdWithBinaryArgs) at ServiceStack.Redis.RedisClient.GetValueFromHash(String hashId,String key) at ServiceStack.Redis.Generic.RedisTypedClient
1.GetValueFromHash[TKey](IRedisHash
2 hash,TKey key)
似乎在redis主机端口上有连接限制超过。知道如何通过Redis.conf或服务器配置提高此阈值吗?我们在Ubuntu服务器上托管了Redis实例。
答案 0 :(得分:1)
我能够使用ServiceStack复制相同的缓冲区大小限制问题。进行压力测试的代码在这里 - 运行20个应用程序实例至少20分钟。 https://github.com/ServiceStack/ServiceStack.Redis/commit/b01582f9c873f375794c04d46aad400590ca5bf3
您可能会看到的第一个错误是“无法连接到redis实例”,如下所述 Redis unable to connect in busy load,但如果扩展内部异常,则会看到“由于系统缺少足够的缓冲区空间或队列已满,无法执行对套接字的操作”
我的问题出现在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