Aracılığıyla paylaş


Windows'ta Environment.ProcessorCount davranışı

Windows'da Environment.ProcessorCount özelliği artık işlem benzitesine ve iş nesnesinin CPU kullanımı üzerindeki sabit sınırına saygı gösterir.

Açıklamayı değiştir

Önceki .NET sürümlerinde, Environment.ProcessorCount Windows'taki özelliği makinedeki mantıksal işlemci sayısını döndürür. Bu özellik, işlem bağlılığını ve iş nesnesinin CPU kullanımı üzerindeki katı sınırını yoksayar. Bu Windows davranışı, bu sınırların dikkate alındığı Unix tabanlı işletim sistemlerindeki davranışla tutarsızdır.

.NET 6'dan başlayarak, Windows'un davranışı Environment.ProcessorCount Unix tabanlı işletim sistemindeki davranışla tutarlıdır. Genel olarak, Environment.ProcessorCount aşağıdakilerin en küçük değerini döndürür:

  • Makinedeki mantıksal işlemci sayısı.
  • İşlem CPU yakınlığı ile çalışıyorsa, işlemin atandığı işlemci sayısı.
  • İşlem bir CPU kullanım sınırıyla çalışıyorsa, CPU kullanım sınırı bir sonraki tamsayıya yuvarlandı.

Aşağıdaki tabloda, sekiz mantıksal işlemciye Environment.ProcessorCount sahip bir makinede .NET 5'ten .NET 6'ya yapılan değişikliklerin değeri gösterilmektedir:

Çevre .NET 5 .NET 6
İki mantıksal işlemciye ayarlanmış (Windows) süreç 8 2
İki mantıksal işlemciye (Unix) bağlanmış işlem 2 2
İki mantıksal işlemcinin eşdeğeri ile sınırlı CPU kullanımı (Windows) 8 2
İki mantıksal işlemcinin eşdeğeri ile sınırlı CPU kullanımı (Unix) 2 2

Sürüm kullanıma sunulmuştur

6,0

Değişiklik nedeni

Bu özellik genellikle bir işlemin paralellik faktörünü belirlemek için kullanılır. Özelliğin değerinin benzenleme ve CPU kullanım sınırına göre sınırlandırılmaması daha kötü performansa yol açabileceğini gözlemledik.

Uygulama veya sistem yapılandırmasına göre paralellik faktörünün ölçeğini küçültmek için kullanan Environment.ProcessorCount kodu gözden geçirin. Kod, işlemin benzenşim maskesini veya iş nesnesinin CPU kullanım sınırını hesaba katsa bile, amaçlanandan daha düşük paralellik kullanıyor olabilir.

Makinedeki toplam mantıksal işlemci sayısını (örneğin, bir kullanıcıya görüntülemek için) döndürmeyi bekleyen Environment.ProcessorCount kodu gözden geçirin. Bunun yerine, GetSystemInfo veya GetNativeSystemInfo Win32 API'lerine bir PInvoke çağrısı kullanabilirsiniz.

Bu değişiklik sonucunda kodun performansı düşerse, .NET çalışma zamanı tarafından kullanılabilir olduğu düşünülen işlemci sayısını ve DOTNET_PROCESSOR_COUNT özelliği tarafından bildirilen işlemci sayısını geçersiz kılmak için Environment.ProcessorCount ortam değişkenini kullanabilirsiniz. Örneğin, DOTNET_PROCESSOR_COUNT 4 olarak ayarlarsanız, işlem bağlılığı ve CPU kullanım sınırı göz ardı edilerek Environment.ProcessorCount 4 değeri döndürülecektir. .NET 5 davranışını taklit etmek için ortam değişkenini olarak %NUMBER_OF_PROCESSORS%ayarlayın.

Etkilenen API'ler