【问题标题】:What can I do to programmatically prevent or limit Resource contentions?如何以编程方式防止或限制资源争用?
【发布时间】:2016-07-01 14:01:43
【问题描述】:

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

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

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

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

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

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

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

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

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

更新

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

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

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

更新 2

我现在看到(在运行最终性能检查(仪器)之后)垂直的红线只是一个旅鼠——无论你拖动它,它都会跟随光标。我猜这是有目的的……

【问题讨论】:

  • 没有。你的大脑就像谷歌搜索引擎一样工作,它匹配单词但不擅长匹配逻辑概念。用你知道的话,查询“tempdb is full”。

标签: c# visual-studio-2013 resources performance-testing contention


【解决方案1】:

这就是最终奏效的方法:双管齐下:

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 互操作活动也有问题,但我现在可以通过此操作生成 1,341KB 的 Excel 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多