Wie viele Context Switches sind "normal" (abhängig von CPU-Kernen (oder anderen))?

34

Hallo Linux / UNIX Overlords,

Hat einer von Ihnen eine Faustregel, wie viele Kontextwechsel (pro Prozessorkern) auf einem Linux-Server normal sind ?

Mein College hier hat es angesprochen und er sieht 16K auf einem 8-Core- x86_64Rechner.

Hier sind einige Statistiken von sarface der letzten Tage ...

Alternativtext http://src.autonomy.net.au/imagebin/81895e338fae67d3d205c09db44a81e6-Picture_10.png

Und um die Prozesserstellungsstatistiken zu sehen, ist hier eine logarithmische Ansicht desselben Graphen ...

Alternativtext http://src.autonomy.net.au/imagebin/7481f7e52bead4effc90248fc23c72fe-Picture_11.png

Und die 8 Kerne sind zu Tode gelangweilt ...

Alternativtext http://src.autonomy.net.au/imagebin/0e94326652e977fd74edcd840f94200f-Picture_12.png

CS vs IOwait (x10000-Skala)

Alternativtext http://src.autonomy.net.au/imagebin/a52a2a8a120394849c0da4045933e306-Picture_13.png

Mehr nutzlose Informationen für den Fall, dass jemand fragt ..

  • Der Speicher, auf dem der Server arbeitet, ist ein 0,5-TB-SAN über FC
  • Es gibt 8 GB RAM, meistens Cache - kein Auslagern.
Xerxes
quelle
1
In einer bestimmten Zeit?
Dmckee
Können Sie die Arbeitsbelastung genauer beschreiben?
Dienstag,
1
Wie haben Sie dieses Diagramm erstellt? Sieht echt gut aus!
Antoine Benkemoun
Hallo Antoine - Die Grafiken werden von Sarface ( projects.autonomy.net.au/sarface ) gemacht
Xerxes
Die Grafik-Links sind ab sofort nicht mehr verfügbar. @Xerxes kannst du von irgendwo hinkommen?
Törzsmókus

Antworten:

25

Dies hängt stark von der Art der Anwendung ab, die Sie ausführen. Wenn Sie Anwendungen haben, die sehr auslöserfreundliche WRT-Systemaufrufe ausführen, ist mit einem hohen Grad an Kontextwechsel zu rechnen. Wenn die meisten Ihrer Anwendungen im Leerlauf ausgeführt werden und nur dann aktiviert werden, wenn an einem Socket etwas passiert, ist mit niedrigen Kontextwechselraten zu rechnen.

Systemaufrufe

Systemaufrufe verursachen von Natur aus Kontextwechsel. Wenn ein Prozess einen Systemaufruf ausführt, weist er den Kernel an, den aktuellen Zeitpunkt und den aktuellen Arbeitsspeicher zu übernehmen, um die Aufgaben zu erledigen, für die der Prozess keine Berechtigung hat, und an dieselbe Stelle zurückzukehren, wenn er fertig ist.

Wenn wir uns die Definition des write (2) -Syscalls von Linux ansehen, wird dies sehr deutlich:

NAME
       write - Schreibt in einen Dateideskriptor

ZUSAMMENFASSUNG
       #umfassen 

       ssize_t write (int fd, const void * buf, size_t count);

BESCHREIBUNG
       write () schreibt bis zur Anzahl der Bytes aus dem Puffer, auf den buf zeigt, in die Datei
       bezeichnet durch den Dateideskriptor fd. [..]

RÜCKGABEWERT
       Bei Erfolg wird die Anzahl der geschriebenen Bytes zurückgegeben (Null bedeutet
       es wurde nichts geschrieben). Im Fehlerfall wird -1 zurückgegeben und errno gesetzt
       passend.
       [..]

Dies weist den Kernel grundsätzlich an, die Operation vom Prozess zu übernehmen, auf countBytes aufzusteigen , beginnend mit der Speicheradresse, auf die von gezeigt wird *buf, um den Deskriptor fddes aktuellen Prozesses abzulegen, und dann zum Prozess zurückzukehren und ihm mitzuteilen, wie er gelaufen ist.

Ein gutes Beispiel dafür ist der dedizierte Spieleserver für Valve Source-basierte Spiele, hlds . http://nopaste.narf.at/f1b22dbc9 zeigt einen Sekundenwert von Systemaufrufen, die von einer einzelnen Instanz eines Spielservers ausgeführt wurden, auf dem keine Spieler installiert waren. Dieser Vorgang benötigt auf einem Xeon X3220 (2,4 GHz) ca. 3% CPU-Zeit, um Ihnen ein Gefühl dafür zu vermitteln, wie teuer dies ist.

