Ile rdzeni używam na serwerze z systemem Linux?

30

Zastanawiam się tylko, jak mogę dowiedzieć się, ile rdzeni procesorów używa użytkownik na serwerze z systemem Linux?

Przesyłam sporo zadań w tle na serwer, dlatego chciałbym napisać skrypt bash, aby sprawdzić przed przesłaniem zadania, czy uruchomione zadania (procesy) przesłane przeze mnie są zbyt liczne, ponieważ muszę pozwolić innym użytkownicy mają wystarczającą liczbę rdzeni do pracy. Chciałbym wiedzieć, jakie polecenie bash może mi powiedzieć, ile rdzeni używają teraz moje zadania.

Dziękuję i pozdrawiam!

Tim
źródło

Odpowiedzi:

39

Aby uzyskać liczbę rdzeni procesora na procesor:

grep "^core id" /proc/cpuinfo | sort -u | wc -l

Lub uzyskać liczbę fizycznych procesorów :

grep "^physical id" /proc/cpuinfo | sort -u | wc -l
Alix Axel
źródło
jak to sprawdzić dla danego użytkownika?
makis
26

Nie wiem, czy to pomaga, ale możesz użyć tego mpstatnarzędzia, aby uzyskać rozkład wykorzystania procesora według poszczególnych procesorów (lub rdzeni). Na przykład:

$ mpstat -P ALL 1

12:49:59 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
12:50:00 PM  all    7.89    0.00    1.25    0.88    0.00    0.00    0.00   89.97   1359.00
12:50:00 PM    0   14.00    0.00    0.00    0.00    0.00    0.00    0.00   86.00   1043.00
12:50:00 PM    1   15.84    0.00    7.92    3.96    0.00    0.99    0.00   71.29    297.00
12:50:00 PM    2    3.96    0.00    0.00    1.98    0.00    0.99    0.00   93.07      0.00
12:50:00 PM    3    3.96    0.00    0.99    2.97    0.00    0.00    0.00   92.08      0.00
12:50:00 PM    4    4.00    0.00    0.00    0.00    0.00    0.00    0.00   96.00      0.00
12:50:00 PM    5    4.95    0.00    0.99    0.00    0.00    0.00    0.00   94.06     18.00
12:50:00 PM    6   10.89    0.00    0.99    0.00    0.00    0.00    0.00   88.12      0.00
12:50:00 PM    7    5.05    0.00    0.00    0.00    0.00    0.00    0.00   94.95      0.00

W tym przykładzie widać, że CPU 0, 1i 6robią więcej pracy niż reszta. Czasami zobaczysz, że pojedynczy procesor jest bliski (lub ma) 100%, podczas gdy inne mają zero. Może to być wskaźnik programu (lub części programu), który jest jednowątkowy i może korzystać tylko z jednego procesora naraz.

Aby zainstalować mpstatw systemie Fedora, RHEL lub CentOS, użyj yum install sysstat.

Matt Solnit
źródło
Dziękujemy milion za udzielenie tej odpowiedzi! Moi koledzy używali polecenia „top” i wyciągali błędne wnioski na temat wykorzystania procesora, dopóki nie pokazałem im polecenia mpstat.
Nav
Niedostępne na Ubuntu: # aptitude search mpstat #.
Alix Axel,
2
@AlixAxel spróbuj aptitude search systatzamiast tego.
Matt Solnit,
@MattSolnit: Wciąż brak szczęścia.
Alix Axel,
mpstat jest dostarczany przez pakiet sysstat na Debianie i na Ubuntu . Spodziewałbym się, że większość dystrybucji pochodzących z Debiana używa tej samej nazwy pakietu. W przypadku dystrybucji pochodzących z Debiana zacznij od apt-cache search --full mpstat.
CVn
2

O ile nie zostało wyraźnie skonfigurowane, aby nie (tj. Przypinać procesu do określonego procesora), można założyć, że wszystkie rdzenie są w użyciu przez cały czas. Harmonogram przydzieli procesom następny dostępny rdzeń. W tym przypadku „Monitor systemu” (część GNOME) pokazuje moje obciążenie prawie tak samo we wszystkich 4 rdzeniach mojej maszyny.

EmmEff
źródło
Przesyłam sporą liczbę zadań w tle na serwer, więc lubię pisać skrypt bash, aby sprawdzić przed przesłaniem zadania, czy uruchomione zadania (procesy) przesłane przeze mnie są zbyt liczne, ponieważ muszę pozwolić innym użytkownikom wystarczająca liczba rdzeni do wykorzystania w pracy. Chciałbym więc wiedzieć, jakie polecenie bash może mi powiedzieć, ile rdzeni używają teraz moje zadania.
Tim
3
Nie sądzę, że zrozumiałeś moją odpowiedź. Liczba używanych rdzeni ZAWSZE jest całkowitą liczbą dostępnych rdzeni. Użyj ogólnego obciążenia systemu jako czynnika, aby ustalić, czy przesyłanie zadań powinno być ograniczone.
EmmEff,
Dziękuję Ci! Sprawdzam całkowite obciążenie systemu. Jeden z moich kolegów powiedział mi, że nie mogę zużyć wszystkich rdzeni, ponieważ kto wie, że inni wkrótce zaczną swoją pracę, a moja praca potrwa dość długo. Czy myślisz również, że muszę ograniczyć liczbę rdzeni, których używam?
Tim
2

