PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CPULimit



Benny
22.10.16, 20:31
Hallo,
Ich habe seit einigen Monaten Probleme mit dem CPU meines Servers, wenn ich eine Java-Applikation starte benötigt diese kurzzeitig 200%-500% CPU, ich bin nach langer suche auf das Paket CPULimit gestoßen, aber dieses löst das Problem nur bedingt, da es nur immer einen Prozess limitiert, aber bei 10-20 Prozessen ist die Lösung nur bedingt hilfreich, daher hoffe ich auf diesem Weg zu erfahren wie ich dies auf alle Prozesse übertragen kann oder eine alternative Lösung zu finden. Ich bedanke mich im vorraus!

ThorstenHirsch
22.10.16, 20:55
Wenn's nur kurzzeitig ist, ist doch alles gut.

Benny
22.10.16, 21:10
Es ist aber bei 5-6 Prozessen mehrfach in der Minute

ThorstenHirsch
22.10.16, 21:19
Na, was machen denn die 5-6 Prozesse? Vielleicht versuchen sie ja die 329726ste Stelle von Pi zu berechnen. Mit der CPU-Limitierung zögerst Du das nur unnötig hinaus. Oder reagiert der Server dann nicht mehr auf Deine Eingaben? Dann könntest Du die Java-Anwendung im Scheduler niedriger priorisieren mit nice. Dann ziehen sie sich zwar noch genau so viel CPU, aber eben nur dann, wenn Du der CPU nicht etwas besseres zu tun gibst.

Benny
23.10.16, 00:41
Sobald 2-3 Prozesse Starten/Neustaren ist der CPU (Xeon E3-1246v3) auf 100% Auslastung und die anderen Anwendungen beginnen zu laggen, deswegen möchte ich diese begrenzen, sodass sie ein Limit haben.

florian0285
23.10.16, 10:45
sagt er doch... nice...

https://wiki.ubuntuusers.de/nice/

xbeduine
23.10.16, 17:56
Interessanter wäre, weshalb deine Java-App so viel CPU benötigt. Normalerweise ist es ein Anzeichen dafür, dass sich die Applikation nur noch im GC befindet. Da würde dann einfach das erhöhen der Memory-Optionen helfen. Alles andere ist Symptombekämpfung ;)

Ansonsten kann mit CGroups limitiert werden. (https://en.wikipedia.org/wiki/Cgroups)

marce
23.10.16, 18:57
... oder einen anderen GC wählen. Oder dafür sorgen, daß weniger Prozesse laufen. Oder dafür sorgen, daß diese ggf. nicht so viele Threads aufmachen.

Wir können auch noch viel mehr raten - in beiderlei Wort Bedutung. Oder Du lieferst einfach mal mehr Fakten.

fork
23.10.16, 18:58
Ja. Ursachenanalyse würde ich auch empfehlen. Logfiles, Google.

Wenn's was professionelles(Hört sich jetzt eher nach der Liga "Privates Minecraft" an) ist, vielleicht auch mal ein mindestens bisschen Java-Performance-Monitoring.

florian0285
23.10.16, 19:00
Mal ganz doof gefragt: WTF GC? Meint ihr den Garbage Collector?

marce
23.10.16, 19:04
Vermutlich ist es aber eh nichts interessantes, sondern nur Minecraft auf einer viel zu kleinen VServer-Instanz bei einem fast-für-lau-Hoster, wo man das Verhalten der VM eh nicht sauber vorhersagen und beeinfussen kann.


Mal ganz doof gefragt: WTF GC? Meint ihr den Garbage Collector?
Jepp.

xbeduine
23.10.16, 19:05
Mal ganz doof gefragt: WTF GC? Meint ihr den Garbage Collector?

Ja - und damit kann man bei Java so ziemlich viel falsch machen ;)

marce
23.10.16, 19:07
Ja - und damit kann man bei Java so ziemlich viel falsch machen ;)
oder die Performance und Latenz seiner Anwendung optimieren / verbessern / geschmeidiger machen.

Benny
26.10.16, 17:18
Fast, es sind Verwaltungsbots auf 4 Dedicated Servern bei OVH

marce
26.10.16, 20:06
wenn Du es ernsthaft erforschen willst wirst Du um ded. Monitoring, Debugging und anderes nicht herum kommen. Alternativ auch gerne hier mehr Infos posten.

