2010-07-27 11 views

Odpowiedz

32

można użyć ps.
np. mając proces python z dwóch ruchliwych wątków na dwurdzeniowe CPU:

$ ps -p 29492 -L -o pid,tid,psr,pcpu 
    PID TID PSR %CPU 
29492 29492 1 0.0 
29492 29493 1 48.7 
29492 29494 1 51.9 

(PSR jest id CPU wątek jest aktualnie przypisany)

widać, że wątki są uruchomione na tym samym rdzeniu CPU (z powodu GIL)

uruchomiony ten sam skrypt Pythona w Jython, widzimy, że skrypt wykorzystuje oba rdzenie (i istnieje wiele wątków innej usługi lub cokolwiek, które są niemal bezczynny):

$ ps -p 28671 -L -o pid,tid,psr,pcpu 
    PID TID PSR %CPU 
28671 28671 1 0.0 
28671 28672 0 4.4 
28671 28673 0 0.6 
28671 28674 0 0.5 
28671 28675 0 2.3 
28671 28676 0 0.0 
28671 28677 1 0.0 
28671 28678 1 0.0 
28671 28679 0 4.6 
28671 28680 0 4.4 
28671 28681 1 0.0 
28671 28682 1 0.0 
28671 28721 1 0.0 
28671 28729 0 88.6 
28671 28730 1 88.5 

można przetwarzać dane wyjściowe i obliczać całkowity procesor dla każdego rdzenia procesora.

Niestety, podejście to nie wydaje się być w 100% niezawodne, czasami widzę, że w pierwszym przypadku dwa wątki robocze są rozdzielone na każdy rdzeń procesora, lub w tym ostatnim przypadku dwa wątki są ocenia się na tym samym rdzeniu ..

91

można to zrobić jeszcze w górę

Type 1 - pokazuje każdego procesora

ograniczyć procesy pokazane poprzez ten specyficzny proces prowadzony w ramach określonego konta użytkownika i użyj typu "u", aby ograniczyć do tego użytkownika

+5

tak .. jak mogę tego przeczytać? – Zhianc

+1

Możesz również nacisnąć 'I', aby przełączać * tryb Irix * (w przeciwieństwie do * trybu Solaris *). Kiedy 'on', procent wyświetlany na liście procesów jest zależny od ** wątku procesora **. Kiedy 'off', wspomniana wartość procentowa jest wyświetlana w stosunku do ** ogólnej pojemności procesora ** (tj. * WSZYSTKIE wątki * - również wszystkie rdzenie). –

+3

'htop' również działa – phyatt

62

Można użyć:

mpstat -P ALL 1 

To pokazuje, jak bardzo każdy rdzeń jest zajęty i aktualizuje automatycznie przy każdej sekundzie. Wyjście byłoby coś takiego (na czterordzeniowym procesorem):

10:54:41 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 
10:54:42 PM all 8.20 0.12 0.75 0.00 0.00 0.00 0.00 0.00 90.93 
10:54:42 PM 0 24.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 74.00 
10:54:42 PM 1 22.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 76.00 
10:54:42 PM 2 2.02 1.01 0.00 0.00 0.00 0.00 0.00 0.00 96.97 
10:54:42 PM 3 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00 
10:54:42 PM 4 14.15 0.00 1.89 0.00 0.00 0.00 0.00 0.00 83.96 
10:54:42 PM 5 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 
10:54:42 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 
10:54:42 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 

Polecenie to nie jest odpowiedź na pierwotne pytanie choć to znaczy nie wykazuje zużycia rdzenia procesora dla konkretnego procesu.

+1

Myślę, że to naprawdę nie odpowiada na pytanie. Jest to tylko to samo, jeśli nie działają żadne inne procesy. Również nie wydaje się to czterordzeniowym procesorem, bardziej jak ośmioma rdzeniami (może quad z włączonym HT). –

+0

To czterordzeniowy rdzeń z włączoną HT. –

+0

Nie odpowiada na oryginalne pytanie. Jednak nie wspominając o tym (-1) ode mnie. – KGhatak

3

Rozwiązanie ps był prawie co potrzebne iz jakiegoś bash wrzucony robi dokładnie to, co oryginalne pytanie zadane przez: zobaczyć zużycie per-rdzeniem konkretnych procesów

To pokazuje zużycie per-Rdzeń przetwarza wielowątkowe również.

Użyj: cpustat `pgrep processname`` pgrep innyprocessname` ...

#!/bin/bash 

