StackExchange.Redis System.TimeoutException
StackExchange.Redis System.TimeoutException
当我尝试持久化一系列数据时突然出现超时异常,之前它是有效的,我没有做任何更改:
Timeout performing HMSET {key}, inst: 0, mgr: ExecuteSelect, err:
never, queue: 2, qu: 1, qs: 1, qc: 0, wr: 1, wq: 1, in: 0, ar: 0,
clientName: {machine-name}, serverEndpoint:
Unspecified/localhost:6379, keyHashSlot: 2689, IOCP:
(Busy=0,Free=1000,Min=4,Max=1000), WORKER:
(Busy=0,Free=2047,Min=4,Max=2047), Local-CPU: 100% (Please take a look
at this article for some common client-side issues that can cause
timeouts:
https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md)
我在 windows 上使用 Redis。
在您的超时错误消息中,我看到 Local-CPU: 100%。这是调用 Redis 服务器的客户端上的 CPU。您可能想查看导致客户端 CPU 负载过高的原因。
本文介绍了 CPU 使用率过高会导致客户端超时的原因。 https://gist.github.com/JonCole/db0e90bedeb3fc4823c2#high-cpu-usage
我发现了导致问题的原因,因为我正在尝试批量插入哈希。我所做的是将插入的列表分成更小的列表。
所以,我和这个问题纠缠了几天,差点放弃。就像@Amr Reda 说的那样,将大集合分成小集合可能会奏效,但这不是最佳选择。
就我而言,我试图将 27,000 条记录移动到 Redis 中,但我一直遇到这个问题。
要解决此问题,增加 redis 连接字符串中的 SyncTimeout 值。它默认设置为 1000 毫秒,即 1 秒。添加大型数据集通常需要更长的时间。
在我的案例中有用的快速建议,使用控制台 .net 项目,使用多线程(大约 30.000)并发性非常高。
在 program.cs 中,我添加了一些 ThreadPool 设置:
int newWorkerThreadsPerCore = 50, newIOCPPerCore = 100;
ThreadPool.SetMinThreads(newWorkerThreadsPerCore, newIOCPPerCore);
此外,我必须更改所有内容:
var redisValue = dbCache.StringGet("SOMETHING");
收件人:
var redisValue = dbCache.StringGetAsync("SOMETHING").Result;
即使你可能认为它们看起来几乎一样(考虑到你总是最终等待结果),如果你使用非异步版本并且一个线程收到 redis 超时,它会使所有其他线程29.999 个线程也在等待 Redis 超时,而异步线程只会在那个唯一的线程中导致超时。
当我尝试持久化一系列数据时突然出现超时异常,之前它是有效的,我没有做任何更改:
Timeout performing HMSET {key}, inst: 0, mgr: ExecuteSelect, err: never, queue: 2, qu: 1, qs: 1, qc: 0, wr: 1, wq: 1, in: 0, ar: 0, clientName: {machine-name}, serverEndpoint: Unspecified/localhost:6379, keyHashSlot: 2689, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=2047,Min=4,Max=2047), Local-CPU: 100% (Please take a look at this article for some common client-side issues that can cause timeouts: https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md)
我在 windows 上使用 Redis。
在您的超时错误消息中,我看到 Local-CPU: 100%。这是调用 Redis 服务器的客户端上的 CPU。您可能想查看导致客户端 CPU 负载过高的原因。
本文介绍了 CPU 使用率过高会导致客户端超时的原因。 https://gist.github.com/JonCole/db0e90bedeb3fc4823c2#high-cpu-usage
我发现了导致问题的原因,因为我正在尝试批量插入哈希。我所做的是将插入的列表分成更小的列表。
所以,我和这个问题纠缠了几天,差点放弃。就像@Amr Reda 说的那样,将大集合分成小集合可能会奏效,但这不是最佳选择。
就我而言,我试图将 27,000 条记录移动到 Redis 中,但我一直遇到这个问题。
要解决此问题,增加 redis 连接字符串中的 SyncTimeout 值。它默认设置为 1000 毫秒,即 1 秒。添加大型数据集通常需要更长的时间。
在我的案例中有用的快速建议,使用控制台 .net 项目,使用多线程(大约 30.000)并发性非常高。
在 program.cs 中,我添加了一些 ThreadPool 设置:
int newWorkerThreadsPerCore = 50, newIOCPPerCore = 100;
ThreadPool.SetMinThreads(newWorkerThreadsPerCore, newIOCPPerCore);
此外,我必须更改所有内容:
var redisValue = dbCache.StringGet("SOMETHING");
收件人:
var redisValue = dbCache.StringGetAsync("SOMETHING").Result;
即使你可能认为它们看起来几乎一样(考虑到你总是最终等待结果),如果你使用非异步版本并且一个线程收到 redis 超时,它会使所有其他线程29.999 个线程也在等待 Redis 超时,而异步线程只会在那个唯一的线程中导致超时。