我有一个使用StackExchange.Redis的分布式Web服务(WCF),每天大约有5百万个请求。
我有时会收到此错误(值可能会有所不同):
System.TimeoutException:超时执行SISMEMBER KeyAllUsersFlag,inst:7,queue:6,qu:0,qs:6,qc:0,wr:0,wq:0,in:20,ar:0,clientName: SERVER,IOCP :( Busy = 20,Free = 3180,Min = 2400,Max = 3200),WORKER :( Busy = 7,Free = 793,Min = 400,Max = 800),Local-CPU:不可用
在webconfig上我有:
httpRuntime targetFramework =“4.6.1”minFreeThreads =“704”minLocalRequestFreeThreads =“608”
在机器配置上我有:
processModel maxWorkerThreads =“100”maxIoThreads =“400”minWorkerThreads =“50”minIoThreads =“300”
在配置MultiPlexer时我有:
var configurationOptions = new ConfigurationOptions
{
AbortOnConnectFail = false,
SyncTimeout = 2000,
};
我可以做些什么来最大限度地调用redis,快速响应而不会出现此错误?
答案 0 :(得分:1)
您可能遇到与redis服务器建立连接数量的问题。连接通过TCP端口建立。单个源IP可以对单个目标IP和端口进行的最大TCP会话数为65,535。这假定使用来自源IP的16位源端口范围(不包括0)中的每个可用源端口。实际上,大多数操作系统仅创建空间源端口 - 客户端使用的端口类型 - 从端口32768开始(0-65535范围的后半部分中的最小数字),这意味着您可以与单个目标IP和侦听端口建立多达32,768个连接。显然,其他资源限制可能会阻止这种情况,但这是理论上的最大值。 长话短说 - 请确保在工作完成工作后关闭连接(SISMEMBER命令)。错误消息表明您有可用的工作人员,但他们无法建立与redis服务器的连接,并且由于客户端超时而失败。 请检查连接数,如果您的连接数量不足,请在连接redis时使用keepAlive选项。您还可以使用connectTimeout选项设置连接操作的超时(以ms为单位),使用connectRetry设置在初始Connect命令期间重复连接尝试的次数。