gpt4 book ai didi

c# - 从静态列表查询对象导致服务器上的 cpu 使用率激增

转载 作者:太空狗 更新时间:2023-10-30 01:24:39 24 4
gpt4 key购买 nike

我们有一个类似于 SO 上的相关问题的功能,我们在查看给定记录时显示相关记录。每次加载页面时,都会通过调用数据库来检索相关记录。为了减少数据库的负载,我创建了这些记录的静态列表,我将其加载到 Application_Start 上,现在使用 Linq 查询来查询该列表。

在大多数情况下,这似乎工作正常。数据库的负载减少了,Sql 探查器显示没有更多相关记录查询。我昨晚推送了这个更改,今天早上我发现 IIS 工作进程的 CPU 使用率为 100%,网站没有响应。我切换回旧代码(我查询数据库的地方),网络服务器上一切正常,但数据库负载增加了。所以我再次切换到新代码,一直在查看 Web 服务器上的 cpu 负载。这是我注意到的。

当使用查询数据库的旧代码时,IIS 工作进程的 cpu 使用率可以忽略不计,几乎没有任何变化(在任务管理器的性能选项卡中看到的直线)但是,当使用创建的新代码时并查询静态列表,我看到 IIS 工作进程的 cpu 使用率出现峰值。大多数情况下,它在 1% 到 5% 之间,但时不时地会超过这个值,自从我开始观察以来,我看到的最大值是 40%。我想知道为什么会发生这种情况,以及在重负载下是否会导致工作进程崩溃?

下面是一些查询静态列表的代码

    if (validSearchLatLong && (usePincodeLatLong || distanceFilterLimit != distanceLimit))
{
filteredRecords = StaticRecords.Where(job => LatLongDistance(centerLatitude, centerLongitude, job.lat, job.lon) <= distanceFilterLimit || (!string.IsNullOrEmpty(this.PreferredJobCity) ? job.city == this.PreferredJobCity : false)).ToList();
}
else
{
filteredRecords = StaticRecords.Where(job => (this.PreferredJobCity != "" ? job.city == this.PreferredJobCity : (this.City != "" ? job.city == this.city : (state != "" ? job.state.Trim() == state.Trim() : false)))).ToList();
}

if (RecordsearchFilter.JobCategories.Count > 0 && RecordsearchFilter.EnableFilter)
{
filteredRecords = filteredRecords.Where(job => this.RecordsearchFilter.JobCategories.Contains(job.JobCategoryClass)).ToList();
}
else
{
filteredRecords = filteredRecords.Where(job => MatchJobCategories(job.JobCategory, (short)this.jobCategory.SqlId) > 0).ToList();
}

List 支持多个并发读取器,因此 StaticRecords 不应成为阻塞因素。之后我创建了 filteredRecords,它是一个新的过滤列表,应该独立于其他线程。

CPU 峰值的可能原因是什么?它是否会导致 IIS 工作进程提前崩溃?

============编辑==============

我现在知道崩溃不是由这段代码引起的,而是另一个错误。静态 List 方法一直很稳定,似乎可以很好地实现其目的。

但我的问题仍然存在,为什么 CPU 会出现峰值?

当我说

List supports multiple concurrent readers, so StaticRecords should not be the blocking factor. And after that I am creating filteredRecords which is a new filtered List which should be independent of other threads.

我错了吗?

最佳答案

SQL Server 通常在查询时非常高效,尤其是当您正确优化索引时。

您的新 StaticRecords 方法需要在内存中扫描所有项目,为每个项目执行 Where 谓词。这可能是导致 CPU 使用率增加的原因,尤其是当 StaticRecords 中有很多项目时。尝试附加分析器并亲自查看。总的来说,我希望这种过滤在 SQL Server 上运行时比内存中过滤性能好几个数量级。

关于c# - 从静态列表查询对象导致服务器上的 cpu 使用率激增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com