extrem hoher load und etliche Zombies?!

Ponchotobi

New Member
Moin,
seit gut 4 Stunden spackt mein Server rum. (Debian 4 etch, 1 GB Ram, Athlon 64 x2 3200).
Ich habe vorher nichts geändert nur als dann der Load auf 60(!) war, habe ich die apache2 config dahingehend eingestellt, dass der Server nun wenigsten mit Load von 20 online bleibt...

Die CPU Last ist sehr hoch (>60%) und ich habe teilweise bis zu 30 Zombies. Die werden zwar immer gekillt, aber es kommen sekündlich neue dazu.
Ausgelastet ist der Server absolut nicht, hier mal Auszug aus top:

Code:
top - 20:22:33 up  5:22,  1 user,  load average: 17.14, 18.00, 15.93
Tasks: 121 total,  12 running, 101 sleeping,   0 stopped,   8 zombie
Cpu(s): 62.1%us, 36.4%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  1.5%si,  0.0%st
Mem:   1011496k total,   717988k used,   293508k free,    56772k buffers
Swap:   999992k total,    74856k used,   925136k free,   277224k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1893 mysql     15   0  165m  28m 3352 S  146  2.9 306:06.25 mysqld
 4010 www-data  16   0  286m  66m 6992 R   14  6.8   0:01.57 apache2
 4016 www-data  15   0  278m  63m 6928 S   14  6.4   0:00.51 apache2
 4051 www-data  15   0  286m  66m 6408 R    5  6.7   0:00.15 apache2
 3958 www-data  15   0  278m  63m 6940 S    4  6.4   0:01.06 apache2
 4011 www-data  18   0  286m  66m 6916 R    4  6.8   0:00.25 apache2
 4031 www-data  15   0  286m  66m 6364 S    4  6.7   0:00.20 apache2
 4034 www-data  15   0     0    0    0 Z    3  0.0   0:00.58 apache2 <defunct>
 4054 www-data  15   0     0    0    0 Z    3  0.0   0:00.08 apache2 <defunct>
 4015 www-data  15   0     0    0    0 Z    1  0.0   0:00.69 apache2 <defunct>
 3970 www-data  15   0     0    0    0 Z    1  0.0   0:00.12 apache2 <defunct>
 3291 root      15   0 10732 1360  956 R    0  0.1   0:00.23 top

Die meisten Zombies werden durch apache2 verursacht und ich weiß nicht warum. Die Logs geben auch keinen wirklichen Hinweis.

Nur heute Mittag, bevor der Load explodiert ist:
Code:
[Fri Feb 01 14:45:39 2008] [warn] child process 27883 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 21099 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 27891 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 21959 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 27894 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 28691 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 27123 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 28703 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 22898 still did not exit, sending a SIGTERM
[Fri Feb 01 14:45:39 2008] [warn] child process 28380 still did not exit, sending a SIGTERM
Diese Meldung zog sich über geschätze 1000 Zeilen in die Länge...

unter ps aux ist auch nichts auffälliges.

Jemand eine Idee wo der Fehler zu finden ist? Der Server lief vorher 2 Monate ohne wirkliche Probleme. Habe schon einen Softwarereboot durchgeführt, ohne erfolg.

Danke schonmal für eure Hilfe.
 
Also nichts Auffälliges in den Logs, was auf einen Bot hindeuten könnte. Wie findet man denn raus obs einer ist bzw. wie kann man ihn wieder wegschicken? ;)
 
Ich LIEBE MySQL :mad:

Code:
   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1893 mysql     15   0  165m  28m 3352 S  146  2.9 306:06.25 mysqld

nimmt sich doch glatt 146% CPU diese freche, kleine $%&$%&$* :eek:

Is zwar eigentlich nicht möglich, geht aber scheinbar doch irgendwie ;)

Nee, Spass beiseite...

Auf einer meiner Boxen (gleiche Hardware wie Deine) lag der high-score für mai-ess-kuh-ell CPU-Hunger mal bei 99% :D

Kann es sein, dass hier der Hund begraben liegt? Dass sich MySQL so breit macht, dass nix anderes mehr Platz hat (z.B. Apache keine childs mehr aufmachen kann)? Hast Du eine ungewöhnlich grosse DB?

Nachdem ich auf der Box MySQL und Apache optimiert hab, läuft sie ZUCKER.

Hat mich zwar 2 Wochen gekostet da sich einige Werte in MySQL erst über Tage einpendeln, also wieder und wieder mit tuningprimer kontrollieren, einstellen, etc/init.d/mysql stop, start, paar Tage warten, checken, ändern, und so weiter und so fort.

Ich hab gut 20 my.conf Varianten "verschlissen" aber es hat sich gelohnt!

Poste doch mal den [mysqld] Teil deiner my.conf und die server-tuning.conf bzw. die apache2.conf

Ausgelastet ist der Server absolut nicht

DOCH, ist er und zwar bis zum Anschlag:
Code:
Cpu(s): 62.1%us, 36.4%sy,  0.0%ni,  [B]0.0%id[/B]
 
Darauf habe ich gar nicht geguckt... Hatte immer nur die apache2 Prozesse im Auge -.-
Und jetzt, wo du es sagst: Mysql dödelt da wirklich rum. Im 2 Sekunden Takt ist nimmt es mal mehr als 100% CPU und dann mal weniger, aber überwiegend ist es über 100%
Meine DB ist ca. 57 MB groß. Da gibt es mit Sicherheit größere.

