PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hohe Speicherauslastung bei Jakarta-Tomcat



anquijix
11.10.05, 18:05
Hi zusammen

Hardware: Compaq ProLiant irgendwas mit Intel Xeon 2.4Ghz 1GB Memory, 80GB HDD
Ich bin gerade an einem FC4 Webserver mit httpd, tomcat und mysql (neuste versionen)
Dieser Server soll den alten Server ersetzen. Darauf werden etwa 14 Websites gehostet. Mir ist nun aufgefallen, dass die Speicherauslastung enorm hoch ist, wenn ich JSP-Seiten lade. Während des Ladens dieser Seiten verbraucht der java-Prozess einen grossen Teil der CPU, und eben vor allem der Speicher wird ziemlich "zugemüllt". Sind alle Seiten geladen, hat der Server ca 700MB Speicher verbraucht und den SWAP-Bereich angebraucht.

Ist das normal? Das würde heissen, je mehr Clients auf den Server verbinden, desto schneller kackt mir der Server ab wegen vollem Speicher. Ein weiterer Schluss darauf wäre, es geht nicht mehr lange und ich kann keine neuen Websites mehr darauf hosten.

Oder gibts da eine Möglichkeit, die Speicherauslastung zu optimieren? Kann ja nicht sein, dass für eine Website soviel Speicher aufgebraucht wird.

Auf meinem Test-Rechner, der Hardwaremässig Müll ist verglichen mit dem Server, waren beim Laden der ersten Seite schon ca 380MB von 512MB Speicher verbraucht. Wegen einer Seite??

Hab schon gelesen, dass Linux versucht, den Speicher voll auszulasten, anders als bei Windoze, aber gerade so finde ich schon krass.

Eure Meinung?

mamue
11.10.05, 18:59
Deine Schilderungen sind interessant, aber etwas nebulös.
Könntest Du mal die Ausgabe von "top" posten?

mamue

anquijix
12.10.05, 11:42
Ok.. ich muss vielleicht noch erwähnen, dass dieser Server in einem 2-node Cluster ist. Zusätzlich laufen noch Heartbeat für den Cluster und DRBD für die Datenspiegelung übers Netzwerk. Daher werden sämtliche Webdienste von Heartbeat gestartet auf einem Host. Der andere ist lediglich Backup-Host (gleiche Hardware, gleiche Leistung).

Nach dem Start des Systems sieht top so aus (auf beiden Servern ähnlich):


top - 10:56:27 up 2 min, 10 users, load average: 0.28, 0.18, 0.07
Tasks: 85 total, 1 running, 84 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 0.0% sy, 0.0% ni, 99.7% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 1034524k total, 113860k used, 920664k free, 8240k buffers
Swap: 2096440k total, 0k used, 2096440k free, 56240k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2089 root 15 0 19692 9300 2516 S 0.7 0.9 0:01.61 X
2478 root 16 0 2024 1012 788 R 0.3 0.1 0:00.16 top
1 root 16 0 1748 572 492 S 0.0 0.1 0:00.87 init
2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/1
5 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
6 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/0
7 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/1
8 root 17 -5 0 0 0 S 0.0 0.0 0:00.01 khelper
9 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kthread
12 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid
99 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
100 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kblockd/1
103 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd
153 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
154 root 15 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
156 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 aio/0
157 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 aio/1
155 root 17 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
243 root 15 0 0 0 0 S 0.0 0.0 0:00.23 kseriod
408 root 15 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
852 root 13 -4 1636 544 468 S 0.0 0.1 0:00.19 udevd
971 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kauditd
1086 root 19 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1087 root 19 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1088 root 19 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1089 root 15 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1090 root 15 0 0 0 0 S 0.0 0.0 0:00.03 kjournald
1428 root 16 0 1616 616 528 S 0.0 0.1 0:00.07 syslogd
1430 root 16 0 1568 500 436 S 0.0 0.0 0:00.01 klogd
1440 rpc 19 0 1704 588 504 S 0.0 0.1 0:00.00 portmap
1454 root 13 -3 11932 712 572 S 0.0 0.1 0:00.01 auditd
1482 root 16 0 4384 1040 868 S 0.0 0.1 0:00.00 rpc.idmapd
1615 root 16 0 1800 752 636 S 0.0 0.1 0:00.00 automount
1653 root 16 0 1796 748 628 S 0.0 0.1 0:00.00 automount
1665 root 16 0 2740 572 488 S 0.0 0.1 0:00.00 nifd
1701 nobody 18 0 13436 1064 636 S 0.0 0.1 0:00.00 mDNSResponder
1710 root 16 0 1560 592 524 S 0.0 0.1 0:00.00 acpid
1718 root 16 0 4396 1724 1416 S 0.0 0.2 0:00.01 sshd
1737 ntp 16 0 4040 4040 3044 S 0.0 0.4 0:00.14 ntpd
1754 root 16 0 7944 3076 2084 S 0.0 0.3 0:00.00 sendmail
1760 smmsp 19 0 6968 2664 1820 S 0.0 0.3 0:00.00 sendmail
1769 root 15 0 1772 560 492 S 0.0 0.1 0:00.00 gpm
1777 root 16 0 4792 1136 736 S 0.0 0.1 0:00.00 crond
1798 xfs 16 0 3360 1652 868 S 0.0 0.2 0:00.01 xfs

