Hohe CPU-Auslastung (Ruby)

Ich sehe ziemlich häufig eine hohe CPU-Auslastung, die normalerweise bei etwa 85 % liegt:

Zuvor wurde es als unicorn.conf.r angezeigt:

Könnte dies darauf hindeuten, dass UNICORN_WORKERS zu hoch/niedrig eingestellt ist?
Der Server verfügt über 64 GB RAM (zeigt normalerweise etwa 40 GB frei an) und 6 Kerne. Auf dem Server befinden sich 4 Discourse-Instanzen, die jeweils auf UNICORN_WORKERS: 8 eingestellt sind.

Irgendwelche Ideen oder Tipps, was die Ursache sein könnte oder was man versuchen könnte? (Eines der Foren befindet sich im schreibgeschützten Modus und hat nicht viel Traffic. Sollte es so eingestellt werden, dass es weniger Worker hat?)

2 „Gefällt mir“

Ich weiß es nicht, aber ich wette, Sie verwenden viel mehr Worker, als Ihre Kerne bieten können?

1 „Gefällt mir“

Ja. Ich schlage auch vor, die Anzahl der Unicorn-Worker zu reduzieren:

2 „Gefällt mir“

Sie könnten versuchen, die Anzahl der Unicorn-Worker zu reduzieren.

2 „Gefällt mir“

Vielen Dank für eure Antworten – ich bin mir nicht sicher, wo ich das gelesen habe, aber ich dachte immer, wir sollten 2 Worker pro Kern einstellen. Ich habe die Worker jetzt gemäß dem Forum reduziert, mehr den geschäftigsten Foren zugewiesen und weniger den weniger geschäftigen. Ich werde die Dinge in der nächsten Woche beobachten und berichten, wenn es nicht geholfen hat.

Bearbeiten: Ich glaube, ich habe es hier gelesen.

1 „Gefällt mir“

In Ihrem Fall weisen Sie jedoch keine zwei Worker pro Kern zu. Sie haben sechs Kerne, was zwölf Workern entsprechen würde, aber Sie haben vier Instanzen, die jeweils acht Worker verwenden, also insgesamt 32.

4 „Gefällt mir“

Ja… Ich habe es so angepasst, dass die Gesamtzahl der Worker nicht mehr als doppelt so hoch ist wie die Anzahl der Kerne, obwohl ich mich immer noch frage: Was ist der richtige/übliche Rat, das, was Sie gesagt haben, oder das, was in Nates Beitrag stand, wo er Jeff zitiert, der sagt 1 Worker pro Kern?

Aus meinen eigenen Experimenten führt 1 Worker pro Kern zu Timeouts (senkt aber die Serverlast), mehr Worker führen zu besserer Leistung, aber höherer Last (die auf meinem Server immer noch im akzeptablen Bereich liegt).

1 „Gefällt mir“

Schauen Sie sich discourse-setup an, das heute die Skalierung für Neuinstallationen übernimmt:

# UNICORN_WORKERS: 2 * GB für 2GB oder weniger, oder 2 * CPU, max 8
  if [ "$avail_gb" -le "2" ]
  then
    unicorn_workers=$(( 2 * $avail_gb ))
  else
    unicorn_workers=$(( 2 * $avail_cores ))
  fi
  unicorn_workers=$(( unicorn_workers < 8 ? unicorn_workers : 8 ))

Diese zweite Anweisung, die die doppelte Anzahl der verfügbaren Kerne verwendet, ist standardmäßig auf Systemen mit mehr als 2 GB RAM vorhanden. Es scheint, dass Ihr Problem eher auf ein Tauziehen zwischen Ihren Instanzen (Host-Ressourcen) zurückzuführen ist als auf ein Discourse-Problem.

2 „Gefällt mir“

Ich sehe dasselbe nach meinem letzten Upgrade, das einen Tag nach dem OP war, daher glaube ich nicht, dass dies etwas mit der Anzahl der Unicorn-Worker zu tun hat. Der Prozess unicorn.conf.r* ist verdächtig, da der ursprüngliche Beitrag dieses Themas der einzige Treffer für diesen Begriff im gesamten Web ist. Ich glaube, unicorn.conf.rb wäre normaler.

