/ / PerformanceCounter.NextValue () vracia konštantnú hodnotu pre zaťaženie procesora - c #, využitie procesora, výkonnosť

PerformanceCounter.NextValue () vráti konštantnú hodnotu pre zaťaženie procesora - c #, cpu-use, performancecounter

Snažím sa zvýšiť výkon vlastného systémumonitor, aby sa oneskorilo vykonávanie častí kódu servera v prípade preťaženia (spustenie niektorých webových služieb v rámci služby IIS). Prvá vec, ktorú sa snažím vyriešiť, je preťaženie procesora.

Viem o tom PerformanceCounter problémy s jeho inicializáciou pri prvej výzve NextValue() (pozri táto otázka, okrem iného), preto som implementoval veľmi jednoduchú statickú triedu, ktorá ukladá údaje do vyrovnávacej pamäte na sekundu a vlastne k nej iba pristupuje PerformanceCounter objekt za sekundu alebo menej. Viem, že v súčasnosti to nie je bezpečné, ale v súčasnej fáze prototypovania ma to nezaujíma.

Takže, po tom všetkom, tu je môj aktuálny kód:

public static class SystemPerformance
{
private static PerformanceCounter TotalProcessorTimeCounter =
new PerformanceCounter("Process", "% Processor Time", "_Total");
private static DateTime CacheRefreshed;
private static float CachedValue = 0f;
private const float MIN_DELTA_SECONDS = 1f;

public static float ReadCPU()
{
if ((DateTime.Now - CacheRefreshed).TotalSeconds > MIN_DELTA_SECONDS)
// Stale cache
return ReadFromCounter();

// Good cache
return CachedValue;
}

private static float ReadFromCounter()
{
CachedValue = TotalProcessorTimeCounter.NextValue();
CacheRefreshed = DateTime.Now;
return CachedValue;
}
}

... čo je všetko pekné a šikovné, dokiaľ to nevykonám. Skúšal som to spustiť na Windows 10 x64 VM so 4 jadrami a na Windows 7 x64 železa so 4 jadrami - a v oboch prípadoch sa vrátená hodnota pohybuje okolo 400 bez ohľadu na to, čo robím.

Typické hodnoty, ktoré dostávam, sú v rozsahu395–401, s občasným poklesom na 365 alebo skokom na 405. Hodnoty, ktoré som čítal, nijako nesúvisia so skutočným zaťažením CPU na žiadnom zo skúšaných počítačov, ako je znázornené Správcom úloh, Monitorom výkonu alebo skutočne bežným rozum.

Metodika testovania je jednoduchá: SystemPerformance.ReadCPU() je spustený stlačením tlačidla v jednoduchej forme Windows a výstup je zobrazený v textovom poli v rovnakej podobe. Toto tlačidlo stláčam, keď je procesor takmer nečinný, a zároveň ho stlačím iné procesy robia veci a načítavajú CPU.

Čo robím zle? Má to vrátiť iba využitie CPU vláknami mojej aplikácie? Nesprávnym spôsobom interpretujem údaje?

odpovede:

2 pre odpoveď č. 1
   new PerformanceCounter("Process", "% Processor Time", "_Total");

Áno, čas procesora, ktorý zaberá celkový počet procesov, vrátane falošného „System Idle Process“, ktorý sa zobrazuje v Správcovi úloh, sa vždy zvýši na 400 jadrových počítačoch až o 400%.

Toto číslo sa vám bude pravdepodobne páčiť lepšiezmeniť „Proces“ na „Procesor“. Ak chcete, aby zodpovedala hodnote, ktorá sa zobrazí Správcovi úloh, musíte zmeniť „Proces“ na „Informácie o procesore“. Nová kategória, ktorá sa snaží generovať realistickejšie číslo, ktoré je kompenzované procesorom s turbo boostom, strojmi s NUMA uzlami a nižšou úrovňou výkonnosti, ktorú získate z hyper-vlákien. Budete si chcieť prečítať tento blogový príspevok za drzosť.