Nach dem Start von DRBD und Heartbeat mit den Diensten sieht es so aus:


top - 11:04:31 up 10 min, 10 users, load average: 0.19, 0.15, 0.08
Tasks: 116 total, 1 running, 115 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.5% us, 0.2% sy, 0.0% ni, 99.3% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 1034524k total, 283708k used, 750816k free, 12824k buffers
Swap: 2096440k total, 0k used, 2096440k free, 111976k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3726 tomcat 16 0 421m 67m 4764 S 1.3 6.7 0:20.00 java
2089 root 15 0 19692 9300 2516 S 0.3 0.9 0:03.91 X
2478 root 16 0 2024 1032 788 R 0.3 0.1 0:01.18 top
1 root 16 0 1748 572 492 S 0.0 0.1 0:00.87 init
2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
5 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
6 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/0
7 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/1
8 root 10 -5 0 0 0 S 0.0 0.0 0:00.01 khelper
9 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 kthread
12 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid
99 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
100 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kblockd/1
103 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd
153 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
154 root 15 0 0 0 0 S 0.0 0.0 0:00.01 pdflush
156 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 aio/0
157 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 aio/1
155 root 17 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
243 root 15 0 0 0 0 S 0.0 0.0 0:00.23 kseriod
408 root 15 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
852 root 12 -4 1636 544 468 S 0.0 0.1 0:00.19 udevd
971 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kauditd
1086 root 19 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1087 root 19 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1088 root 19 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1089 root 15 0 0 0 0 S 0.0 0.0 0:00.00 kjournald
1090 root 15 0 0 0 0 S 0.0 0.0 0:00.09 kjournald
1428 root 16 0 1616 616 528 S 0.0 0.1 0:00.13 syslogd
1430 root 15 0 1568 500 436 S 0.0 0.0 0:00.01 klogd
1440 rpc 19 0 1704 588 504 S 0.0 0.1 0:00.00 portmap
1454 root 13 -3 11932 712 572 S 0.0 0.1 0:00.01 auditd
1482 root 16 0 4384 1040 868 S 0.0 0.1 0:00.00 rpc.idmapd
1615 root 16 0 1800 752 636 S 0.0 0.1 0:00.00 automount
1653 root 16 0 1796 748 628 S 0.0 0.1 0:00.02 automount
1665 root 16 0 2740 572 488 S 0.0 0.1 0:00.00 nifd
1701 nobody 18 0 13436 1064 636 S 0.0 0.1 0:00.00 mDNSResponder
1710 root 16 0 1560 592 524 S 0.0 0.1 0:00.00 acpid
1718 root 16 0 4396 1724 1416 S 0.0 0.2 0:00.01 sshd
1737 ntp 16 0 4040 4040 3044 S 0.0 0.4 0:00.15 ntpd
1754 root 16 0 7944 3076 2084 S 0.0 0.3 0:00.00 sendmail
1760 smmsp 19 0 6968 2664 1820 S 0.0 0.3 0:00.00 sendmail
1769 root 15 0 1772 560 492 S 0.0 0.1 0:00.00 gpm
1798 xfs 16 0 3360 1652 868 S 0.0 0.2 0:00.01 xfs

