csla 与高cpu
在项目中一直使用csla 4.13.
项目一直正常,但是偶尔会出现iis占用的cpu 突然100%,
后面客户量大的情况,加入了缓存的机制.100%的情况出现的更多了.
当时有数据库死锁的原因.cpu占用到99%.捕捉dump很不现实.在过了一年多了.终于在开启了数据库捕捉死锁提示,在修改数据库的读写为
READ_COMMITTED_SNAPSHOT 之后.如下方式.
ALTER DATABASE [数据库名] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [数据库名] SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE [数据库名] SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE [数据库名] SET MULTI_USER
但是又出现iis占用了很高的cpu 90%,很长时间.终于第一次在服务器上面捕捉到dump.
通过对dump分析,发现问题.
11个线程访问同一个对象,卡住了.
mscorlib_ni!System.Collections.Generic.Dictionary2[[System.__Canon, mscorlib],[System.Boolean, mscorlib]].FindEntry(System.__Canon)+c8 Csla.Core.BusinessBase.CanReadProperty(Csla.Core.IPropertyInfo)+44 Csla.Core.BusinessBase.GetProperty[[System.__Canon, mscorlib]](Csla.PropertyInfo
1, Csla.Security.NoAccessBehavior)+38
此问题不好查询到.几乎从来没有想到是由于Dictionary出现的问题.
后面在github上面提交此问题.最后搜索到此问题已被处理,2015-12月的处理.详细见下面的链接.
https://github.com/MarimerLLC/csla/commit/aaf96203f45fb84594605ac80faeadab84634d47
将相关的Dictionary改为ConcurrentDictionary,即可.