Jaki jest najlepszy sposób monitorowania całkowitego czasu procesora - na użytkownika?

25

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:

  1. Uzyskaj każdego użytkownika i identyfikatory PID, przez które działają ps aux
  2. Dla każdego PID, pobierz xsumę czasu, czasu, czasu i cstime z/proc/[pid]/stat
  3. 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 auxnie 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ą.

Stefano Palazzo
źródło
1
500 reputacji: o dobra szansa dla początkujących
Tachyons
Trochę poza moją ligą, ale bardzo interesujące pytanie, więc trochę wykopałem i znalazłem coś, co, mam nadzieję, jest co najmniej przydatne, aby pomóc Ci rozwiązać ten problem: stackoverflow.com/a/1424556/905573
kingmilo
1
wiesz, że topmoż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.
Rinzwind

Odpowiedzi:

11

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 acctpakiecie Zainstaluj acct

Aby uzyskać raport dla poszczególnych użytkowników, uruchom

sa -m
Alan Bell
źródło
Niestety nie będzie to dla mnie działać, ponieważ „sa” nie będzie liczyć długotrwałych procesów. To, czego potrzebuję (myślę), to sposób na wykrycie procesów uruchamianych i kończonych oraz rejestrowanie czasu ich procesora, gdy wychodzą, a także podczas działania.
Stefano Palazzo
@StefanoPalazzo Uważam, że to najlepsze, co dostaniesz. Rozszerz go o czasy uruchamiania procesów /proc/[pid]/stat.
ændrük
Jak się okazuje, wydaje się, że większość wszystkich procesów zostanie poprawnie rozliczona przez 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!
Stefano Palazzo
3

Spowoduje to wyświetlenie wiersza dla każdego użytkownika zawierającego nazwę użytkownika i całkowity czas pracy procesora:

ps -w -e --no-header -o uid,user \
        | sort -u \
        | while read uid user; do
                echo -e "$user\t"$(
                        ps --no-headers -u $uid --cumulative -o time \
                                | sed -e s/:/*3600+/ -e s/:/*60+/ \
                                | paste -sd+ \
                                | bc
                );
        done
Marques Johansson
źródło
2

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

LinzTM
źródło
0

Będzie to również obsługiwać procesy, które działały przez kilka dni.

ps -w -e --no-header -o uid,user \
    | sort -u \
    | while read uid user; do
            echo -e "$user\t"$(
                    ps --no-headers -u $uid --cumulative -o time \
                          | sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/ 
                          | paste -sd+ \
                          | bc
            );
    done
Patrik Arlos
źródło