Multitasking

Eine weitere Ursache für das Wechseln des Kontexts können Prozesse sein, die keine Systemaufrufe ausführen, jedoch von einer bestimmten CPU entfernt werden müssen, um Platz für andere Prozesse zu schaffen.

Ein guter Weg, dies zu visualisieren, ist cpuburn . cpuburn führt selbst keine Systemaufrufe durch, sondern iteriert nur über den eigenen Speicher, sodass keine Kontextumschaltung erfolgen sollte.

Nehmen Sie einen inaktiven Rechner, starten Sie vmstat und führen Sie dann für jeden CPU-Kern des Systems einen burnMMX (oder einen anderen Test aus dem Paket cpuburn) aus. Sie sollten bis dahin die volle Systemauslastung haben, aber kaum eine erhöhte Kontextumschaltung. Versuchen Sie dann, ein paar weitere Prozesse zu starten. Sie werden feststellen, dass die Kontextwechselrate zunimmt, wenn die Prozesse um CPU-Kerne konkurrieren. Der Umfang der Umschaltung hängt vom Verhältnis von Prozessen zu Kern und von der Multitasking-Auflösung Ihres Kernels ab.

Weitere Lektüre

linfo.org hat einen guten Überblick darüber, was Kontextwechsel und Systemaufrufe sind. Wikipedia bietet allgemeine Informationen und eine schöne Linksammlung zu Systemaufrufen.

Michael Renner
quelle
1
Das war nützlich - Sie haben mir eine großartige Idee gegeben! =)
Xerxes
1
Ihre Aussage System calls cause context switches by their very own naturescheint falsch zu sein. Systemaufrufe verursachen einen Moduswechsel, wie von linfo.org/context_switch.html
Nicolas Labrot am
6

Mein mäßig belasteter Webserver ist die meiste Zeit zwischen 100 und 150 Mal in der Sekunde mit Spitzenwerten zwischen Tausend.

Hohe Kontextwechselraten sind selbst kein Problem, können jedoch den Weg zu einem größeren Problem weisen.

edit: Kontextwechsel sind ein Symptom, keine Ursache. Was versuchst du auf dem Server auszuführen? Wenn Sie einen Multiprozessor-Computer haben, können Sie versuchen, die CPU-Affinität für Ihre Hauptserverprozesse festzulegen.

Wenn Sie X ausführen, können Sie auch versuchen, in den Konsolenmodus zu wechseln.

nochmals editieren: bei 16k cs pro sekunde bildet jede cpu durchschnittlich zwei switch pro millisekunde - das ist ein halbsechstel der normalen zeitscheibe. Könnte er viele IO-gebundene Threads ausführen?

editiere nochmal poste graphs: Sieht auf jeden Fall IO-gebunden aus. verbringt das System die meiste Zeit in SYS, wenn die Kontextwechsel hoch sind?

Bearbeiten Sie noch einmal: Hohe iowait und System in diesem letzten Diagramm - vollständig in den Schatten der Benutzer. Sie haben IO-Probleme.
Welche FC-Karte verwenden Sie?

edit: hmmm. Haben Sie eine Chance, einige Benchmarks in Ihrem SAN-Zugriff mit Bonnie ++ oder Dbench während der Totzeit in Gang zu bringen? Ich würde gerne sehen, ob sie ähnliche Ergebnisse haben.

edit: Ich habe über das Wochenende darüber nachgedacht und ich habe ähnliche Gebrauchsmuster gesehen, als bonnie den Pass "schreibe ein Byte auf einmal" macht. Dies erklärt möglicherweise den hohen Umschaltaufwand, da für jeden Schreibvorgang ein separater Systemaufruf erforderlich ist.

jay_dubya
quelle
Ich bin immer noch nicht davon überzeugt, dass eine hohe Kontextwechselrate kein Problem darstellt. Ich spreche von 4K bis 16K und nicht von 100-150.
Xerxes
Auf keinem unserer Server wird X ausgeführt. Ich stimme Ihnen in Bezug auf das E / A-Warteproblem und die Beziehung zwischen diesem und dem CS zu. Die HBA-Karte ist jedoch kein Verdacht, da wir dieselbe Karte auf den ungefähr hundert anderen Servern verwenden. Beachten Sie, dass eine hohe E / A-Wartezeit nicht immer Grund zur Warnung ist. Wenn die meisten Prozesse auf einem Computer E / A-gebunden sind, wird erwartet, dass der Server nichts Besseres hat, um diese Leerlaufdrehs auszuführen.
Xerxes
Auf der zweiten Seite zeigt die beigefügte vierte Grafik, dass sie nicht ganz so nah ist wie ich. Nicht gerade eine Sonnenfinsternis. Trotzdem gebe ich dem SAN die Schuld. =)
Xerxes
1

