在ASP.NET网站上锁定车队
TL; DR:
为性能进行重构,网站变慢了.在并发可视化器中,该图看起来像MSDN上描述的 lock convoys. 上下文 我正在帮助重构ASP.NET网站以切换用户控件,使其无法在数据集上执行业务逻辑,从而在业务对象上执行表示逻辑,还可以减少用户控件的数据库调用. 问题 我们已经注意到在引入涉及我们认为在多个领域中的性能改进的变化之后,性能显着下降(挂起/阻塞). 我们使用精益哨兵来监控我们网站的表现.根据挂起诊断,当GC运行时,线程池的线程用完(并根据诊断页面上的描述),它会阻止创建更多线程.根据内存诊断,GC Heap和Gen 0消耗了大量内存(约9GB). 到目前为止我做了什么? >我在Visual Studio中使用了内存分析器,并发现了我们过多的DataAdapter和DataTable用法的问题.内存消耗降至3GB,但这仅对GC阻塞有帮助.它仍然比我们引入更改之前的速度慢,但我仍然看到由CompilationLock.GetLock()和BuildManager.GetBuildResultFromCacheInternal()等函数引起的高负载阻塞.谷歌搜索他们没有返回任何有用的东西. 测试方法 我正在使用Screaming Frog来抓取网站,以便重现问题,并将Screaming Frog和Lean Sentry中的每秒请求数和响应时间作为性能指标.它可能不是最好的方式,但差异是明显的,可重复的,而且这几乎就是我所拥有的. 网站的体系结构 该网站最初大约10年前在VB.NET for .NET Framework 1.0中编码,并通过修复一些兼容性问题升级到.NET Framework 4.6.1.到目前为止,还没有任何架构变化.有一个共享的SqlHelper类,它是一个共享数据访问函数的集合,如ExecuteDataset或ExecuteDatareader,它返回DataSet,DataReader或String值.这些函数从web.config文件中读取连接字符串信息,并创建新的SqlConnection,SqlDataAdapter,SqlDataReader和SqlCommand对象以执行数据库操作.使用此共享类的数据访问层由每个模块(如购物车,类别,产品等)的类组成,这些类将在每个用户控件中实例化,并且它们由表示数据库中存储过程的函数组成. 重构 我们已经在相关用户控件的页面加载内部或者在转发器的OnItemDataBound事件内部引入了一些要实例化的新对象,并附加到其子用户控件的公共属性,这些属性被重构为使用该对象.但是,还有其他子用户控件需要多个数据表,因此我们决定将其中一个数据表存储在其中一个对象中,并通过将其分配给其公共属性将其传递给相关的用户控件. 我想我们通过引入这些对象来损害性能.即使数据库调用和内存消耗似乎减少了,我想知道对象是否导致线程一直被同步. 任何重构发生之前的图形: 我提到的所有重构应用后的图形: 你能帮我辨认一下这个问题吗? 解决方法
你的问题相当复杂.我认为您有两个基本选项可以解决您的重构性能问题:
>将代码更改恢复到尚未完成所有或大部分重构的时间点,以及当您的性能比当前遇到的更好时.然后,逐步添加新类以提高性能.如果更改未提高性能,则撤消它并尝试其他操作. 我赞成选项1,虽然它可能会适得其反.这有点像美式足球.当然,开车下山很不错.但有时候主导策略是踢球,让球回来并尝试在另一个驱动器上得分. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp-classic – 无法在IIS 7.5上运行来自经典ASP脚本的exe
- asp.net – 在jQuery中捕获异常
- asp.net-mvc – 在Asp.Net MVC中使用混合身份验证(Forms,FB
- asp.net web表单json返回结果
- asp.net – MSCharts“没有找到HTTP请求类型”GET“错误的处
- asp.net – 页面控制
- [ASP.NET] 移除Wizard按钮
- 向asp.net添加样式表(使用Visual Studio 2010)
- asp.net-mvc – 在回发ASP.NET MVC上获取Checkbox值
- asp.net-mvc – 在MVC API中接受字节数组参数作为Base64
- asp.net – SQL网络接口,错误:26 – 定位服务器
- asp.net – 是否可以为MaskedEditExtender设置掩
- asp.net-mvc – 适用于asp.net MVC和razor视图的
- asp.net-core – 在VS 2015 RC中,编译保存不适用
- 如何重用这个基于ASP.NET和C#中的Ultimate RestS
- ASP.NET两个截取字符串的方法分享
- asp.net – Grid.SelectedRow.Cells.Item(1).Tex
- 如何获得ASP .NET中客户端的临时端口号?
- asp.net – 使用jQuery以编程方式触发JavaScript
- jquery form表单提交插件asp.net后台中文解码