Vom Grundkonzept her "regelmäßiges Starten von Java-Prozessen" sehe ich da allerdings schon ein Designproblem - gerade beim direkten Start haben Java-Apps einen recht hohen Overhead.

Nice dürfte Dir evtl. das Start-Problem beseitigen, dummerweise bremst Du damit aber dann auch den Rest der Applikation für die Zeit nach dem Start aus...

fork
26.10.16, 20:24
Es gibt einen guten Java-Fix, den man auch mehrfach anwenden kann, der eigentlich immer hilft: Erhöhe den zugewiesenen Arbeitsspeicher der Java-Anwendung(natürlich nicht über ein gewissen Prozentsatz des physikalisch verfügbaren Arbeitsspeichers hinaus. Würde sagen nicht mehr als 70%, Das System braucht ja selbst auch noch was für Anwendungsprogramme und Festplattencache).

Wenn Du mal diesen Befehl aufrufst:



ps ax | grep jav[a]


Dann siehst Du in den Kommandozeilenoptionen des Prozesses wahrscheinlich diese Schalter:


-Xmx####
-Xms####
-XX:PermSize=####
-XX:MaxPermSize=####


Das sind wichtige Speichereinstellungen vor allem die ersteren beiden. Die Rauten stehen für die Werte. Z. B. 512M oder 2G. Die kannst Du in den Startscripten oder der Tomcat-Konfiguration mal etwas nach oben drehen, wenn Du noch genug RAM frei hast.

Wieviel RAM hat denn dein System und wie sind die genannten Werte jetzt eingestellt?

marce
26.10.16, 20:39
nur bringt das leider recht wenig beim direkten Start der Anwendung - da ist, je nach System / Art / ... erst mal der Compiler damit beschäftigt, ByteCode in irgendwas brauchbares zu verwandeln.

Wie bereits gesagt: mehrfach Porzesse starten und das auch andauernd klingt schon nach einem grundlegenden Designproblem in der Anwendung. Derlei Dinge startet man normalerweise 1x und die Anwendung macht dann selbst ihr Task-Management + Scheduling. Es fehlen aber auch einfach noch zu viele Fakten, um das ernsthaft beurteilen zu können.

Benny
26.10.16, 21:42
Das Ding, ist nach dem Start laufen alle Prozesse mit 4%-5% CPU nur das laden der ganzen (z.B der GUI) kostet die 1 Minute so viel. Ich habe es ja mit einem Prozess hinbekommen indem ich ihn wir gesagt mit "cpulimit" limitiert habe und das stellt auch kein Problem auf, dass "cpulimit" nur immer einen Prozess erkennt und limitiert.
(Danke nochmals für die zahlreichen Antworten)

fork
26.10.16, 22:10
nur bringt das(Speicher erhöhen) leider recht wenig beim direkten Start der Anwendung - da ist, je nach System / Art / ... erst mal der Compiler damit beschäftigt, ByteCode in irgendwas brauchbares zu verwandeln.

Völlig korrekt.

---

Naja, wenn's schee macht: So geht das mit mehreren Prozessen:



pgrep -f java | xargs -IMYPID cpulimit --background --limit=10 --pid=MYPID

marce
26.10.16, 22:22
Das Ding, ist nach dem Start laufen alle Prozesse mit 4%-5% CPU nur das laden der ganzen (z.B der GUI) kostet die 1 Minute so viel. Ich habe es ja mit einem Prozess hinbekommen indem ich ihn wir gesagt mit "cpulimit" limitiert habe und das stellt auch kein Problem auf, dass "cpulimit" nur immer einen Prozess erkennt und limitiert.
(Danke nochmals für die zahlreichen Antworten)

Ok, jetzt wird's völlig mysthisch. Server. GUI. oft viele Prozesse paralllel starten, dann laufen lassen und dann das ganze nochmals?

Das "System" ist komplett daneben. Broken by Design.

Ich würde da gerne ein wenig Licht im Dunkeln haben, ansonsten sehe ich in dem kompletten Konstrukt keinerlei Sinn.

fork
26.10.16, 23:02
Hmm. Dann doch wieder die Kuh Elsa.

nopes
27.10.16, 09:53
Und hier noch die Aufklärung zur Kuh :D - https://de.wikipedia.org/wiki/Die_Kuh_Elsa

[edit]yt: https://www.youtube.com/watch?v=lI1C_q8QOVU

marce
27.10.16, 10:15
Schade. Ich hatte auf youtube gehofft.

Das war dann halt Pech. Für die Kuh.