pids=() 
while [ $# != 0 ]; do 
     pids=("${pids[@]}" "$1") 
     shift 
done 

if [ -z "${pids[0]}" ]; then 
     echo "Usage: $0 <pid1> [pid2] ..." 
     exit 1 
fi 

for pid in "${pids[@]}"; do 
     if [ ! -e /proc/$pid ]; then 
       echo "Error: pid $pid doesn't exist" 
       exit 1 
     fi 
done 

while [ true ]; do 
     echo -e "\033[H\033[J" 
     for pid in "${pids[@]}"; do 
       ps -p $pid -L -o pid,tid,psr,pcpu,comm= 
     done 
     sleep 1 
done 

Uwaga: Te statystyki opierają się na proces życia, nie ostatni X sekund, więc musisz ponownie uruchomić proces, aby wyzerować licznik.

+0

Czy istnieje odpowiednik syscall polecenia ps – Bionix1441

+0

Można użyć funkcji C lib read() i open(), aby otworzyć pseudo pliki w/proc/pid/* i przeanalizuj wszystkie potrzebne dane. – GL2014

0

Miałem właśnie ten problem i znalazłem podobną odpowiedź here.

Metoda polega na ustawieniu numeru top w żądany sposób, a następnie naciśnięciu klawisza W (duże W). Oszczędza to „bieżący układ s do pliku konfiguracyjnego w $ HOME/.toprc

Choć to może nie działać, jeśli chcesz uruchomić wiele toptop sz różnych konfiguracjach.

Więc przez co uważam obejść można pisać do różnych plików konfiguracyjnych/użyć różnych plików konfiguracyjnych, wykonując jedną z następujących czynności ...

1) Zmień nazwę binarną

ln -s /usr/bin/top top2 
    ./top2 

teraz .top2rc zostanie zapisany do $ HOME

2) Zestaw $ HOME do jakiegoś alternatywnego drogi, ponieważ będzie napisać swój plik konfiguracyjny do pliku $ HOME/.binary-name.rc

HOME=./ 
top 

Teraz .toprc zostanie zapisany w bieżącym folderze.

Poprzez użycie komentarzy innych ludzi w celu dodania różnych rozliczeń użytkowania na górze można utworzyć dane wyjściowe dla danej partii, a następnie połączyć informacje za pomocą skryptu. Może nie tak proste, jak scenariusz, ale znalazłem top, który dostarczył mi WSZYSTKIE procesy, dzięki czemu później mógłbym podreperować i przechwycić stan podczas długiego okresu, który mogłem pominąć w inny sposób (niewyjaśnione nagłe użycie procesora z powodu zbłąkanych procesów)

1

Myślałem, że perf stat jest tym, czego potrzebujesz.

Pokazuje konkretne użycie procesu podczas określania opcji --cpu=list. Oto przykład monitorowania wykorzystania procesora przy budowaniu projektu za pomocą komendy perf stat --cpu=0-7 --no-aggr -- make all -j. Dane wyjściowe to:

CPU0   119254.719293 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU1   119254.724776 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU2   119254.724179 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU3   119254.720833 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU4   119254.714109 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU5   119254.727721 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU6   119254.723447 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU7   119254.722418 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU0     8,108 context-switches   # 0.068 K/sec     (100.00%) 
CPU1    26,494 context-switches            (100.00%) 
CPU2    10,193 context-switches            (100.00%) 
CPU3    12,298 context-switches            (100.00%) 
CPU4    16,179 context-switches            (100.00%) 
CPU5    57,389 context-switches            (100.00%) 
CPU6     8,485 context-switches            (100.00%) 
CPU7    10,845 context-switches            (100.00%) 
CPU0     167 cpu-migrations   # 0.001 K/sec     (100.00%) 
CPU1     80 cpu-migrations            (100.00%) 
CPU2     165 cpu-migrations            (100.00%) 
CPU3     139 cpu-migrations            (100.00%) 
CPU4     136 cpu-migrations            (100.00%) 
CPU5     175 cpu-migrations            (100.00%) 
CPU6     256 cpu-migrations            (100.00%) 
CPU7     195 cpu-migrations            (100.00%) 

Lewa kolumna to specyficzny indeks procesora, a prawą kolumną jest użycie procesora. Jeśli nie określisz opcji --no-aggr, wynik zostanie zebrany razem. Opcja --pid=pid pomoże, jeśli chcesz monitorować uruchomiony proces.

Wypróbuj również -a --per-core lub -a perf-socket, które będą zawierały więcej informacji niejawnych.

Więcej informacji na temat korzystania z perf stat można zobaczyć w tym poradniku: perf cpu statistic, a także perf help stat pomoże w znaczenie opcji.

1
dstat -C 0,1,2,3 

Powoduje również użycie procesora z pierwszych 4 rdzeni. Oczywiście, jeśli masz 32 rdzenie, to polecenie jest trochę dłuższe, ale użyteczne, jeśli interesujesz się tylko kilkoma rdzeniami.

Na przykład, jeśli jesteś zainteresowany tylko w rdzeniu 3 i 7, a następnie można zrobić

dstat -C 3,7 
2

htop daje ładny przegląd wykorzystania indywidualnego rdzenia