Die Zunahme geschah genau bei meinem letzten Upgrade, vor 4 Tagen. Beachten Sie, dass der OP vor 5 Tagen gepostet hat. An Discourse hat sich etwas geändert.

Ich habe seit mehreren Jahren die gleiche Anzahl von Unicorn-Workern auf derselben Instanz verwendet und nichts geändert – nur auf 3.4.0.beta4-dev neu kompiliert.

1 „Gefällt mir“

FWIW, es gibt keine langlaufenden oder fehlgeschlagenen Jobs in Sidekiq.

1 „Gefällt mir“

Ich habe mit keinen Plugins (außer Docker Manager) neu erstellt und das Problem besteht weiterhin, also liegt es nicht an einem Plugin.

Irgendwelche Hinweise hier?

Ich habe gerade auf die neueste Discourse-Version aktualisiert und keine unicorn.conf.r*-Prozesse mehr gesehen (jetzt ist alles um die 80% CPU-Marke herum nur noch ruby, obwohl es seltener vorkommt). Die Auslastung ist ungefähr gleich (wenn auch niedriger als nach meinen letzten Anpassungen der Worker).

Haben Sie auf die neueste Version aktualisiert? Welche Art von Hardware verwenden Sie und wie stark ist Ihr Forum ausgelastet?

Ja, ich bin bei 3.4.0.beta4-dev. Das hat die hohe CPU-Auslastung ausgelöst. Sonst hat sich nichts geändert.

8 GB RAM, 2 vCPUs, 160 GB SSD mit viel Speicherplatz.

Ich habe oben die CPU-Auslastung für meine Produktionsseite gepostet, die etwa 30 Benutzer gleichzeitig online hat. Aber ich habe eine Testseite mit demselben Problem, und dort gibt es absolut keinen Traffic und keine Plugins. CPU-Auslastung vor und nach dem Update (Spitzen sind tägliche Backups):

1 „Gefällt mir“

Ich bin mir nicht sicher, ob unsere Situationen zusammenhängen, Mark. Ich glaube, in meinem Fall spielte das, was Stephen sagte, eine große Rolle:

Ich habe kürzlich zwei weitere Instanzen auf denselben Server verschoben und tatsächlich vergessen, dass die Unicorn-Worker auf 8 eingestellt waren, da wir zuvor auf einem Server mit mehr Kernen waren (der aber seine eigenen Probleme hatte, weshalb wir zu einem Xeon zurückkehrten, der weniger Kerne hatte, aber insgesamt besser funktionierte).

Was ich also herausfand, war, dass die Reduzierung der Unicorn-Worker auf diesem Server die Last reduzierte, aber Timeouts verursachte. Die Erhöhung der Worker beseitigte die Timeouts, führte aber zu einer höheren Last - wenn auch immer noch in einem akzeptablen Bereich. Ich denke, ich könnte die Worker erhöhen und wir könnten die erhöhte Last immer noch bewältigen, aber was wir jetzt haben, ist vorerst gut.

Davon abgesehen habe ich die Instanzen auf denselben Server verschoben und er lief innerhalb dessen, was ich erwartet hätte (die Last stieg, aber nicht sehr stark an), und es schien, dass ein Update zu höheren Lasten führte … ich kann mir da aber nicht sicher sein, und wir müssen bedenken, dass Discourse von Zeit zu Zeit mit mehr Funktionen möglicherweise leistungsfähigere Hardware benötigt oder manchmal ‘langsamer’ wirkt (ich hatte einige Discourse-Instanzen mit alten Versionen und sie wirkten merklich schneller - obwohl sie natürlich nicht alle Funktionen der neueren Versionen hatten).

Davon abgesehen, denke ich, dass die Lasten seit dem letzten Discourse-Update (mit PG 15) tatsächlich ein wenig gesunken sind.

