2016-11-22 31 views
0

我有一個使用StackExchange.Redis的分佈式Web服務(WCF),每天有大約5千萬個請求。StackExchange.Redis超時請求數量大

我收到這個錯誤一些時間(這些值可以diferent一些次):

System.TimeoutException:超時執行SISMEMBER KeyAllUsersFlag,研究所:7,隊列:6,曲:0,適量: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,免費= 793,最小值= 400,最大值= 800),本地-CPU:在webconfig不可用

我有:

的httpRuntime targetFramework = 「4.6.1」 minFreeThreads = 「704」 minLocalRequestFreeThreads = 「608」

在機器配置我有:

中processModel maxWorkerThreads = 「100」 maxIoThreads = 「400」 minWorkerThreads = 「50」 minIoThreads = 「300」

在配置爲多路複用器我有:

var configurationOptions = new ConfigurationOptions 
{ 
    AbortOnConnectFail = false, 
    SyncTimeout = 2000, 
}; 

我可以做些什麼來otimize呼叫redis,有一個快速的反應,並沒有得到這個錯誤?

+1

也許有關https://github.com/StackExchange/StackExchange.Redis/issues/83 –

回答

1

您可能在與redis服務器建立的連接數量方面存在問題。連接正在通過TCP端口建立。單個源IP對單個目標IP和端口的TCP會話的最大數量爲65,535。這假定源IP的16位源端口範圍(不包括0)中的每個可用源端口都被使用。實際上,大多數操作系統僅創建臨時源端口 - 客戶端使用的端口類型 - 從端口32768開始(0-65535範圍後半部分的最低號碼),這意味着您可以最多連接32,768個連接到單個目標IP和偵聽端口。顯然,其他資源約束可能會阻止這一點,但這是理論上的最大值。長話短說 - 請確保您在工作完成後關閉連接(SISMEMBER命令)。錯誤消息表示您有可用的工作人員,但他們無法建立與Redis服務器的連接,並且由於客戶端超時而失敗。 請檢查連接號碼,如果您連接的可用連接數量不足,請在連接到redis時使用keepAlive選項。您還可以使用connectTimeout選項設置連接操作的超時時間(以毫秒爲單位),並使用connectRetry設置初始連接命令期間重複嘗試連接的次數。