asp.net - ASP.NET 内存缓存和线程阻塞
问题描述
我们有一个应用程序大量使用了 .NET 提供的 MemoryCache 类,直到最近,我们的服务器上的一切都运行良好,但现在我们开始注意到在高峰使用时间期间经常出现 CPU 峰值。
在用 WinDbg 分析了一些进程转储之后,出现了一个共同的主题,我认为这与我们对 MemoryCache 的使用有关。
基本上,我看到的是一个线程使用 TimerQueue 对象阻塞了许多线程,我认为这是试图使 MemoryCache 对象中的一个项目过期。
目前,我们为每个用户缓存一定级别的数据库结果,绝对过期时间为 10 秒。我们所在的服务器有 16 个内核,我认为这足以处理相当数量的并发性。
所以看起来正在发生的事情是,如果我们在系统上的并发使用量增加(可能试图写入缓存),而自动缓存到期线程试图从缓存中删除一个项目,所有这些线程将在从缓存中删除完成之前被阻止?
这种解释看起来是否准确,如果是,是否有人提出改进性能的建议?
到目前为止,我唯一的解决方案如下:
- 添加一些负载平衡来帮助分散使用,并希望避免这个问题
- 将过期阈值提高到大约 30 秒,以帮助抵消它
- 完全使用不同的缓存机制
解决方案
推荐阅读
- php - 在 WordPress-Developing 中寻找解决方案
- javascript - 将 CSS 应用于单个反应组件
- image-processing - 如何缩放和裁剪图像文件夹?
- asp.net-web-api - 使用 ASP.NET Core Identity 连接 IdentityServer4.AccessTokenValidation 和引用令牌
- jboss - 如何在 wildfly-config.xml 中为部署在 JBoss EAP 7.1 上的 EJB 客户端应用程序配置远程 EJB 连接详细信息?
- pycharm - 如何使用 virtualenv 配置 pycharm 远程解释器
- apache-kafka - 如何在 Esper 中使用 match_recognize 对事件流中事件的未知属性进行模式匹配?
- angular - 使用角材料时如何应用星级
- r - read.csv 比 data.table::fread 快
- php - 无法使用 Ubuntu 14.04.02 安装 PHP 7.0