Ich bin eher besorgt über die CPU-Auslastung des Systemstatus. Wenn der Prozentsatz bei 10% oder höher liegt, bedeutet dies, dass Ihr Betriebssystem zu viel Zeit für die Ausführung der Kontextwechsel verwendet. Das Verschieben einiger Prozesse auf einen anderen Computer ist zwar viel langsamer, verdient dies jedoch.


quelle
1

Aus diesem Grund sollten Sie versuchen, die Leistungsbasis für Ihre Server beizubehalten. Auf diese Weise können Sie Dinge, die Sie plötzlich bemerken, mit Dingen vergleichen, die Sie in der Vergangenheit aufgezeichnet haben.

Das heißt, ich habe Server (hauptsächlich nicht sehr ausgelastete Oracle-Server), die bei etwa 2.000 mit einigen 4.000 Peaks stabil sind. Für meine Server ist das normal, für die Server anderer Leute ist es möglicherweise viel zu niedrig oder zu hoch.

Wie weit können Sie in Ihren Daten zurückgehen?

Welche Art von CPU-Informationen können Sie uns geben?

wzzrd
quelle
Ich bin definitiv damit einverstanden, eine Grundlinie beizubehalten, und wir haben Nagios-Daten, die für lange Zeit zurückliegen - das Problem bei diesem Server ist, dass es sich um Nachwuchs handelt - und das nur für eine kurze Zeit. Außerdem wird die Unternehmenssoftware Teamsite ausgeführt (read: crap), um sie der Liste der nicht definierten Variablen hinzuzufügen. Ich bevorzuge immer noch sar (persönliche Präferenz), so dass ich es so konfiguriere, dass es mehr als die Standardeinstellung (2 Wochen) beibehält, und sehe, wie es geht.
Xerxes
Die Verwendung von sar in Kombination mit rrdtool (von dem Ihre Diagramme stammen) kann ein einfaches Mittel sein, um Ihre Daten (oder zumindest Auszüge davon) für eine lange Zeit aufzubewahren.
Wzzrd
0

Es gibt keine Faustregel. Ein Kontextwechsel ist nur die CPU, die von einem Thread zum nächsten wechselt. Wenn Sie viele Prozesse ausführen (oder einige Prozesse mit hohem Threading), sehen Sie mehr Schalter. Zum Glück müssen Sie sich keine Gedanken darüber machen, wie viele Kontextwechsel es gibt - die Kosten sind gering und mehr oder weniger unvermeidlich.

Alex J
quelle
6
Tatsächlich sind die Kosten eines Kontextwechsels teuer . Dies ist sogar das Schlimmste auf virtuellen Maschinen. Wir haben vor einigen Monaten einige Tests durchgeführt, die gezeigt haben, dass eine der Hauptursachen für die VM-Leistung das Umschalten des Kontexts war.
Xerxes
Tatsächlich ist in jedem modernen Betriebssystem (Multitasking) die Minimierung der Kontextumschaltung eine sehr wichtige Optimierungsaufgabe. Haben Sie Quellen, aus denen hervorgeht, dass die Kosten gering sind?
Xerxes
Entschuldigung, reden Sie über das Minimieren von Kontextwechseln aus der Sicht der Betriebssystementwicklung? Da ich mit dieser Entwicklung nichts zu tun habe, habe ich keine Meinung zu den Vorteilen des Entwerfens eines Systems zur Minimierung von CS. ZB Wenn Sie die Anzahl der Prozesse auf einer Maschine reduzieren, müssen Sie diese Prozesse auf eine andere Maschine verschieben, was bedeutet, dass die Kommunikation über ein Netzwerk erfolgt, das viel langsamer ist!
Alex J
Ich glaube, Ihre Definition von Kontextwechseln ist fehlerhaft. Sie treten auch dann auf, wenn ein Systemaufruf ausgeführt wird, auch wenn er zum gleichen Thread zurückkehrt. Anwendungen optimieren dagegen durch verschiedene Tricks. Zum Beispiel muss Apache sehr oft Systemzeit bekommen; Zu diesem Zweck ruft ein Thread wiederholt localtime auf und speichert das Ergebnis im gemeinsamen Speicher. Die anderen Threads müssen nur aus dem RAM lesen und verursachen dabei keinen Prozesswechsel.
niXar