Nun ist mehr Memory verbraucht, aber immer noch normal, mal schauen wies aussieht, wenn ich sämtliche vorhandenen Websites öffne:

Lustig, hat sich kaum was verändert.. Nur etwa 100MB mehr Memory verbraucht. Kann sein, dass dies am Neustart liegt. Langsam glaube ich, das ist normal. Auf dem alten Server (FC2) mit halber Hardware-Leistung, der jetzt schon ne Ewigkeit ohne Neustart läuft, ist der gesamte Speicher (512MB) verbraucht und auch schon ein Grossteil des SWAP-Bereichs. Daraus ist zu schliessen, je länger der Server läuft und Zugriffe zu verschreiben hat, desto mehr Memory wird verbraucht sein. Irgendwann ist es an der Zeit, den Server oder die Dienste neu zu starten, um Speicher freizumachen.
Auf alle Fälle ist es abartig, was java an Ressourcen verbraucht.

mamue
12.10.05, 12:57
So wie ich das in Erinnerung habe, lässt sich der reale Speicherverbrauch einigermassen mit top bestimmen, wenn man mit "f" und "s" DATA hinzufügt. Das Feld Data zeigt ungefähr den derzeit belegten Hauptspeicher eines Prozesses an. Mit "F"-> "s" kann man nach dieser Größe sortieren lassen. Bei mir sieht das so aus:


Mem: 1024480k total, 863392k used, 161088k free, 36k buffers
Swap: 1044216k total, 291220k used, 752996k free, 427680k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ DATA COMMAND
23913 ldap 18 0 234m 44m 38m S 0.0 4.5 0:00.03 194m slapd
5789 tomcat 25 0 238m 12m 50m S 0.0 1.2 0:03.57 187m java
7286 zope 16 0 191m 42m 77m S 0.0 4.2 0:54.33 114m python
18076 root 16 0 199m 17m 130m S 0.0 1.7 2:05.36 68m asterisk
4947 named 18 0 53296 3276 23m S 0.0 0.3 0:00.00 27m named
24777 wwwrun 16 0 85184 3932 72m S 0.0 0.4 0:01.21 10m httpd2-prefork
8603 wwwrun 16 0 85164 4304 72m S 0.0 0.4 0:00.26 10m httpd2-prefork
24775 wwwrun 15 0 84880 4220 72m S 0.0 0.4 0:00.41 9m httpd2-prefork
5678 root 15 0 35152 4880 25m S 0.0 0.5 5:08.80 9208 cupsd

Mein tomcat wird aber auch kaum benutzt, es sind wohl selten mehr als 1 gleichzeitiger Benutzer. Das sieht bei Dir wohl deshalb anders aus, weil wahrscheinlich kaum Dateien gecached werden müssen (hier:Fileserver) und auch Java nimmt sich AFAIK gerne viel Speicher, auch wenn der nicht unbedingt nötig ist. Vielleicht sollte das Servlet mal regelmässig den garbage collector anschmeissen?

HTH
mamue

anquijix
12.10.05, 13:01
Ich bin ehrlich gesagt gar nicht so Tomcat-versiert.. Meine Aufgabe besteht vor allem darin, den Server hoch verfügbar zu machen. Weiss jetzt nicht gerade, was du mit garbage collector meinst.

steve-bracket
12.10.05, 13:19
hi

korrigiert mich, aber die freigabe von zugewiesenem speicher der nicht mehr benötigt wird sollte doch durch "gb" automatisch erfolgen.

lg
steve

temir
12.10.05, 15:41
Generell sollte Apache dem tomcat vorgespannt werden - besseres Loadbalancing und Performance

1) Da der Tomcat nur mit Java läuft -> sollte an sich vielleicht zuerst die JAVA_OPTS ansehen, bzw. festlegen

2) die Servlets werden beim ersten Zugriff compiled und dann auf timestamp überwacht -> Entwicklermodus abschalten (timestamp - check) +
die Servlets können mit Ant vorkompiliert und die daraus entstandene Klassen auf Servlets gemappt werden - wenn die Seiten eine Zeit lang bei
einer Version bleiben, - spart unheimlich Speicher und CPU.

Es gibt bestimmt noch ein paar andere Möglichkeiten. Für Details empfiehlt sich, Google zu bemühen.