繁体   English   中英

如何以编程方式防止或限制资源争用?

[英]What can I do to programmatically prevent or limit Resource contentions?

我创建了一个应用程序,如果有足够的数据,它无法完成,并显示“由于 'ACTIVE_TRANSACTION',数据库 'tempdb' 的事务日志已满。” 和“找不到表 0”。

报告使用的存储过程没有明确引用“tempdb”,因此它必须是 SQL Server 自行管理的内容。

无论如何,我通过分析 > 性能和诊断在 Visual Studio 2013 中运行了“资源争用”分析。

完成后,它在“并发分析报告”中告诉我总共有 30,790 个争用,其中“Handle2”和“Multiple Handles 1”占“争用最多的资源”和“_CorExeMain”、线程 ID 的 99% 以上4936 作为“争议最大的线程”

这一切都足够有趣了,我想,但是现在我知道了这一点,我能做些什么呢?

30,790 是否超出了总争用数量? 听起来像,但我不知道。 但同样,假设是这样,这些信息似乎并没有真正告诉我任何有价值的东西,即:我可以做些什么来改善这种情况? 如何以编程方式防止或限制资源和/或线程争用?

生成的报告中没有错误,六条消息属于“仅供参考”的类型。 有一个警告:

警告 1 DA0022:# Gen 1 Collections / # Gen 2 Collections = 2.52; Gen 2 垃圾收集的发生率相对较高。 如果按照设计,程序的大部分数据结构都已分配并保留很长时间,这通常不是问题。 但是,如果此行为是无意的,则您的应用可能会固定对象。 如果您不确定,您可以收集 .NET 内存分配数据和对象生命周期信息,以了解您的应用程序使用的内存分配模式。

...但数据结构的“长时间”持久化确实是设计使然。

更新

然后我运行了“.NET Memory Allocation”报告,在这里我也不知道该怎么做:

在此处输入图片说明

1.24 亿字节是否过多? 分配最多内存的函数或哪些类型分配的内存最多,有什么不妥吗?

我也不明白为什么报告生成后红色垂直线会移动; 它首先在“616”左右,然后移动到 0(如上面的屏幕截图所示),现在大约是 120。

更新 2

我现在看到(在运行最终性能检查(仪器)之后)垂直的红线只是一个旅鼠 - 无论您将光标拖到哪里,它都会跟随光标。 这有一些目的,我想......

这就是最终有效的方法:两管齐下的攻击:

0) 数据库大师重构了存储过程以提高效率。

1) 我将数据读取代码分成两部分重新编写。 我确定了要检索的前半部分数据,并得到了它,然后在短暂的停顿后再次通过,检索其余的数据。 简而言之,过去是这样的:

. . .
ReadData(_unit, _monthBegin, _monthEnd, _beginYearStr, _endYearStr);
. . .

……现在是这样:

. . .
if // big honkin' amount of data
{
    string monthBegin1 = _monthBegin;
    string monthEnd1 = GetEndMonthOfFirstHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string monthBegin2 = GetBeginMonthOfSecondHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string monthEnd2 = _monthEnd;

    string yearBegin1 = _beginYearStr;
    string yearEnd1 = GetEndYearOfFirstHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string yearBegin2 = GetBeginYearOfSecondHalf(_monthBegin, _monthEnd, _beginYearStr, _endYearStr);
    string yearEnd2 = _endYearStr;

    ReadData(_unit, monthBegin1, monthEnd1, yearBegin1, yearEnd1);
    Thread.Sleep(10000);
    ReadData(_unit, monthBegin2, monthEnd2, yearBegin2, yearEnd2);
}
else // a "normal" Unit (not an overly large amount of data to be processed)
{
    ReadData(_unit, _monthBegin, _monthEnd, _beginYearStr, _endYearStr);
}
. . .

它现在成功运行完成,没有任何异常。 我不知道问题是否完全与数据库有关,或者所有 Excel Interop 活动是否也有问题,但我现在可以通过此操作生成 1,341KB 的 Excel 文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM