Java-Anwendung mit schlechter Leistung im Vergleich zu Server mit schlechter Leistung

7

Dies ist eine sehr allgemeine Frage, die für mich jedoch immer häufiger auftaucht. Ich würde gerne versuchen, eine geeignete Vorgehensweise für diesen generischen Fall zu finden, da ich denke, dass dies für mich und andere Systemadministratoren in Zukunft von Nutzen sein könnte. Die Gemeinsamkeit in allen Fällen ist jedoch Java. Der Grund, warum ich diese Frage hier stelle und nicht den Stapelüberlauf, ist, dass dies eine Systemadministratorfrage ist. Ich denke, dass es hier sehr angemessen ist.

Ein Benutzer kommt auf mich zu und sagt: "Meine Anwendung ist sehr langsam. Der Server, den Sie mir gegeben haben, weist eine schlechte Leistung auf." Dieser Server kann Bare Metal, OpenVZ oder KVM sein. In allen Fällen ist das Betriebssystem CentOS 6. Wenn der Benutzer mir dies mitteilt, bezieht er sich auf die Seitenladezeit (JIRA) oder die Benchmark-Nummern. (Selen oder proprietäre App)

Jetzt habe ich den Verdacht, dass der Server selbst in Ordnung ist. Ich sshgehe auf den Server und stelle fest, dass die Last geringer als 1 ist. Die Speichernutzung ist ebenfalls in Ordnung und reicht von 2 bis 20 GB RAM-frei. Schließlich überprüfe ich iowaitmit vmstatund stelle fest, dass es 0 ist. Die CPU im Leerlauf ist 99.

Wenn topich Java mit betrachte , kann ich sehen, dass der CPU-Prozentsatz für diesen Prozess ungefähr 200% beträgt. Dies gilt für Systeme mit 4 bis 24 Kernen.

openvzUnterscheidet sich die Prozessorzuordnung natürlich von KVM oder Bare Metal.) In den Fällen, in denen dies bei einem openvzoder einem kvmGast auftritt , hüpfe ich auch auf den Host und sehe ähnliche Dinge. Der CPU-Leerlauf beträgt 99%. iowait ist 0. Speicher ist manchmal Hunderte von Gigs frei.

Ich habe mir diese Java-Prozesse und -Threads mit straceund angesehen strace -f. Es gibt Tonnen von Futex, Uhr und epoll. Wenn ich diese rückgängig mache, habe ich meistens ioctl, stat, sendto.

Anwendungen, bei denen dies geschehen ist: Selenium-, JIRA- und andere proprietäre Java-Anwendungen. Immer Java.

Ich habe überlegt, die Qualität der Java-Prozesse zu optimieren, aber die AFAIK-Qualität wirkt sich nur auf die Planung der Prozesse aus. Wenn die Last niedrig ist, hilft es nicht, die Dinge zu beschleunigen.

Manchmal verwendet die Anwendung MySQL, aber wenn Sie sich MySQL oben ansehen, wird dort fast keine CPU-Auslastung angezeigt. Ich vermute, wenn das der Engpass wäre, würden wir eine höhere CPU-Auslastung sehen.

Fazit: Wie beweise ich dem Benutzer, dass der Server einwandfrei funktioniert, die Anwendung jedoch nicht funktioniert? Theoretisch könnte die Anwendung langsam sein, da sie auf eine while-Schleife gestoßen ist, die niemals beendet wird. Was mich glauben lässt, dass diese Aufgabe unmöglich ist, analog zur Lösung des Halteproblems. o_O Aber vielleicht kann ich Java so einstellen, dass es sich ein bisschen besser verhält, oder vielleicht gibt es eine Möglichkeit, die laufende Anwendung zu profilieren, auf einen Codeabschnitt zu zeigen und "Da ist Ihr Problem" zu sagen.

Katzenhose
quelle

Antworten:

7

Sherlock!

Sobald Sie das Unmögliche beseitigt haben, muss alles, was noch so unwahrscheinlich ist, die Wahrheit sein. --Arthur Conan Doyle

Vielleicht möchten Sie zuerst diesen Vortrag lesen, in dem es um die Ursachen von Leistungsproblemen und deren Diagnose geht. Es vergleicht Linux mit SmartOS, das vom Punkt Ihres Beitrags getrennt ist, hilft aber auch dabei, herauszufinden, woher Leistungsprobleme stammen.

Wenn Sie Leistungsprobleme mit Software debuggen, sollten Sie normalerweise versuchen, genau dieselbe Softwarekonfiguration auf einem separaten physischen Computer mit derselben Java-Version, demselben Kernel, demselben Benutzerland usw. zu replizieren. Wenn das Leistungsproblem nicht besteht Dann können Sie sich mit physischer Hardware, Hypervisor / Container-Schicht oder Installationsproblemen auf Ihrer Box befassen.

Wenn der Benutzer diese Software noch nie in dieser bestimmten Betriebssystem- / Versionskonfiguration ausgeführt hat, kann er nicht sofort behaupten, dass es sich um Ihren Server handelt. Ich würde ihnen lieber die Beweislast auferlegen , um zu demonstrieren, dass sie mit CentOS 6 (mit derselben Nebenversion und demselben Hypervisor und demselben Host-Betriebssystem, wenn es nicht auf Bare-Metal läuft) eine bessere Leistung erzielen können.

Wenn die bessere Leistung darauf zurückzuführen ist, dass sie über viel bessere Systemspezifikationen verfügen (z. B. auf einem 1-GB-KVM auf einem Low-End-Prozessor in Ihrer Infrastruktur, aber auf einem eigenen 24-Kern-Ivy-Bridge-E5-System mit 8 PCIe-SSDs) Hardware RAID0, es ist 1000% schneller), dann können Sie anfangen, über physische Hardware zu sprechen. Wenn die physische Hardware identisch oder sehr, sehr ähnlich ist, können Sie über die Konfiguration des Betriebssystems / Hypervisors sprechen.

Sie können auch die Möglichkeit in Betracht ziehen, dass basierend auf der Leistung der Anwendung und der Anzahl der Benutzer sowie der Datenauslastung die dem Benutzer zugewiesene Hardware für die Aufgabe einfach nicht ausreicht. Wenn dies ein sehr wichtiger Kunde ist und es für Ihr Unternehmen von entscheidender Bedeutung ist, ihn bei Laune zu halten, können Sie versuchen, einige der Einschränkungen aufzuheben, die Sie möglicherweise für den virtuellen Container oder die VM-Instanz auferlegen. Geben Sie ihnen beispielsweise vorübergehend mehr RAM- oder CPU-Zeit, Netzwerkbandbreite usw. und prüfen Sie, ob dies hilfreich ist. In diesem Fall müssen Sie dem Benutzer möglicherweise mitteilen, dass er für eine größere VM bezahlen muss, um die gewünschte Leistung für diese Workload zu erzielen.


Dem Brand entkommen (wenn es nicht dein Problem ist)

Wenn sich der Benutzer aus irgendeinem Grund weigert, dieselbe Softwarekonfiguration auf separater Hardware zu testen, müssen Sie entweder auf die Behebung des Leistungsproblems in der Anwendung zurückgreifen (was unter Linux schwierig bis unmöglich sein kann, wie Brendan Gregg beschreibt) in seinem Vortrag (manchmal müssen Sie möglicherweise nur diese Leistungskosten "tragen") oder einfach darauf bestehen, dass der Benutzer falsch ist. Dies ist ein unglücklicher Nebeneffekt bei der Unterstützung von Entwicklern auf Ihren Systemen.

An diesem Punkt müssen Sie sich möglicherweise fragen, wie Ihre Geschäftsbeziehung zu Ihren Benutzern aussieht (falls vorhanden). Wenn Sie nicht verwaltetes Hosting im privaten Sektor bereitstellen , müssen Sie möglicherweise darauf bestehen, dass Sie nicht für die Sicherstellung der Leistung des Benutzercodes verantwortlich sind.

