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.PropertyInfo1, Csla.Security.NoAccessBehavior)+38

此问题不好查询到.几乎从来没有想到是由于Dictionary出现的问题.

后面在github上面提交此问题.最后搜索到此问题已被处理,2015-12月的处理.详细见下面的链接.

https://github.com/MarimerLLC/csla/commit/aaf96203f45fb84594605ac80faeadab84634d47

将相关的Dictionary改为ConcurrentDictionary,即可.

posted @ 2017-04-14 15:40  forhells  阅读(164)  评论(0编辑  收藏  举报