Zobaczysz więc odpowiedzi, które powiedzą ci, jak wykorzystywane są twoje rdzenie.

JEDNAK - to tak naprawdę nie robi ci usługi. Przyjęliście podstawowe założenie, które po prostu się nie sprawdza - że wasze zadania będą miały tendencję do grupowania się w podzbiór rdzeni.

Zamiast tego Twoje zadania zostaną rozłożone na wszystkie rdzenie, chyba że zaimplementujesz coś, co w jakiś sposób sprawi, że będą one „wciśnięte”. (Uwaga: nie polecam tego; po prostu mówię „chyba”)

Oto alternatywna strategia: Zidentyfikuj dla swojego systemu, jaki jest poziom LOAD, gdy uważasz, że „akceptowalne” dla innych użytkowników jest dodawanie kolejnych zadań. Następnie zbuduj coś, co przesyła nowe zadanie w tle tylko wtedy, gdy poziom obciążenia spadnie poniżej tego limitu.

W ten sposób rozwiązanie będzie niezależne od liczby rdzeni, bardziej przenośne, bardziej elastyczne i łatwiejsze do „ulepszenia”.

pbr
źródło
Właśnie zauważyłem komentarz dodany do odpowiedzi innego plakatu, wskazujący, że dzieje się tak z powodu czegoś, co powiedział ci kolega. Rzeczywiście wydaje się, że nieporozumienie należy do niego, a nie do ciebie. Przepraszam za to!
pbr
Dziękuję Ci! Jeśli chodzi o „Zidentyfikuj dla swojego konkretnego systemu, jaki jest poziom LOAD, gdy uważasz, że„ akceptowalne ”jest dodawanie kolejnych zadań przez innych użytkowników”, jeśli bieżące obciążenie nie wynika głównie z moich uruchomionych zadań, wolałbym używać pozostałe procesory, ale jeśli przy bieżącym obciążeniu moje bieżące zadania zajmą sporo, prawdopodobnie będę musiał zrezygnować z pozostałych procesorów. Czy nadal uważasz, że nie muszę szacować zużycia procesora przez moje wszystkie uruchomione zadania?
Tim
Nie, naprawdę nie sądzę, aby miało sens rozróżnianie między obecnym obciążeniem a pracą. Zastanów się nad prostotą: Twoja praca stara się być dobrym obywatelem i poddaje się tylko wtedy, gdy obciążenie jest poniżej poziomu, który uważasz za akceptowalny. NIGDY nie należy wykorzystywać całej pozostałej pojemności; pozostawiając w przyszłości innych przyszłych użytkowników. Idealnie wszyscy użytkownicy używaliby do tego tej samej logiki.
pbr
2

Jeśli chcesz to zrobić, aby działało na systemie Linux i OS X, możesz:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
źródło
1

Możesz uzyskać przybliżoną ocenę, uruchamiając top, naciskając „ U” i określając swoją nazwę użytkownika, a następnie sumując wykorzystanie procesora przez kilka najważniejszych procesów.

dmckee
źródło
Lubię znać polecenie bash, które może podać mi numer, ponieważ chcę go używać w skrypcie bash.
Tim
@Tim topmoże działać w trybie wsadowym za pomocą przełącznika -b. Połącz go z przełącznikiem -n, aby uzyskać potrzebną liczbę iteracji.
nagul
1
czy możesz podać przykład kodu do uzyskania liczby rdzeni używanych przez wszystkie zadania (procesy) przesłane przez użytkownika?
Tim
@Tim Not off the bat. Musiałbym albo napisać taki skrypt, analizując dane topwyjściowe, albo google, aby sprawdzić, czy ktoś już to zrobił. Jednak nie jestem przekonany, czy warto było tego wysiłku, ponieważ myślę, że otrzymam różne wyniki dla każdego uruchomienia, biorąc pod uwagę szybkość, z jaką następuje przełączanie kontekstu. Czy system nie jest wystarczająco dobrym wskaźnikiem? Skutecznie informuje, ile wirtualnych rdzeni jest wymaganych do obsługi kolejki procesów (procesów oczekujących na CPU).
nagul
@ nagul: Tak, ładowanie systemu jest dobre i ja też to sprawdzam. Jednak niektórzy ludzie powtarzają mi, że nie mogę zużyć wszystkich rdzeni, ponieważ kto wie, że inni wkrótce zaczną pracę. Więc chyba muszę ograniczyć liczbę rdzeni, których używam. Nawiasem mówiąc, czy widziałeś gdzieś skrypty online, które sprawdzają obciążenie procesora i pamięci i dynamicznie przesyłają zadania na podstawie wykorzystania? Tak długo ich szukałem. Dzięki!
Tim