Sunday, June 24, 2007

Monitorizare CPU dual core în Windows

De nevoie mi-am luat Core 2 Duo. Merge super.

Dar nu am pe Windows o unealtă de monitorizare ca lumea aşa cum este Gkrellm pe Linux. Pot să mă uit la Task Manager minimizat, dar nu văd utilizarea împărţită pe procesoare.

De ce mă interesează? Pe dual core sporul de performanţă este datorat utilizării ambelor core-uri (evident). Ca să le utilizeze, un program trebuie să fie multi-threaded. Vreau şi eu să-mi dau seama care sunt într-adevăr multi-threaded şi care nu. Pentru asta îmi trebuie o metodă de a vizualiza încărcarea fiecărui core.

Aşa că m-am apucat să caut un utilitar şi gratis şi bun de Windows care să-mi rezolve problema. N-am găsit.

Deci... hai să scriu eu. După ceva săpături, am dat de următoarele API-uri de monitorizare.

Pentru C/C++ folosind Win32 SDK:
  • NtQuerySystemInformation este o funcţie nedocumentată, care se poate folosi pentru multe lucruri, inclusiv pentru a obţine (per core/procesor) informaţii despre timpul folosit pentru diverse sarcini. Prelucrând această informaţie se poate determina încărcarea procesorului. Problema aceste funcţii este că este nedocumentată, ar putea să dispară în Vista, iar alternativa sugerată la monitorizarea timpilor (GetSystemTimes) nu ia în considerare fiecare procesor (prezintă un singur rezultat mediat pentru toate procesoarele).
  • PDH, adică Performance Data Helper, este un API cu care se pot monitoriza multe lucruri pe windows. Cică e mai portabil, am reuşit şi să-l utilizez destul de uşor (în esenţă se deschide o interogare, se adaugă contoare la interogare - de exemplu, utilizarea procesorului X, se execută interogarea, se citesc valorile, se închide interogarea; dacă se doreşte monitorizare se repetă paşii de execuţie şi citire pe perioada cerută). Singura problemă este specificarea contoarelor - adică nu e chiar banal-banal. Nu găsesc link ca lumea în MSDN, căutaţi după PDH şi Performance Data Helper.
  • O pagină interesantă în care mai sunt şi alte variante.
Pentru C# se poate folosi System.Diagnostics (exemplu complicat MSDN şi mai simplu, în VB.NET), dar parcă nu-mi vine să dau drumul la ditamai aplicaţie .NET ca monitor de procesor şi eventual memorie. Un instrument de măsură nu ar trebui să influenţeze valoarea măsurată, nu?

Acu să găsesc şi timp să scriu mica aplicaţie... :(

No comments: