W systemie z wieloma użytkownikami chcę mierzyć zużycie procesora przez każdego użytkownika w sekundach czasu procesora. Na potrzeby tego pomiaru zakładam, że jeśli PID należy do użytkownika, ten użytkownik powoduje czas procesora - to znaczy ignoruję demony i jądro.
Obecnie robię to co pięć sekund:
- Uzyskaj każdego użytkownika i identyfikatory PID, przez które działają
ps aux
- Dla każdego PID, pobierz
x
sumę czasu, czasu, czasu i cstime z/proc/[pid]/stat
- obliczyć
t = x / interval
(interwał nie zawsze dokładnie 5 sekund, gdy występuje duże obciążenie)
Jeśli to uruchomię, otrzymam rozsądnie wyglądające wartości. Na przykład: użytkownik w tym systemie wirował w python ( while True: pass
), a system pokazywał około 750 milisekund czasu procesora na sekundę. Gdy system zawiesił się nieco, zgłosił 1600 ms dla jednej 1-sekundowej inwersji. Co wydaje się słuszne, ale nie rozumiem, że te wartości mogą być zwodnicze, szczególnie biorąc pod uwagę, że tak naprawdę ich nie rozumiem.
Więc moje pytanie brzmi:
Jaki jest uczciwy i prawidłowy sposób mierzenia obciążenia procesora dla poszczególnych użytkowników?
Metoda musi być dość dokładna. W tym systemie może być wiele setek użytkowników, więc wyodrębnianie wartości procentowych ps aux
nie będzie wystarczająco dokładne, szczególnie w przypadku krótkotrwałych wątków, które wiele programów lubi odradzać.
Chociaż może to być skomplikowane, absolutnie wiem, że jest to możliwe. To był mój punkt wyjścia:
Jądro śledzi czas tworzenia procesów, a także czas procesora, który zużywa w trakcie swojego życia. Za każdym tyknięciem zegara, jądro aktualizuje czas jiffies, który bieżący proces spędził w systemie i trybie użytkownika. - (z projektu dokumentacji systemu Linux )
Wartość, której szukam, to ilość sekund (lub jiffies), które użytkownik spędził na procesorze, a nie procent obciążenia systemu lub użycia procesora.
Ważne jest, abyśmy mierzyli czas procesora, gdy procesy są nadal uruchomione. Niektóre procesy będą trwać tylko przez pół sekundy, niektóre będą trwać przez wiele miesięcy - i musimy złapać oba rodzaje, abyśmy mogli rozliczać czas procesora użytkowników z drobną ziarnistością.
top
możesz zrobić tryb wsadowy? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
powinien pokazać obciążenie dla {użytkownika} w tym momencie.