【问题标题】:StackExchange.Redis timeout on High number of requests大量请求时 StackExchange.Redis 超时
【发布时间】:2017-04-06 10:01:24
【问题描述】:

我有一个使用 StackExchange.Redis 的分布式 Web 服务 (WCF),每天大约有 500 万个请求。

我有时会收到此错误(有时值可能不同):

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 的调用,以便快速响应而不出现此错误?

【问题讨论】:

标签: c# wcf redis stackexchange.redis


【解决方案1】:

您可能对与 redis 服务器建立的连接数量有问题。正在通过 TCP 端口建立连接。单个源 IP 可以与单个目标 IP 和端口建立的 TCP 会话的最大数量为 65,535。这假定使用源 IP 的 16 位源端口范围(不包括 0)中的每个可用源端口。实际上,大多数操作系统仅创建临时源端口 - 客户端使用的端口类型 - 从端口 32768 开始(0-65535 范围后半部分中的最小数字),这意味着您最多可以与单个目标 IP 和侦听端口建立 32,768 个连接。显然,其他资源限制可能会阻止这一点,但这是理论上的最大值。 长话短说 - 请确保您在工作人员完成工作后关闭连接(SISMEMBER 命令)。错误消息表明您有可用的工作人员,但他们无法建立与 redis 服务器的连接,并且由于 client 超时而失败。 请检查连接数,如果可用连接数用完,请在与 redis 的连接中使用 keepAlive 选项。您还可以使用 connectTimeout 选项设置连接操作的超时时间(以毫秒为单位),并使用 connectRetry 设置在初始 Connect 命令期间重复连接尝试的次数。

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 2019-05-05
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2011-02-26
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多