【发布时间】:2021-01-29 15:10:22
【问题描述】:
我们在 .NET Core 3.1 与 Azure Redis 缓存的集成中遇到了问题。 抛出的异常是
执行程序时发生未处理的异常 请求。","@l":"错误","@x":"StackExchange.Redis.RedisTimeoutException: 等待响应超时(出站=1403KiB,入站=5657KiB,15000ms elapsed, timeout is 15000ms), command=EVAL, next: EVAL, inst: 0, qu: 0, qs: 709, aw: True, rs: ReadAsync, ws: Writing, in: 0, 服务器端点:redis-scr-mns-dev.redis.cache.windows.net:6380,mc: 1/1/0,经理:10 个中的 10 个可用,客户端名称:xxxxxxxxxxxx,IOCP: (忙=0,空闲=1000,最小=4,最大=1000),工人: (忙=7,空闲=32760,最小=4,最大=32767), v: 2.1.58.34321 (请取 查看这篇文章,了解可能导致的一些常见客户端问题 超时: https://stackexchange.github.io/StackExchange.Redis/Timeouts)
是的,我已经阅读了这篇文章,我们正在使用 StackExchange.Redis NuGet 包,最新版本可用。我们已经采取的步骤是
- 使用多个值设置最小线程池计数 (ThreadPool.SetMinThreads(short.MaxValue, short.MaxValue);)
- 增加 Redis timeout 值从默认的 5 秒到 15 秒(老实说,再高一点也解决不了问题,因为你会进一步阅读 :))
你问的设置是什么?
- .NET Core 3.1 REST API 在最新的 IIS 上运行,在具有 16GB RAM 的 4 核 Windows 服务器上设置了 3 个工作线程(在监控中看不到任何极端情况关于 CPU 或内存)
- 已连接到 Azure Redis 缓存。目前正在运行具有高网络带宽和 23GB 内存的Basic C5(之前是较低的,所以我们尝试扩展这个)
- 最后将请求推送到 Azure 服务总线(没有问题)
批处理进程正在运行并处理几个 10000 个 API 调用(几个 API),其中上述一个因超时异常而与 Redis 缓存崩溃。其他 api 运行正常且未超时,但当前正在连接到不同的 Redis 缓存(只是为了隔离此 api 的行为) 所有 api 和/或批处理程序都使用具有缓存实现的自定义 NuGet 包,因此我们确信这不会是该 1 api 中的实现问题,所有共享代码。
我们如何使用缓存?好吧,通过依赖注入,我们注入了 ISharedCacheStore,它只是我们自己的接口,我们放在 IDistributedCache 之上,以确保只有异步调用可用,以及 RedisCache,它是使用 Redis 的实现(ISharedCacheStore 是为了将来使用其他缓存机制) 我们使用 Microsoft.Extensions.Caching.StackExchangeRedis,版本 3.1.5 并且在启动时注册是
services.Configure<CacheConfiguration>(options => configuration?.GetSection("CacheConfiguration").Bind(options))
.AddStackExchangeRedisCache(s =>
{
s.Configuration = connectionString;
})
.AddTransient<IRedisCache, RedisCache>()
.AddTransient<ISharedCacheStore, SharedCacheStore>();
说实话,我们没有想法。我们没有看到 Azure 中的 Redis 缓存实例存在问题,因为当我们遇到超时时,这个实例甚至还没有接近它的顶部。较低定价计划的服务器负载达到约 80%,而较高定价计划的服务器负载甚至没有达到当前计划的 10%。
根据 Insights,我们在运行时每分钟有 4000 次缓存命中,导致大约 10% 的服务器负载。
更新:值得一提的是,批处理和 API 现在是在本地环境中运行,而不是在云端。计划在未来几个月内迁移到云端。 这也适用于其他 api 连接到 Redis 缓存并且不给出问题
比较
- 另一个 Azure Redis 缓存每分钟获得 45K 次点击,而没有出现任何问题(来自本地)
- 这个甚至达到了每分钟 10K 次点击的超时标记
【问题讨论】:
标签: c# .net-core redis stackexchange.redis azure-redis-cache