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.Odpowiedzi:
Wygląda na to, że potrzebujesz rozliczania procesów.
http://www.faqs.org/docs/Linux-mini/Process-Accounting.html
W systemie Ubuntu narzędzia do rozliczania procesów znajdują się w
acct
pakiecieAby uzyskać raport dla poszczególnych użytkowników, uruchom
źródło
/proc/[pid]/stat
.sa
(.ps.gz) . Mam też dobry sposób na „oszacowanie” tych długotrwałych procesów, zanim ostatecznie uzyskam ich odpowiednią wartość. W końcu z niego skorzystamy i cieszę się, że mogę uhonorować nagrodę za odpowiedź. Wielkie dzięki!Spowoduje to wyświetlenie wiersza dla każdego użytkownika zawierającego nazwę użytkownika i całkowity czas pracy procesora:
źródło
Jedną z bardziej oczywistych odpowiedzi jest po prostu rozszerzenie tego, co obecnie robisz.
Natknąłem się na ten proces monitorowania za pomocą skryptów bash i mysql do śledzenia czasu procesora przez użytkowników, ale był on rozłożony na znacznie dłuższy przedział czasowy niż mówiłeś.
Mamy nadzieję, że dzięki temu dowiesz się więcej o kierunku, w którym chcesz się udać.
http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm
źródło
Będzie to również obsługiwać procesy, które działały przez kilka dni.
źródło