Wenn Sie Managed Hosting bereitstellen oder anderweitig zugestimmt haben, den Software-Mitarbeitern bei ihren Problemen zu helfen, unabhängig davon, ob das Problem ihre Schuld ist, müssen Sie möglicherweise die Ärmel hochkrempeln, sich die Hände schmutzig machen und ein komplexeres Leistungsprofil erstellen Tools, um festzustellen, ob Sie ein tatsächliches Problem erkennen können. Ist es nur ein wirklich gesprächiges Protokoll, das einen Netzwerk-Socket blockiert? Ist es Speicher I / O-gebunden? Oder ist im BIOS VT-x möglicherweise nicht aktiviert? Es gibt viel zu viele Möglichkeiten, um sie überhaupt aufzulisten.

Um diesen Abschnitt zusammenzufassen: Wenn Sie einen geschäftlichen oder politischen Grund finden, sich dafür zu entschuldigen, dass Sie nicht für die Lösung dieses Problems verantwortlich sind, ist dies möglicherweise der einfachste und effizienteste Ausweg. Leider bedeutet dies auch, dass der Benutzer sein Problem möglicherweise nie behebt und möglicherweise andere Geschäftspartner als Alternative in Betracht zieht.


Fächern Sie die Flammen (wenn es Ihr Problem ist)

Da das allgemeine Thema "Java" zu sein scheint, können Sie zunächst feststellen, ob auf dem Java-Prozess selbst extrem langsamer Code ausgeführt wird. Idealerweise kann Ihnen der Entwickler / Benutzer / Kunde den Quellcode seines Java-Programms (und aller abhängigen Bibliotheken) zur Verfügung stellen.

Versuchen Sie, das Programm unter einem guten Profiler auszuführen . Es gibt freie und nicht freie Profiler; Ein Beispiel für eine kostenlose Version ist die, die mit NetBeans geliefert wird . Es kann eine Herausforderung sein, den Profiler dazu zu bringen, Ihre Anwendung erfolgreich zu starten und zu instrumentieren, je nachdem, was genau diese Anwendung ist, aber die Ergebnisse sind fast immer in irgendeiner Weise aussagekräftig.

Sie können natürlich auf die Verwendung htopund / oder iotopErkennung zurückgreifen, ob die Java-VM (oder das zugehörige RDBMS) eine übermäßige Menge an CPU-, Speicher-E / A- oder Festplatten-E / A-Vorgängen ausführt, die über die von Ihnen in Betracht gezogene Menge hinausgeht. " angemessen "(angesichts der Hardware und der Arbeitsbelastung). Dies sind extrem weitreichende Tools, die nicht immer das vollständige Bild vermitteln, da es manchmal bei Leistungsproblemen darum geht, was das Programm nicht tut, während es auf etwas anderes wartet, das nicht mit einem Ressourcenengpass zusammenhängen kann. Dies ist ungefähr so ​​allgemein wie ein Versuch, Ihr Auto zu starten, um festzustellen, ob der Motor richtig läuft oder nicht. Was machst du, wenn es nicht startet? Das'

Zuletzt werde ich nur wiederholen, was Brendan Gregg in seinem Vortrag gesagt hat, und DTrace erwähnen. Die volle Funktionalität von DTrace wurde unter Linux noch nicht repliziert, weder durch die Neuimplementierung von dtrace-on-Linux noch durch Konkurrenten wie SystemTap. Sie können jedoch versuchen , eines dieser Tools zu verwenden, um festzustellen, ob es hilfreich ist. Einige Einsichten können besser sein als keine .

Natürlich benötigen Sie spezielle Kenntnisse in der Verwendung dieser Werkzeuge vom Typ "Schweizer Taschenmesser". Sie werden den größten Teil dieses Fachwissens durch viel Erfahrung gewinnen (lesen Sie: Versuch und Irrtum und googeln). Es geht nicht nur darum, das Tool zu starten und sich auf das Problem hinweisen zu lassen. Sie müssen das Problem anhand der verfügbaren Daten beheben. Es ist nicht einfach. Leistung ist selten.

allquixotic
quelle