miara obciążenia procesora z hiperwątkiem w systemie Linux

12

Jak mogę uzyskać prawdziwe wykorzystanie procesora wielordzeniowego z włączoną funkcją Hyperthreading?

Na przykład rozważmy 2-rdzeniowy procesor, wyrażający 4 wirtualne rdzenie.

Jedno wątkowe obciążenie będzie teraz wyświetlać się jako 100% top, ponieważ jeden rdzeń wirtualnych rdzeni jest całkowicie wykorzystany. Procesor i topdziałają zgodnie z oczekiwaniami, jakby były 4 prawdziwe rdzenie.

Jednak z dwoma wątkami sprawy stają się dziwne: jeśli wszystko działa dobrze, są one zrównoważone z dwoma prawdziwymi rdzeniami, więc mamy 200% użycia: Dwa razy 100% i dwa bezczynne rdzenie wirtualne i wykorzystujemy całą dostępną moc procesora . Wydaje mi się w porządku.

Jednakże, jeśli dwa wątki działałyby na jednym prawdziwym rdzeniu, okazałyby się, że używają dwa razy 100%, co daje 200% wykorzystania wirtualnego rdzenia. Ale w rzeczywistości byłby to jeden rdzeń dzielący swoją moc na dwa wątki, które następnie zużywają tylko połowę całkowitej mocy procesora.

Tak więc liczby użytkowania pokazane przez topnie mogą być użyte do zmierzenia całkowitego obciążenia procesora.

Zastanawiam się także, jak hiperwątkowanie równoważy dwa wirtualne na prawdziwym rdzeniu. Jeśli dwa wątki zajmą inną liczbę cykli, czy rdzenie wirtualne „dostosują się”, aby oba pokazywały 100% obciążenia, nawet jeśli rzeczywiste obciążenie się różni?

dronus
źródło
1
Rozumiesz, że system operatora nie zdaje sobie sprawy z różnicy między wirtualnym rdzeniem hiperwątkowości a rdzeniem fizycznym, prawda?
Ramhound
Wydaje się, że tak, ale nie musi? Rzeczywiste vs wirtualne mapowanie rdzenia jest prostą mapą jeden do dwóch. Problem polega na tym, jak zmierzyć obciążenie wirtualnego rdzenia, który faktycznie zmienia jego dostępną wydajność, planując inny na prawdziwym rdzeniu. Ale myślę, że wszystkie dane są dostępne, pytanie tylko, gdzie są narzędzia, które dają z nich właściwy wynik?
dronus
1
Po prostu lubię mieć pomiar obciążenia, w którym 100% oznaczałoby, że używany jest każdy cykl każdego prawdziwego rdzenia.
dronus
1
Mówiąc prosto: jak stwierdzić w danym momencie, czy mój procesor byłby w stanie wykonać dalszą pracę bez spowalniania aktualnie trwającej pracy?
dronus
1
@Ramhound, więc jeśli mam fizyczny 4-rdzeniowy procesor z 8 rdzeniami logicznymi, a moje średnie obciążenia mówią 4,00, czy mam 100% wykorzystania lub 50%?
Buttle Butkus

Odpowiedzi:

5

Martin Tegtmeier z Oracle napisał ciekawy post na blogu o tym w zeszłym roku: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2

Krótka odpowiedź; Hyperthreading naprawdę zadziwia ze zdolnością topa do raportowania ogólnego procentu wykorzystania procesora / procentu bezczynności procesora.

W najgorszym przypadku 2-rdzeniowy 4-wirtualny procesor z 2 wątkami przy 100% wykorzystaniu na rdzeń może prawie nasycić procesor. (W zależności od użycia portu wykonania; tylko wątki, które używają zupełnie innych zasobów obliczeniowych na procesorze, mogą nadal działać bez wpływu na wydajność w bieżącym wątku.) Jednak w tym przypadku top nadal zgłasza 50% bezczynności.

TinkerTank
źródło
1
Aktualny działający link: blogs.oracle.com/partnertech/…
Ján Lalinský
4

Wykorzystanie rdzenia jest bardzo różne niż obciążenie systemu. Wykorzystanie rdzenia pokazuje tylko, ile rdzenia coś oblicza lub czeka na instrukcje. Może wynosić 100%, co odpowiada dowolnemu czasowi, w którym procesor coś oblicza.

Ale obciążenie jest inną rzeczą, obciążenie jest ogólnie mierzone w celu ustalenia, czy jakikolwiek proces musi czekać na dowolny zasób, czy nie. Jeśli procesy nie czekają na żadne zasoby, zobaczysz bardzo wydajny system. Ale czasami zobaczysz powolne systemy, ale niskie wykorzystanie procesora. Ogólnie oznacza to, że niektóre procesy czekają na zasób i nie zwalniają procesora. W tego rodzaju scenariuszu nie widać dużego wykorzystania procesora, ale system może być znacznie bardziej obciążony.

