Bei einer Webanwendung treten große Leistungsprobleme auf, und wir versuchen, den Engpass zu finden. Ich bin kein Sysadmin, also gibt es einige Dinge, die ich nicht ganz verstehe. Einige grundlegende Untersuchungen haben ergeben, dass die CPU im Leerlauf ist, dass viel Arbeitsspeicher verfügbar ist, dass keine Auslagerungen, keine E / A-Vorgänge, aber eine hohe durchschnittliche Auslastung vorliegen.
Der Software-Stack auf diesem Server sieht folgendermaßen aus:
- Solaris 10
- Java 1.6
- WebLogic 10.3.5 (8 Domains)
Die auf diesem Server ausgeführten Anwendungen kommunizieren mit einer Oracle-Datenbank auf einem anderen Server.
Dieser Server hat 32 GB RAM und 10 CPUs (glaube ich).
Laufen prstat -Z
gibt so etwas:
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3836 ducm0101 2119M 2074M cpu348 58 0 8:41:56 0.5% java/225
24196 ducm0101 1974M 1910M sleep 59 0 4:04:33 0.4% java/209
6765 ducm0102 1580M 1513M cpu330 1 0 1:21:48 0.1% java/291
16922 ducm0102 2115M 1961M sleep 58 0 6:37:08 0.0% java/193
18048 root 3048K 2440K sleep 59 0 0:06:02 0.0% sa_comm/4
26619 ducm0101 2588M 2368M sleep 59 0 8:21:17 0.0% java/231
19904 ducm0104 1713M 1390M sleep 59 0 1:15:29 0.0% java/151
27809 ducm0102 1547M 1426M sleep 59 0 0:38:19 0.0% java/186
2409 root 15M 11M sleep 59 0 0:00:00 0.0% pkgserv/3
27204 root 58M 54M sleep 59 0 9:11:38 0.0% stat_daemon/1
27256 root 12M 8312K sleep 59 0 7:16:40 0.0% kux_vmstat/1
29367 root 297M 286M sleep 59 0 11:02:13 0.0% dsmc/2
22128 root 13M 6768K sleep 59 0 0:10:51 0.0% sendmail/1
22133 smmsp 13M 1144K sleep 59 0 0:01:22 0.0% sendmail/1
22003 root 5896K 240K sleep 59 0 0:00:01 0.0% automountd/2
22074 root 4776K 1992K sleep 59 0 0:00:19 0.0% sshd/1
22005 root 6184K 2728K sleep 59 0 0:00:31 0.0% automountd/2
27201 root 6248K 344K sleep 59 0 0:00:01 0.0% mount_stat/1
20964 root 2912K 160K sleep 59 0 0:00:01 0.0% ttymon/1
20947 root 1784K 864K sleep 59 0 0:02:22 0.0% utmpd/1
20900 root 3048K 608K sleep 59 0 0:00:03 0.0% ttymon/1
20979 root 77M 18M sleep 59 0 0:14:13 0.0% inetd/4
20849 daemon 2856K 864K sleep 59 0 0:00:03 0.0% lockd/2
17794 root 80M 1232K sleep 59 0 0:06:19 0.0% svc.startd/12
17645 root 3080K 728K sleep 59 0 0:00:12 0.0% init/1
17849 root 13M 6800K sleep 59 0 0:13:04 0.0% svc.configd/15
20213 root 84M 81M sleep 59 0 0:47:17 0.0% nscd/46
20871 root 2568K 600K sleep 59 0 0:00:04 0.0% sac/1
3683 ducm0101 1904K 1640K sleep 56 0 0:00:00 0.0% startWebLogic.s/1
23937 ducm0101 1904K 1640K sleep 59 0 0:00:00 0.0% startWebLogic.s/1
20766 daemon 5328K 1536K sleep 59 0 0:00:36 0.0% nfsmapid/3
20141 daemon 5968K 3520K sleep 59 0 0:01:14 0.0% kcfd/4
20093 ducm0101 2000K 376K sleep 59 0 0:00:01 0.0% pfksh/1
20797 daemon 3256K 240K sleep 59 0 0:00:01 0.0% statd/1
6181 root 4864K 2872K sleep 59 0 0:01:34 0.0% syslogd/17
7220 ducm0104 1268M 1101M sleep 59 0 0:36:35 0.0% java/138
27597 ducm0102 1904K 1640K sleep 59 0 0:00:00 0.0% startWebLogic.s/1
27867 root 37M 4568K sleep 59 0 0:13:56 0.0% kcawd/7
12685 ducm0101 4080K 208K sleep 59 0 0:00:01 0.0% vncconfig/1
ZONEID NPROC SWAP RSS MEMORY TIME CPU ZONE
42 135 22G 19G 59% 87:27:59 1.2% dsuniucm01
Total: 135 processes, 3167 lwps, load averages: 54.48, 62.50, 63.11
Ich verstehe, dass die CPU größtenteils im Leerlauf ist, aber der Lastdurchschnitt hoch ist, was für mich ziemlich seltsam ist. Das Gedächtnis scheint kein Problem zu sein.
Laufen vmstat 15
gibt so etwas:
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s4 sd in sy cs us sy id
0 0 0 32531400 105702272 317 1052 126 0 0 0 0 13 13 -0 8 9602 107680 10964 1 1 98
0 0 0 15053368 95930224 411 2323 0 0 0 0 0 0 0 0 0 23207 47679 29958 3 2 95
0 0 0 14498568 95801960 3072 3583 0 2 2 0 0 3 3 0 21 22648 66367 28587 4 4 92
0 0 0 14343008 95656752 3080 2857 0 0 0 0 0 3 3 0 18 22338 44374 29085 3 4 94
0 0 0 14646016 95485472 1726 3306 0 0 0 0 0 0 0 0 0 24702 47499 33034 3 3 94
Ich verstehe, dass die CPU größtenteils im Leerlauf ist, keine Prozesse in der Warteschlange warten, um ausgeführt zu werden, es findet wenig Austausch statt.
Laufen iostat 15
gibt dies:
tty sd0 sd1 sd4 ssd0 cpu
tin tout kps tps serv kps tps serv kps tps serv kps tps serv us sy wt id
0 676 324 13 8 322 13 8 0 0 0 159 8 0 1 1 0 98
1 1385 0 0 0 0 0 0 0 0 0 0 0 0 3 4 0 94
0 584 89 6 24 89 6 25 0 0 0 332 19 0 2 1 0 97
0 296 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 97
1 1290 43 5 24 43 5 22 0 0 0 297 20 1 3 3 0 94
Laufen netstat -i 15
ergibt folgendes:
input aggr26 output input (Total) output
packets errs packets errs colls packets errs packets errs colls
1500233798 0 1489316495 0 0 3608008314 0 3586173708 0 0
10646 0 10234 0 0 26206 0 25382 0 0
11227 0 10670 0 0 28562 0 27448 0 0
10353 0 9998 0 0 29117 0 28418 0 0
11443 0 12003 0 0 30385 0 31494 0 0
Was vermisse ich?
quelle
psrinfo -v
wird die tatsächliche Anzahl der CPUs angezeigt./
und die Last stieg19.00
ohne sichtbaren Grund immer weiter an. Durch das Freigeben von Speicherplatz wurde das Problem behoben (kurz nachdem es heruntergekommen war). kann aber auch ein zufall sein.Antworten:
Weitere Untersuchungen haben ergeben, dass das Leistungsproblem hauptsächlich auf eine hohe Anzahl von Netzwerkaufrufen zwischen zwei Systemen (Oracle SSXA und UCM) zurückzuführen ist. Die Aufrufe sind schnell, aber zahlreich und serialisiert, daher die geringe CPU-Auslastung (meistens Wartezeiten auf E / A), der hohe Lastdurchschnitt (viele Anrufe warten auf ihre Verarbeitung) und insbesondere die langen Antwortzeiten (durch Ansammlung kleiner Antwortzeiten).
Vielen Dank für Ihren Einblick in dieses Problem!
quelle
Wenn Sie "High Load Average" sagen, meinen Sie, dass "prstat" für "load average" am unteren Rand der Ausgabezahlen von steht
Diese Zahlen ähneln den oben angegebenen und bedeuten wahrscheinlich die durchschnittliche Warteschlangengröße des laufenden Prozesses. Dies ist nicht der Prozentsatz der verwendeten Prozessorzeit, sondern wie viele Dinge die CPU für die Ausführung belasten. Zugegeben, diese sehen ziemlich hoch aus, aber das hängt alles von der App ab, die Sie ausführen. Die Prozesse tun möglicherweise nicht viel, wenn sie erst einmal ihren Platz erreicht haben. Sehen Sie hier für eine schöne Erklärung in Bezug auf die Oberseite.
Ich bin mit WebLogic nicht vertraut, aber ich habe festgestellt, dass mit Apache Tomcat im Allgemeinen viele Java-Threads gleichzeitig für scheinbar nicht viele Anforderungen erzeugt werden können. Dies könnte die Ursache für die hohen durchschnittlichen Ladezahlen sein. Stellen Sie sicher, dass Sie das Verbindungspooling verwenden, um eine Verbindung zum Backend herzustellen, und erhöhen Sie gegebenenfalls die Anzahl der inaktiven Threads, die für Ihre App verfügbar sind, um Verbindungen zu verarbeiten (Sie sind sich nicht sicher, wie Sie dies in WebLogic tun; Tomcat verfügt über einen Threadpool pro Connector oder einen allgemeinen Executor-Thread-Pool). Wenn Sie dies nicht tun, werden möglicherweise brandneue Threads erzeugt, um Anforderungen zu verarbeiten.
In Bezug auf die Leistung müssen Sie genau festlegen, unter welchem Aspekt Ihre App leidet. Ist es die Verarbeitung, die auf der WebLogic / Java-Seite stattfindet, der Datenbankzugriff, DNS-Lookups (wenn sie aus irgendeinem Grund durchgeführt werden ...), Netzwerkprobleme oder etwas auf dem Betriebssystem.
In 99% der Fälle handelt es sich um Ihren Code und darum, wie er mit der Datenbank kommuniziert, die die Dinge auf Trab hält. Dann erfolgt die Konfiguration der Web-App. Ab diesem Zeitpunkt werden Sie daran arbeiten, die letzten Millisekunden aus Ihrer App herauszuholen oder eine höhere Parallelität mit derselben Hardware zu erzielen. Für diese feinkörnigere Leistungsoptimierung benötigen Sie Metriken.
Für Java würde ich vorschlagen, Java Melody zu installieren . Es kann viele Informationen zu den Aktivitäten Ihres Programms liefern und dabei helfen, die Zeitspanne einzugrenzen. Ich habe es nur mit Tomcat verwendet, sollte aber mit jedem Java EE-Container / Servlet-Ding funktionieren.
Es gibt eine Reihe von Möglichkeiten, wie Sie Java optimieren können. Sehen Sie sich also die Leistungsrichtlinien an (ich bin sicher, dass Sie dies wahrscheinlich getan haben) und stellen Sie sicher, dass Sie die richtige Heap-Größe usw. für Ihr Programm einstellen. Mit Java Melody können Sie die Größe des von Ihnen verbrauchten Java-Heaps sowie die Arbeitsbelastung des Garbage Collectors und die Häufigkeit von Programmunterbrechungen beim Löschen von Objekten ermitteln.
Ich hoffe das hat geholfen. Wenn Sie weitere Informationen zur Verfügung stellen, kann ich diese Antwort möglicherweise aktualisieren und an Ihren Bedürfnissen ausrichten.
quelle
Als Randnotiz beinhaltet Load Average auch Dinge, die auf Festplattenaktivität warten (dh die Festplatte belästigen), sowie Dinge, die auf CPU warten. Es ist eine Summe aus beidem.
Siehe http://en.wikipedia.org/wiki/Load_(computing) "Linux enthält auch [im Lastdurchschnitt] Prozesse in unterbrechungsfreien Ruhezuständen (normalerweise warten auf Festplattenaktivität)"
Nebenbei bemerkt, das besondere Problem, auf das ich gestoßen bin, war, dass ich einen hohen durchschnittlichen Auslastungsgrad hatte, aber auch viel CPU-Leerlauf und wenig Festplattenverbrauch.
Es scheint , dass, zumindest in meinem Fall, manchmal Fäden / Prozesse warten auf I / O im Last Durchschnitt zeigen, aber nicht eine Erhöhung der „erwartet“ Spalte verursachen. Aber sie sind immer noch I / O-gebunden.
Sie können feststellen, dass dies beim folgenden Code der Fall ist, wenn Sie ihn in jruby ausführen (führt nur 100 Threads mit jeweils viel E / A aus):
Was eine Top-Ausgabe wie folgt ergibt:
Sie können also sehen, dass es viel CPU im Leerlauf hat, 0,0% wa, aber einen sehr hohen Lastdurchschnitt.
iostat zeigt die Festplatte auf ähnliche Weise als im Leerlauf befindlich an:
Siehe auch http://linuxgazette.net/141/misc/lg/tracking_load_average_issues.html
Als weitere Randnotiz scheint dies auch zu implizieren, dass (zumindest in diesem Fall unter CentOS) der Lastdurchschnitt jeden Thread separat in die Summe einbezieht.
quelle
Hatte heute das gleiche Problem. Nach einigen Nachforschungen und Diagnosen stellte ich fest, dass auf meinem kleinen VPS die Festplatte ausgeht .
In der Shell / Eingabeaufforderung (Linux / Unix) eingeben
um die Festplatte auf Ihrem Computer frei zu sehen . Wenn Ihnen die Festplatte ausgeht, kann dies das Problem sein.
quelle
Ein weiteres nützliches Werkzeug, das in dieser Situation helfen wird, ist nmon.
Es bietet eine Vielzahl von Möglichkeiten, um dieselben Daten, die von den anderen Tools angezeigt werden, in einem kleinen Paket anzuzeigen.
Wenn dies Inhalte sind, die nicht zwischengespeichert werden können, würde ich empfehlen, mehrere Server hinter einem Load Balancer wie Haproxy im TCP-Modus zu platzieren, um die Last zu verteilen.
quelle
Einige Solaris-spezifische Tools, die nicht erwähnt wurden und für das Debuggen solcher Probleme nützlich sind, sind "intrstat", "mpstat" und "lockstat". Nachdem mpstat auf einem Host mit einigen schweren ETL-Ladevorgängen ein ähnliches Problem aufgetreten war, wurde eine große Anzahl von Interrupts festgestellt, die sich mit vielen E / A-Vorgängen befassten und auf dieses Problem hinwiesen.
Zu der Zeit sahen wir auf einem T4-4 mit mpstat, dass vcpus mehr als 30000 Interrupts über einen kurzen Überwachungszyklus übergab, woraufhin die Leistung zu leiden begann. In diesem Fall bestand die einzige Problemumgehung darin, mehr CPU darauf zu werfen. Anschließend wurde jedoch daran gearbeitet, den Code zu verbessern.
Brendan Gregg hat viel über Performance geschrieben, insbesondere über I / O im Laufe der Jahre, und ist eine Suche wert, wenn Sie mehr herausfinden möchten.
quelle