Ich bin mir nicht sicher, was ich Ihnen vorschlagen soll, Mark - vielleicht spielen Sie mit den Workern und einigen anderen Einstellungen herum? Wie z.B. db_shared_buffers und db_work_mem? Vielleicht starten Sie einen eigenen Thread nach dem Motto “Hohe CPU-Auslastung nach dem Update - braucht meine Instanz Leistungsoptimierungen?” Oder so etwas :slight_smile:

1 „Gefällt mir“

Ich habe heute Abend ein Upgrade durchgeführt und sofort einen Unterschied bei der CPU-Auslastung auf meiner Website festgestellt. Hier ist ein Diagramm von davor, während und nach dem Upgrade. Dies stellt einen Zeitraum von einer Stunde dar.

Standard-Discourse-Einzelcontainer-Installation auf einem DO – 8 GB RAM, 2 vCPUs und 100 GB SSD mit viel Speicherplatz.

Wir werden sehen, wie es nach 12 Stunden aussieht.

4 „Gefällt mir“

Hier sind die Ergebnisse 15 Stunden nach dem Upgrade. Die CPU-Auslastung ist drastisch um das 3-fache gestiegen. Der Lastfaktor ist um das 4-fache gestiegen.

Min Avg. Pre-Upgrade Post-Upgrade
5 .11 .4
15 .10 .45

24-Stunden-Ansicht:


Java ist die Haupt-CPU-Auslastung. Etwas hat sich beim letzten Upgrade drastisch geändert.

Welche Informationen benötigt das Discourse-Team zur Fehlerbehebung?
Sollte dieses Thema zu einem Fehler verschoben werden?

2 „Gefällt mir“

Es sieht also so aus, als ob mein Problem doch nicht die Unicorn-Worker waren – nach @sams Update, das @LotusJeffs Thread folgte, sind die Serverauslastungen wieder auf dem Niveau, das sie waren (weniger als die Hälfte dessen, was sie gestiegen waren)…

4 „Gefällt mir“

Das hat mein Problem auch behoben.

1 „Gefällt mir“

Ich hätte es wahrscheinlich nicht bemerkt, wenn ich den Server nicht im Auge behalten hätte, nachdem ich kürzlich die anderen beiden Foren darauf verschoben hatte – ich frage mich, wie viele Leute es betroffen hat, ohne es überhaupt zu merken?

Hat das Discourse-Team Maßnahmen ergriffen, um sie auf solche Probleme aufmerksam zu machen? Vielleicht ein Freiwilligenprogramm, das Administratoren für bestimmte Themen einrichten können, z. B. „Serverauslastung innerhalb von XX Stunden/Tagen/Wochen vor/nach einem Upgrade an Discourse senden“ Oder noch besser, diese lokal verfolgen und dann Administratoren benachrichtigen, wenn nach Upgrades eine Zunahme der Serverauslastung festgestellt wird – die wir dann bei Bedarf hier posten können.

1 „Gefällt mir“

Ich hätte den Einfluss wahrscheinlich nicht bemerkt, aber ich beobachte den Server genau, da wir vor etwa 2 Wochen zu Discourse migriert sind. Ich bin gerade dabei, verschiedene Validierungen nach der Migration durchzuführen (Backup-Lauf usw.). Nach ein paar Monaten hätte ich den Einfluss nie bemerkt.

Ich würde hoffen, dass Discourse einen täglichen Lasttest durchführt. In meinem früheren Leben hatte ich einen Server, der täglich mit committet Code neu aufgebaut wurde. Den ganzen Tag über simulierten Benutzer die Nutzung des Servers. Wir haben wichtige Leistungsmetriken aus Benutzersicht und Serverseite gemessen. Dies ermöglichte es uns, Speicherlecks, ineffizienten Code und unerwartete Änderungen an der Benutzererfahrung proaktiv zu erkennen.

Ich muss Sam und dem Team trotzdem ein Lob aussprechen. Aus der Welt von phpBB kommend, wo so etwas Jahrzehnte zur Lösung und Behebung brauchen würde, fand ich die schnelle Reaktion fantastisch. (Auch wenn es bedeutete, bis 2 Uhr morgens CT-Zeit im Vergleich zur Sydney-Zeit wach zu bleiben.)

2 „Gefällt mir“