W systemie Linux Średnia obciążenie to wartość obliczona do pomiaru ogólnej wydajności systemu. Wartość średniej obciążenia należy porównać z równoległymi zasobami obliczeniowymi, a konkretnie rdzeniami. Jeśli więc system z 4 rdzeniami fizycznymi ma średnie obciążenie 4 lub więcej, możemy śmiało powiedzieć, że niektóre procesy będą czekać na zasób.

Nie ma znaczenia, czy wykorzystanie procesora wynosi 100 czy 10 procent. Średnia wartość obciążenia może wynosić nawet 200 lub 300, w takich przypadkach system ledwo reaguje.

W normalnych warunkach pracy średnie obciążenie serwera nie powinno przekraczać liczby rdzeni przez długi czas. Krótkie kolce nie są według mnie ważne. 3 liczby, które zobaczysz na wwyjściu, to load av. przez 1/5/15 minut.

Hkntn
źródło
0

Moim zdaniem żadna z powyższych odpowiedzi nie jest zadowalająca.

Myślę, że artykuł, który odsyłam na następujący link, jest dobrze ukierunkowany na odpowiedź na to pytanie: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html

ZACYTOWAĆ:

Ideą HT jest umożliwienie uruchomienia innego wątku aplikacji, gdy aktualnie uruchomiona aplikacja się zatrzyma; z powodu nieprzewidzianych rozgałęzień, pęcherzyków w rurociągu itp. Aby było to możliwe, musi istnieć inny port lub rejestr AS. Rejestr ten staje się widoczny dla systemu operacyjnego po włączeniu HT. Jednak system operacyjny (i w górę łańcucha pokarmowego do wszelkich używanych narzędzi perf) teraz uważa, że ​​dostępna jest dwukrotnie większa pojemność procesora, tj. 100% procesora na każdym porcie AS.

Ale pod maską wciąż jest tylko jedna jednostka wykonawcza: pojedynczy, fizyczny rdzeń, który zacząłeś, zanim HT został włączony. Różnica polega na tym, że jest on w jakiś sposób współdzielony między 2 portami AS. Sposób przełączania pojedynczego rdzenia między dwoma portami jest bardzo skomplikowany, ale najłatwiej go zrozumieć w kategoriach odpytywanych kolejek. Wchodzę w ten poziom szczegółowości w moich klasach GCaP.

Najlepsze miary testowe, jakie mam, wskazują, że każdy port HT nie może być zajęty średnio więcej niż w 75% lub 150% całkowitej oczekiwanej pojemności 200% zgodnie z systemem operacyjnym. „Brakująca” 50% pojemności, o której wspomniałem wcześniej, jest iluzją. Intel twierdził, że w zakresie ogólnych zastosowań można oczekiwać czegoś w zakresie od 120% do 130%.

W rzeczywistości jestem prawie pewien, że system operacyjny może osiągnąć 100% na każdym wirtualnym rdzeniu, co do tego nie ma wątpliwości. Właśnie zrobiłem:

mvn clean install -DskipTests -T 5

I mogę was zapewnić, że moje 8 wirtualnych rdzeni, a 4 fizyczne rdzenie zostały wykorzystane w 100% do wykorzystania procesora. I zdecydowanie nie mam 8 rdzeni na moim komputerze.

Krótko mówiąc, możesz założyć, że jeśli całkowite obciążenie procesora przekroczy 100%, jesteś najwyżej i najprawdopodobniej dość dokładnie, wykorzystując dokładnie 100% rdzenia fizycznego. Ten menas, jeśli masz fizyczny CORE 1 podzielony na system operacyjny CPU 1 i CPU 2. A na CPU 1 masz całkowite wykorzystanie 50%, a na CPU 2 masz całkowite wykorzystanie 50%, najprawdopodobniej w prawdziwym życiu jesteś wywierając presję całkowitego wykorzystania 100% na ten procesor. Maksymalnie to wykorzystałeś.

Ale oczywiście system operacyjny w swoich narzędziach monitorowania systemu nie ma pojęcia, że ​​sprzedaje ci złudzenie. Zależnie od systemu operacyjnego i sposobu zarządzania zasobami, po prostu uwierzy, że każdy z tych dwóch wirtualnych rdzeni jest nadal w 50 procentach bezczynny, więc jeśli będzie więcej zadań do uruchomienia, spróbuje je równomiernie rozdzielić na te dwa rdzenie . Tak więc, gdy przekroczysz 100% wykorzystania procesora, w okresie wykorzystania procesora, zawsze jest w kolejce do uruchomienia w tym okresie czasu, który nigdy nie miał zmiany, aby uzyskać przerwę czasową na procesorze. W końcu to dostanie, ale zawsze są pewne wątki, które w rzeczywistości nawet nie działają, nawet jeśli są zaplanowane.

Dzięki

99Sono
źródło