2012-01-11 12 views
5

Próbuję stworzyć program w C/C++, aby zachowywał się jak najwyższa komenda w Linuksie. Zrobiłem kilka badań i już wiedziałem, jak liczyć Procesor Wykorzystanie procesu. Możemy uzyskać użycie procesora przez obliczenie czasu i czasu z/proc/[PID]/stat w bieżącym czasie i po kilku sekundach. Następnie obliczyć różnice między utime a utime i podzielić wynik z różnicami w czasie działania, a następnie uzyskamy procent wykorzystania procesora. Będzie to bardzo łatwe w przypadku procesu pojedynczego procesu/wielowątkowego.Jak liczyć użycie procesora wieloprocesowego w Linuksie

Problem występuje w takim przypadku, jak httpd, gdzie działa jako proces wieloprocesowy. Gdy serwer jest zajęty, httpd rozwinie procesy podrzędne, aby obsłużyć kilka żądań. Następnie liczę całkowitą liczbę procesów, powiedzmy 500. Chcę obliczyć użycie procesora tych procesów, ale podsumuję je, tak że widzę tylko 1 użycie procesora httpd. Ale jeśli zrobię algorytm, o którym wspomniałem powyżej, kiedy liczba procesów zmniejszy się do < 500 po kilku sekundach, otrzymam wartości ujemne, ponieważ obliczenia będą takie (na przykład wybiorę liczbę losową, aby daje krótki opis):

Uptime: 155123, No of processes : 500, Stime + Utime total of 500 processes : 3887481923874 
Uptime: 155545, No of processes : 390, Stime + Utime total of 390 processes : 2887123343874 

Jeśli spojrzeć na powyższy przykład, delta stime + utime będą wyniki w wartości ujemnej, ponieważ liczba procesu maleje, i dać niższą wartość po kilku milisekundach. Po prostu chcę wiedzieć, czy istnieje jakikolwiek inny sposób obliczania takiego procesu zachowującego się w ten sposób? Dziękuję Ci.

+0

Skąd znasz zestaw procesów? Przez swoją grupę procesową? Jak nazywa się program? –

+0

Po pierwsze, otrzymuję główny proces nadrzędny. Wiem o tym, ponieważ ma on ppid 1 i powiedzmy jego pid 1227. Następnie przeszukaj cały katalog/proc /, który ma ppid 1227. Jeśli/proc/pid1/stat ma ppid 1227, to dodaję jego utime i stime do 1227 utime i stime. –

Odpowiedz

1

Proponuję przechowywanie danych dla każdego procesu osobno.
Gdy masz nową próbkę, każdy proces może należeć do jednej z trzech kategorii:
1. Istniejące zarówno przed jak i po - odejmij stary od nowego.
2. Istnieje już, ale nie wcześniej - po prostu weź nowe wartości.
3. Poprzednio, ale nie teraz - zignoruj ​​to. Tęskniłeś za czymś tutaj, ponieważ mógł on używać procesora podczas 90% okresu próbkowania, ale mam nadzieję, że nie potrzebujesz doskonałej dokładności.

Powoduje, że zachowujesz więcej danych między próbkami i wymaga użycia bardziej skomplikowanej struktury danych, ale powinna dać rozsądne wyniki.

+0

Tak, myślę, że to rozwiąże problem, ale kosztuje trochę skomplikowanej pracy. Postaram się utrzymać TOP 200 PID, które istnieją wystarczająco długo, i odejmuję je, aż otrzymam 0 i zastąpię je nowym. Odejmowanie zostanie dodane do kontenera, który zostanie wymieszany z nowym elementem. Myślę, że powinienem spróbować tego. Dziękuję Ci. –

0

Jeśli potrzebujesz dokładnych wyników lub jeśli czas życia procesów jest krótki, musisz odczytać wykorzystanie czasu procesu po jego zakończeniu.

Jest conajmniej dwa sposoby:

1) Użyj wait4(2) lub wait3(2) funkcje czekać zakończenie procesu. Funkcje te zwrócą utime i stime procesu.

2) Przechowuj zakończone procesy w stanie zombie do czasu przeczytania /prox/<pid>/stat.

Powiązane problemy