我們的 ASP NET 軟體有這個特定Parallel.ForEach的應用條件。它運行良好,但我們最近注意到它停止使用所有可用內核來處理這些應用并行性的特定繁重操作。
這是我們使用的代碼:
Parallel.ForEach(var1, new ParallelOptions
{ MaxDegreeOfParallelism = Environment.ProcessorCount - 1 }, var2 => ...
我們過去在任務管理器中看到的是,在運行這些特定的繁重操作時,我們的 32 倍核心服務器的使用率很高(例如 90%)。但現在它只使用一個核心(僅約 5%)。過去需要 20-40 分鐘,現在需要 5-6 小時!
在我們的計算機上(使用 Visual Studio 在本地運行)時,我們確實看到所有內核都按預期作業(約 80-90% 的使用率)。
詳細資訊:服務器有 2 個 CPU、x64、Windows Server 2012 裸機(無 VM)。沒有硬體問題。軟體在 ASP NET 4.6.2 上運行。MaxDegreeOfParallelism正確回傳 32。IIS 管理器/高級設定:CPU 限制 = 900。Maximum Worker Process 似乎沒有區別。資料庫似乎不是問題,因為所有資料以前都存盤在記憶體中(在代碼中列出變數)。
由于代碼過去在同一臺服務器上運行良好,并且目前在我們的本地主機上運行良好,我們懷疑服務器端發生了一些變化。
我們懷疑微軟的更新可能是造成這種情況的原因,盡管到目前為止我們還沒有發現任何東西。這些是我們懷疑的 2022 年最新更新:
適用于 x64 的 Windows Server 2012 的 .NET Framework 3.5、4.6.2、4.7、4.7.1、4.7.2、4.8 的 2022 年 5 月安全和質量匯總 (KB5013871)。安裝日期:?25/?05/?2022 09:43
適用于 x64 的 Windows Server 2012 (KB5012330) 的 .NET Framework 3.5、4.5.2、4.6、4.6.1、4.6.2、4.7、4.7.1、4.7.2、4.8 的安全和質量匯總(2022 年 4 月)。安裝日期:?20/?04/?2022 15:53
適用于 x64 的 Windows Server 2012 (KB5010582) 的 .NET Framework 3.5、4.5.2、4.6、4.6.1、4.6.2、4.7、4.7.1、4.7.2、4.8 的安全和質量匯總(2022 年 2 月)。安裝日期:?11/?02/?2022 20:27
適用于 x64 的 Windows Server 2012 (KB5009720) 的 .NET Framework 3.5、4.5.2、4.6、4.6.1、4.6.2、4.7、4.7.1、4.7.2、4.8 的安全和質量匯總(2022 年 1 月)。安裝日期:?12/?01/?2022 21:48
有人知道這個問題嗎?有關如何解決此問題的任何想法?
uj5u.com熱心網友回復:
有關如何解決此問題的任何想法?
你可以嘗試在你的服務器上運行這個實驗,作為一個獨立的控制臺應用程式:
ParallelOptions options = new()
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
int concurrency = 0;
Parallel.ForEach(Enumerable.Range(1, 100), options, item =>
{
var current = Interlocked.Increment(ref concurrency);
try
{
Console.WriteLine($"Processing {item}, Concurrency: {current}");
for (int i = 0; i < 1_000_000_000; i ) { }
}
finally { Interlocked.Decrement(ref concurrency); }
});
預期的行為是看到 CPU 達到最大值 (100%),并且報告的并發達到值 32。
uj5u.com熱心網友回復:
按照設計,Parallel.ForEach 可能使用比請求更少的執行緒來獲得更好的性能。根據檔案:
默認情況下,Parallel.ForEach和Parallel.For方法可以使用可變數量的任務。這就是為什么,例如,ParallelOptions類具有MaxDegreeOfParallelism屬性而不是“MinDegreeOfParallelism”屬性。這個想法是系統可以使用比請求更少的執行緒來處理回圈。
.NET 執行緒池通過允許并行任務的作業執行緒數量隨時間變化而動態適應不斷變化的作業負載。在運行時,系統會觀察增加執行緒數量是提高還是降低整體吞吐量,并相應地調整作業執行緒的數量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487060.html