Hier ein Auszug aus der my.cnf
Code:
# * Fine Tuning
#
key_buffer		= 16M
max_allowed_packet	= 16M
thread_stack		= 128K
thread_cache_size	= 8
max_connections        = 100
table_cache            = 10
thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit       = 1M
query_cache_size        = 16M

und hier apache2.conf

Code:
    StartServers            10
    MinSpareServers         10
    MaxSpareServers        25
    MaxClients            25
    MaxRequestsPerChild   10
    MaxMemFree 1600

Die ist so dödelig eingestellt, damit der Server überhaupt noch on bleibt ;)
Vorher war es so:
StartServers 10
MinSpareServers 10
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 500
MaxMemFree 1600

brauchst du sonst noch Infos?
 
Darauf habe ich gar nicht geguckt... Hatte immer nur die apache2 Prozesse im Auge -.-
Und jetzt, wo du es sagst: Mysql dödelt da wirklich rum. Im 2 Sekunden Takt ist nimmt es mal mehr als 100% CPU und dann mal weniger, aber überwiegend ist es über 100%
das darf nat. nicht sein.
Wie gesagt empfehle ich Dir den tuningprimer (SuFu, Google) um DEINE individuellen Einstellungen für DEINEN Server zu finden.

Was man aber wohl schon so sagen kann...:
query_cache_limit & size erscheinen mir niedrig. Auf jeden Fall muss query_cache auch erstmal mit query_cache_type = 1 eingeschaltet werden (oder hast du es einfach nicht mit-ge-paste-t?) :rolleyes:
Versuch mal diese Werte:
Code:
query_cache_type        = 1
query_cache_limit       = 3M
query_cache_size        = 32M

max_connections erscheint mir hoch, key_buffer etwas niedrig. table_cache sollte der Anzahl der Tabellen enstpr. die Du insges. hast (wahrscheinlich mehr als 10).

Aber wie gesagt muss man die optimale Konfi im Einzelfall finden.

und hier apache2.conf
Die ist so dödelig eingestellt, damit der Server überhaupt noch on bleibt

Dödelig? :p

Ich bin grade noch dabei bei mir den Apache zu optimieren und auch die letzen paar Prozentchen rauszuholen, aber m.E. sollte folgendes ausreichen um eine 'normalen' WebServer zu betreiben (also evtl. nicht die Portalseiten von google oder yahoo ;) )

Desh. machs noch 'dödeliger':
Code:
<IfModule prefork.c>
        # number of server processes to start
        StartServers         5
        # minimum number of server processes which are kept spare
        MinSpareServers      5
        # maximum number of server processes which are kept spare
        MaxSpareServers     10
        # highest possible MaxClients setting for the lifetime of the Apache proces
        ServerLimit        150
        # maximum number of server processes allowed to start
        MaxClients         150
        # maximum number of requests a server process serves
        MaxRequestsPerChild  0
</IfModule>

Fährst Du Apache überhaupt als prefork? Oder Worker (so siehts nämlich im 'top' aus)? :confused:

Auch hier gilt: ausprobieren, testen, optimieren und LESEN :)

Denn es gibt nicht DIE optimale, allgemeingültige Konfi - es kommt sehr darauf an, was man mit dem WebServer macht. Da aber unsere beider HardWare-Voraussetzungen identisch sind, könnte es passen :)

Ein script wie tuningprimer aber für Apache hab ich leider noch nicht gefunden. Gibts sowas? Weis da einer was?
 
Hi, werde deine Einstellungen bezügl. SQL mal übernehmen, danke :)

Bei Apache habe ich aber die Erfahrung gemacht, dass wenn ich nicht mind. 10 SpareServer gestartet habe, er mir den Ram komplett vollgestopft hat und der Server nach 3 Tagen nur noch durch HArdwarereboot zu retten war. Ich hatte Max-Connections auf 120 und Max Childs auf 500. Das lief wunderbar bis Mysql rumzickte, das war gestern und von jetzt auf gleich ohne das ich was änderte. Habe die DB mal um 20 MB kleiner gemacht, was auch nix bringt.

Im Gegensatz zu gestern ist es aber schon besser geworden. mysqld nimmt sich zwar manchmal immer noch über 100% (ka wie das gehen soll) aber dafür steigt der Load nicht mehr über 10 ;) und ist ab und zu sogar bei 2... (ich weiß, ist immer noch zu viel).

ich probiere es mal mit dem tuner.
 
Ja schon, aber bezieht sich der Wert dann nur auf einen Kern? Dann wäre es ja logisch, ansonsten nicht.

Ich habe den Load jetzt auf unter 1 gedrückt! Und das zu einer Stoßzeit ;) Hier die unglaublich schlechte Apache2 config:

Code:
    StartServers            5
    MinSpareServers         5
    MaxSpareServers        10
    MaxClients            40
    MaxRequestsPerChild   10
    MaxMemFree 1600
BTW: Bei debian läuft Apache2 meines wissens nur als prefork.
Dann habe ich noch die besagten SQL-Einstellungen übernommen und nun breitet sich mysqld auch nur noch max. zu 50% aus. Die Seite läuft sogar recht akzeptabel schnell, dafür dass heute schon 8000 Benutzer drauf waren und gleichzeitig an die 200...
Das war letzt Woche aber auch schon so und da gabs keine Probleme...

Werde ich wohl nie verstehen. Ich halte euch aber auf dem Laufenden.

Gruß und Danke,
Tobi
 
Back
Top