我們有一個功能類似於SO上的相關問題,我們在查看給定記錄時顯示相關記錄。每次加載頁面時都會通過調用db來檢索相關記錄。爲了減少數據庫的負載,我創建了一個靜態列表,這些記錄是我在Application_Start上加載的,現在使用Linq查詢來查詢這個列表。從靜態列表中查詢導致服務器上cpu使用率高峯的對象
大多數情況下,這似乎工作正常。 db上的負載減少了,Sql profiler顯示沒有更多的相關記錄查詢。昨天晚上我推動了這個改變,今天早上我發現IIS工作進程與100%的CPU和網站沒有響應。我切換回舊的代碼(我查詢數據庫),並在網絡服務器上的事情都很好,但數據庫負載增加。所以我再次切換到新的代碼,並一直在尋找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();
}
列表支持多個併發的讀者,所以StaticRecords不應該是阻塞的因素。之後,我創建了filteredRecords,它是一個新的過濾列表,應該獨立於其他線程。
CPU高峯可能的原因是什麼?它可能導致IIS工作進程早期崩潰?
============編輯==============
我現在知道,飛機墜毀沒有造成由於這個代碼,但另一個錯誤。靜態List方法一直很穩定,似乎很好地實現了它的目的。
但我的問題仍然存在,爲什麼在CPU的尖峯?
當我說
列表支持多個併發的讀者,所以StaticRecords不應 是阻塞的因素。之後,我將創建filteredRecords 這是一個新的過濾列表,它應該獨立於其他 線程。
我錯了嗎?
你打開跟蹤查看方法調用的時間嗎? – Lloyd 2012-01-08 10:22:40
靜態記錄有多大?您在尖峯期間看到頁面錯誤嗎? StaticRecords使用列表? –
rene
2012-01-08 10:25:59
@rene是的StaticRecords使用列表。它有大約35000條記錄。如果你的意思是在asp.net頁面出現錯誤,那麼通過pagefaults,那麼不,我還沒有看到。 –
shashi
2012-01-08 10:37:59