Server mehrmals pro Woche kaum erreichbar

Back-Up

Registered User
Hallo,

jetzt ist wieder mal der Server total lahm, wie es mehrmals in der Woche passiert. Seiten bauen sich nur noch sehr sehr langsam auf.


Das MaxClients Limit wurde erreicht (eingestellt 512):
Code:
ps ax | grep apache2 | wc -l
514

--------------------------------------
In der apache2 error_log gehts mit dem Performanceeinfall wieder los mit:
Code:
[Sun Aug 27 15:53:47 2006] [warn] child process 31054 still did not exit, sending a SIGTERM
[Sun Aug 27 15:53:47 2006] [warn] child process 12587 still did not exit, sending a SIGTERM
[Sun Aug 27 15:53:47 2006] [warn] child process 7875 still did not exit, sending a SIGTERM
[Sun Aug 27 15:53:47 2006] [warn] child process 30734 still did not exit, sending a SIGTERM
[Sun Aug 27 15:53:47 2006] [warn] child process 7578 still did not exit, sending a SIGTERM
[Sun Aug 27 15:53:47 2006] [warn] child process 6815 still did not exit, sending a SIGTERM
[Sun Aug 27 15:53:47 2006] [warn] child process 2604 still did not exit, sending a SIGTERM
... und endet mit:
Code:
[Sun Aug 27 15:54:02 2006] [error] child process 9590 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 12721 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 9897 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 9951 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 11906 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 10234 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 10237 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 10239 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 10682 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 11909 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:02 2006] [error] child process 11956 still did not exit, sending a SIGKILL
[Sun Aug 27 15:54:03 2006] [notice] caught SIGTERM, shutting down
[Sun Aug 27 15:54:05 2006] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Sun Aug 27 15:54:05 2006] [warn] RSA server certificate CommonName (CN) `hXXXXXX.serverkompetenz.net' does NOT match server name!?
[Sun Aug 27 15:54:05 2006] [warn] RSA server certificate CommonName (CN) `hXXXXXX.serverkompetenz.net' does NOT match server name!?
No worker file and no worker options in httpd.conf \nuse JkWorkerFile to set workers\n
[Sun Aug 27 15:54:05 2006] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec2)
[Sun Aug 27 15:54:05 2006] [warn] RSA server certificate CommonName (CN) `hXXXXXX.serverkompetenz.net' does NOT match server name!?
[Sun Aug 27 15:54:05 2006] [warn] RSA server certificate CommonName (CN) `hXXXXXX.serverkompetenz.net' does NOT match server name!?
No worker file and no worker options in httpd.conf \nuse JkWorkerFile to set workers\n
[Sun Aug 27 15:54:05 2006] [notice] mod_python: Creating 32 session mutexes based on 512 max processes and 0 max threads.
[Sun Aug 27 15:54:05 2006] [notice] Apache/2.0.54 (Linux/SUSE) configured -- resuming normal operations
[Sun Aug 27 15:57:16 2006] [error] server reached MaxClients setting, consider raising the MaxClients setting

--------------------------------------
Dann noch diese Statistik:
Code:
netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 4490/couriertcpd
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 4509/couriertcpd
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4896/mysqld
tcp 0 0 0.0.0.0:106 0.0.0.0:* LISTEN 4686/xinetd
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 4499/couriertcpd
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 4479/couriertcpd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21907/httpd2-prefor
tcp 0 0 0.0.0.0:8880 0.0.0.0:* LISTEN 5212/httpsd
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 4686/xinetd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 4686/xinetd
tcp 0 0 81.169.185.127:53 0.0.0.0:* LISTEN 4841/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 4841/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4682/sshd
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 22553/drwebd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 5004/postmaster
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 4841/named
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4686/xinetd
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 21907/httpd2-prefor
tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN 5212/httpsd
udp 0 0 0.0.0.0:32768 0.0.0.0:* 4841/named
udp 0 0 81.169.185.127:53 0.0.0.0:* 4841/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 4841/named
udp 0 0 0.0.0.0:68 0.0.0.0:* 4230/dhcpcd
udp 0 0 81.169.185.127:123 0.0.0.0:* 4718/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 4718/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 4718/ntpd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 11054 5004/postmaster /tmp/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 11162 5062/null /tmp/spamd_full.sock
unix 2 [ ACC ] STREAM LISTENING 8370 3677/dbus-daemon
Code:
/var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 9904 4463/acpid /var/run/acpid.socket
unix 2 [ ACC ] STREAM LISTENING 11173 5064/null /tmp/spamd_light.sock
unix 2 [ ACC ] STREAM LISTENING 10612 4767/nscd /var/run/nscd/socket
unix 2 [ ACC ] STREAM LISTENING 10798 4896/mysqld
Code:
/var/lib/mysql/mysql.sock
unix 2 [ ACC ] STREAM LISTENING 4183160 22553/drwebd
Code:
/var/drweb/run/.daemon
unix 2 [ ACC ] STREAM LISTENING 11846 5338/hald
Code:
@/tmp/hald-local/dbus-4QGdBhexc8

--------------------------------------
dann noch:
Code:
top - 16:16:10 up 12 days, 17:53, 1 user, load average: 0.24, 0.53, 2.57
Tasks: 610 total, 1 running, 609 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.3% sy, 0.0% ni, 97.2% id, 0.0% wa, 0.3% hi, 2.2% si
Mem: 2073848k total, 1860816k used, 213032k free, 15564k buffers
Swap: 1052248k total, 86632k used, 965616k free, 642588k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1076 root 16 0 2376 1324 772 R 0.7 0.1 0:00.12 top
1 root 16 0 692 68 40 S 0.0 0.0 0:02.06 init
2 root RT 0 0 0 0 S 0.0 0.0 0:00.36 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.34 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.34 khelper
9 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kthread
18 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid
327 root 10 -5 0 0 0 S 0.0 0.0 0:13.55 kblockd/0
331 root 10 -5 0 0 0 S 0.0 0.0 0:00.37 kblockd/1
386 root 16 0 0 0 0 S 0.0 0.0 4:28.03 kswapd0
387 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 aio/0
388 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 aio/1
977 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kseriod
1030 root 15 0 0 0 0 S 0.0 0.0 0:00.00 kirqd
1107 root 12 -5 0 0 0 S 0.0 0.0 0:00.00 ata/0
1108 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 ata/1
1230 root 15 0 0 0 0 S 0.0 0.0 1:59.66 kjournald
2076 root 12 -4 2040 640 580 S 0.0 0.0 0:00.74 udevd
2793 root 20 0 0 0 0 S 0.0 0.0 0:00.00 shpchpd_event
3677 messageb 17 0 3520 996 880 S 0.0 0.0 0:02.36 dbus-daemon
4230 root 16 0 1524 460 416 S 0.0 0.0 0:01.47 dhcpcd

Diese Performanceeinbrüche passieren oft und nerven. Was kann die Ursache dafür sein? Wie kann man herausbekommen, wer oder was die child process Fehlermeldungen erzeugt?

Schon seit vielen Tagen bin ich ratlos und ich würde mich riesig freuen, wenn dieses Problem irgendwann gelöst werden könnte.


Gruß,
 
Last edited by a moderator:
Zuerst einmal: Bitte die Code-Tags verwenden - dafuer sind sie da!

Zu Deinem Problem: Ich vermute, dass Dein Server an seine Leistungsgrenzen kommt. Koenntest Du bitte die Ausgabe von
Code:
cat /proc/user_beancounters
hier posten?
 
Abgesehen davon dass wohl was an der Einstellung von Apache ungünstig ist wie am Ende vom 1. Protokoll sichtbar - wo ich mich aber nicht auskenne !! - verbraucht der Rechner ganz ungewöhnlich viel Leistung zur Eigenverwaltung, insbesondere zu swappen. Gerade swap macht Rechner lahm usw. Noch schlimmer dass es hier ganz überflüssig ist, nur 8% vom angebotenen Platz werden verwendet. Das swap ganz abzustellen, würde den Rechner deutlich entlasten.
 
Das swap ganz abzustellen, würde den Rechner deutlich entlasten.
Sowas empfiehlt auch nur jemand, der root Zugriff auf seinem 56k Modem Homeserver offen verkuendet... Sorry, aber das ist ja nun mal totaler Unsinn! Wenn der Server evtl. sowieso schon am Limit kratzt, dann ist die Wegnahme von Swap-Space der perfekte Weg zu noch mehr Problemen.

Feuer frei fuer "Out of memory"!

Wir wissen ja gar nicht, wie das System unter Last aussieht. Wenn bei mir der Liveticker fuers Eishockey laeuft geht es meinem System ganz anders als im Moment...
 
Last edited by a moderator:
Sowas empfiehlt auch nur jemand, der root Zugriff auf seinem 56k Modem Homeserver offen verkuendet... Sorry, aber das ist ja nun mal totaler Unsinn! Wenn der Server evtl. sowieso schon am Limit kratzt, dann ist die Wegnahme von Swap-Space der perfekte Weg zu noch mehr Problemen.

Feuer frei fuer "Out of memory"!

Wir wissen ja gar nicht, wie das System unter Last aussieht. Wenn bei mir der Liveticker fuers Eishockey laeuft geht es meinem System ganz anders als im Moment...
Das ist leider ganz falsch. Damit hättest du vielleicht vor 5 Jahren Recht gehabt. Damals konntest du dich noch drauf verlassen, du guckst nach mit #free, und du siehst relativ zuverlässig wieviel Speicher die momentan laufenden Programme wirklich brauchen, und wenn es an der Grenze ist, richtest du swap ein, andernfalls kann es passieren, das alles langsamer wird und abstürzt ...

Heutzutage besteht aber die Unsitte vieler Programmierer, bei Programmen dynamisch fast den gesamten freien physikalischen Speicher zuzuordnen. Lässt du solche Programme auf einem Rechner mit 256 k laufen, zeigt # free fast das als voll belegt an, lässt du dasselbe Programm mit 512 k laufen, zeigt # free das als fast voll belegt an, usw. Wenn dann ein anderes Programm startet, wird das erste gezwungen seinen Speicherplatz zu reduzieren. Wenn dagegen swap-space da ist, denkt es garnicht daran; das neue Programm füllt dann einen kleinen Teil des swaps aus und swapt ständig und alles wird langsam (das ist relativ charakteristisch und auch hier der Fall) Das sehe ich tagtäglich, weil ich mehrere Rechner aller Grössen habe. Und anfangs war ich ebenfalls geneigt, dann ein swap-file anzustellen, habe aber schnell gesehen, dass a) dann alles deutlich langsamer wurde und b) das überhaupt nicht nötig ist.

Der Mann hat 2 GB Speicher, sag mir doch mal was für ein Programm unbedingt soviel braucht !! Noch dazu bei einem Server.
 
Last edited by a moderator:
Ich finde leider den Link nicht hier im Forum, aber evtl. kann mir Huschi oder Mercy unter die Arme greifen, wo Dir die Speicherverwaltung unter Linux mal ein wenig näher gebracht wird. Ich spare mir dazu jegliche Erklärungsversuche, da der Autor das selbst mir erklären konnte.

Welches Programm 2 GB verbrauchen kann... Apache, mySQL, Oracle, OpenXChange... soll ich die Liste erweitern, oder reicht das erstmal?

Welcome to the real world!
 
512 MaxClients sind einiges, jedoch für Apache locker zu schaffen. Evtl. schon an einen DOS gedacht?
"netstat -anp" nach doppelten IPs suchen. Wenn ja -> mod_evasive. Gute Einstellungen sieht man hier.

Ansonsten hat der Server genug Leistungsreservern. Die CPU idled und es sind noch 200MB Ram frei.
Bitte überprüfe deine Apache Config. Eine sinnvolle Einstellung siehst du hier.
MaxRequestsPerChild beendet Prozesse nach einer Anzahl von Requests, was deinen Speicher entlasten kann.
Sollte es kein DOS sein, versuche MaxClients zu erhöhen. Check auch deine MySQL Config.

Wenn das nicht hilft, solltest du mit mrtg und geeigneten Messwerten (Requests/CPU/RAM/SWAP) mal eine Woche lang dein System protokollieren.
 
Guckt euch nur mal die Werte von kswapd, kblockd, kjournald im Ausdruck im 1. Post an und vergleicht sie mit euerem Rechner (wenn der hoffentlich nicht ähnliche Probleme hat), das sage alles. Diese Werte sind im Normalfall praktisch =0.

Apache, MySQL usw BRAUCHEN zweifelsohne keine 2GB, sie laufen auch auf kleinsten Rechnern. Es ist aber durchaus denkbar, dass sie genau das machen was ich schrieb, nämlich den phys. Speicher den du hast/ihnen anbietest, defaultmässig aber unnötigerweise SICH NEHMEN und GANZ AUSFÜLLEN.

KDE scheint das neuerdings scheinbar auch zu machen. Mein eigener Rechner hat 1 GB. Momentan habe ich meinen Server, MySQL uva abgestellt weil ich was umstelle. Auch läuft sonst nichts ausser KDE und sonstigen normalen Diensten. Trotzdem zeigt # free : 840k voll, 64k frei , also defaultmässig wird alles ausser 64k ausgefüllt. Die insoweit selbe Installierung (Slackware + KDE) habe ich aber auch schon auf Pentium I mit 32 MB installiert <das läuft zwar langsam, aber stürzt nicht ab wegen Platzmangel>.

Und wenn ich jetzt OpenOffice starte, stürzt mein Rechner nicht etwa ab; vielmehr macht KDE etwas Platz frei und OpenOffice läuft dann. Hätte ich swap angestellt, macht KDE keinen Platz frei, sondern lässt dann OpenOffice rd. 200 MB vom swap-space benutzen - und das entsprechend langsam. Gerade deshalb stelle ich KEINEN swap-space an, obwohl ich genug Plattenplatz habe - und meine Installation läuft trotz 70 GB installierten Programmen sauschnell, einschliesslich dem Starten grosser Programme ...

Ebenso wenn ich jetzt meinen Server starte; Apache, MySQL, Sendmail, Usermin usw starte ich nämlich nicht bei Systemstart, sondern wenn ich kppp aufrufe (da ist das Start-Skript für alldies unter 'nach Verbindung ausführen' eingetragen). Wenn das nicht so wäre wie geschildert, sondern mein Rechner wirklich bis auf 64k voll wäre gemäss # free, müsste er beim Reingehen in Internet/Server stets abstürzen ...
 
Last edited by a moderator:
Zu Deinem Problem: Ich vermute, dass Dein Server an seine Leistungsgrenzen kommt. Koenntest Du bitte die Ausgabe von
Code:
cat /proc/user_beancounters
hier posten?
Bei mir existiert kein user_beancounters.
512 MaxClients sind einiges, jedoch für Apache locker zu schaffen. Evtl. schon an einen DOS gedacht?
"netstat -anp" nach doppelten IPs suchen. Wenn ja -> mod_evasive. Gute Einstellungen sieht man hier.
Ja, habe schon an DoS gedacht und ich kann mir gut vorstellen, dass ich Opfer bin, da ich die Probleme erst seit einem Hackerangriff habe. Nach dem Hackerangriff habe ich den ganzen Server neuinstallieren lassen. Statt SuSe 9.0 läuft jetzt 10.0 und statt Confixx läuft PLESK 8.0.1. Vor dem Hackerangriff lief alles vorbildlich. Ich hatte nie irgendwelche Optimierungen am Server vorgenommen, da mir die Ahnung fehlt und trotzdem rannte der Server 1A. Ich frage mich, ob ich das System nochmal neuaufsetzen sollte...

netstat -anp liefert mir einige doppelte IPs (grad geschaut, wo der Server jedoch grad nicht lahmt). Dann sollte ich wohl mal mod_evasive kennenlernen. Mal sehen, ob eine Laie wie ich damit klarkommt ;).

Als der Server heute wieder lahmt hat netstat -n |grep ESTAB|grep '\:80 '|wc -l mir 545 ausgegeben. Jetzt wo der Server ganz passabel läuft wird die Hälfte angezeigt.
 
Bei mir existiert kein user_beancounters.

Dann antizipere ich mal an, dass Du einen "echten Root" Server hast der auch tatsaechlich ueber die 2 GB RAM gebietet. Das ist o.k. die beancounters gibt's bei vServern.

Ich sehe erstmal aus den Informationen im ersten Thread zwei Probleme.
Das einfachste zuerst, die Kapazitaet die Du Deinem Apache eingestellt hast mit MaxClients. Ich nehme mal ein Zitat aus einem anderen aktuellen Thread (bin ja auch schreibfaul ;>=>) dort aus einer httpd.conf oder apache.conf oder apache2.conf:
# maximum number of server processes allowed to start
MaxClients 150
Den Parameter kann man eigentlich hochschrauben, dann kommt die Meldung schonmal nicht mehr :
[Sun Aug 27 15:57:16 2006] [error] server reached MaxClients setting, consider raising the MaxClients setting
Dazu wiederum habe ich diese Information ausgegraben mit einem sehr interessanten Verweis :
Apache 2 - Direktiven - MaxClients - Sascha Kersken

Das andere Problem welches mit Performance-Einbruechen durchaus zusammen haengen kann ist das mit den
[Sun Aug 27 15:54:02 2006] [error] child process 11909 still did not exit, sending a SIGKILL
Auch dazu lassen sich viele Informationen finden, die z.T. Loesungen beibringen jedoch stark von den Rahmenbedingungen abhaengen.
Was dort geschieht ist, dass ein Unterprozess des Apache sich nicht ordentlich und selbsttaetig beendet. Das kann auch heissen, dass er noch Verarbeitung erledigt z.B. in einer Endlosschleife.
Last produzieren diese "happenings" zum Einen weil dort ueberhaupt noch verarbeitet wird obwohl der Chef (Apache) der Ansicht ist sie haetten laengst aufhoeren sollen,
und zum Anderen weil mit der Sonderbehandlung dieser Threads (hoeflich bitten zu beenden, dann zwangsbeenden und dazwischen immer wieder warten und Status pruefen) natuerlich zusaetzliche Verarbeitung erfolgt, die im regulaeren Betrieb nicht anfaellt. Dann macht es noch die schiere Masse an Vorfaellen (es scheinen ja Dutzende innerhalb von Sekunden zu sein), und schon ist das System auf einmal ungemein mit sich selbst beschaeftigt.
Das Dumme ist, dass die zum Problem werdende Verarbeitung in den "haengenden" Prozessen hochindividuell ist, das ist das PHP-Script, das eine Seite erstellt oder Daten aus einer DB holt oder versucht die IP-Adresse eines Clients aufzuschluesseln oder PI zu ermitteln etc.p.p. .
Im einfachsten Fall ist es ein Fehler, der durch fehlerhafte, fehlerhaft konfigurierte, nicht kompatible Module/Libs (Perl, Python, CGI, Datenbank, PHP, etc.) auftritt und kann so leichter gefunden werden (btw. wenn einer Anwendung eine Datenbankverbindung unterm Hintern weggezogen wird, merkt die das auch nicht unbedingt, je nach Implementierung und ein Deadlock in einer Datenbank kann auch derartige Phaenomene verursachen -> Das klingt schon ganz interessant, das koennte man mal beim SQL-Server gegenchecken wenn sowas passiert).


Um noch auf unsere zwei Kampfhaehne zu kommen .... ;)
Marneus sprach glaube ich von diesem Beitrag :
huschi.net - Linux: Speicher voll!
Den finde ich uebrigens immer wieder schnell mit 3 Klicks nicht ueber eine (Board-)Schlagwortsuche sondern ueber die Menuestruktur (Kathegorien) und das schoen aussagekraeftige "topic" von Huschi.net ;> .
Das wiederum hat aber wohl weniger mit dem zu tun, was Blob glaubt, wie Multiuser/Multitasking Systeme ihre Speicherverwaltung regeln besonders im Hinblick auf Auslagerungsspeicher.
Zu Blob's These zur
Unsitte vieler Programmierer,
und deren Auswirkungen kann man
- geteilter Meinung sein,
- einsehen, dass manche Werkzeuge da nicht wirklich viel Wahl lassen,
- einsehen, dass der Speicherbedarf einer Anwendung nicht allein durch ein Code- sondern auch durch ein Datensegment beeinflusst wird dessen Groesse wiederum vom konkreten Anwendungsfall nicht ganz unabhaengig ist,
- bezweifeln, dass das alles die Ursache allen Uebels ist und in der Folge der hier gesuchten Performanceeinbrueche.

Da kann aber ja jeder seine eigene Ueberzeugung haben, ich formuliere hier nur meine Meinung, Politiker muessten ueberzeugen.

Ciao,
Mercy.

P.S.: Hier noch ein Thread, post Nr. 3 beschreibt eigentlich nett, wie das Ganze auch fuer mehr Prozesse sorgt
.
 
Last edited by a moderator:
Dann antizipere ich mal an, dass Du einen "echten Root" Server hast der auch tatsaechlich ueber die 2 GB RAM gebietet. Das ist o.k. die beancounters gibt's bei vServern.

Ich sehe erstmal aus den Informationen im ersten Thread zwei Probleme.
Das einfachste zuerst, die Kapazitaet die Du Deinem Apache eingestellt hast mit MaxClients. Ich nehme mal ein Zitat aus einem anderen aktuellen Thread (bin ja auch schreibfaul ;>=>) dort aus einer httpd.conf oder apache.conf oder apache2.conf
Ich habe einen root Server mit 2GB, ja.

Meinst du statt der httpd.conf oder apache.conf oder apache2.conf die server-tuning.conf im /etc/apache2 Verzeichnis? So sieht sie im Moment aus:
Code:
server-tuning.conf
##
## Server-Pool Size Regulation (MPM specific)
##

# the MPM (multiprocessing module) is not a dynamically loadable module in the
# sense of other modules. It is a compile time decision which one is used. We
# provide different apache2 MPM packages, containing different httpd2 binaries
# compiled with the available MPMs. See APACHE_MPM in /etc/sysconfig/apache2.

# prefork MPM
<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 process.
    ServerLimit        512
    # maximum number of server processes allowed to start
    MaxClients         512
    # maximum number of requests a server process serves
    MaxRequestsPerChild  0
</IfModule>

# leader MPM
<IfModule leader.c>
    # initial number of server processes to start
    StartServers         2
    # minimum number of worker threads which are kept spare
    MinSpareThreads     25
    # maximum number of worker threads which are kept spare
    MaxSpareThreads     75
    # maximum number of simultaneous client connections
    MaxClients         150
    # constant number of worker threads in each server process
    ThreadsPerChild     25
    # maximum number of requests a server process serves
    MaxRequestsPerChild  0
</IfModule>

# perchild MPM
<IfModule perchild.c>
    # constant number of server processes
    NumServers           5
    # initial number of worker threads in each server process
    StartThreads         5
    # minimum number of worker threads which are kept spare
    MinSpareThreads      5
    # maximum number of worker threads which are kept spare
    MaxSpareThreads     10
    # maximum number of worker threads in each server process
    MaxThreadsPerChild  20
    # maximum number of connections per server process
    MaxRequestsPerChild  0

    AcceptMutex fcntl
</IfModule>

# metux MPM
<IfModule metuxmpm.c>
    # initial number of worker threads in each server process
    StartThreads          5
    # minimum number of worker threads which are kept spare
    MinSpareThreads       5
    # maximum number of worker threads which are kept spare
    MaxSpareThreads      10
    # maximum number of connections per server process
    MaxRequestsPerChild   0

    Multiplexer "wwwrun"    "www"

</IfModule>


#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15

...
Was soll ich jetzt wie abändern?

Heute ist mein Server sogar so lahm gewesen, dass man nicht mehr mal mit PuTTY draufkam. Musste dann booten...
 
Meinst du statt der httpd.conf oder apache.conf oder apache2.conf die server-tuning.conf im /etc/apache2 Verzeichnis?
Wenn das denn die ist, die auch effektiv umgesetzt wird, ja.
Ist halt so ein Ding mir den Namen, bei mir wird effektiv /etc/httpd/httpd.conf umgesetzt, bei anderen heisst die "effektiv umgesetzte" Konfigurationsdatei anders, liegt woanders oder zieht noch andere an. Wenn das die Stelle ist, an der bei Dir diese Einstellung vorgenommen wird, dann ja.
Dass Du die Anzahl Maxclients hochziehen kannst um diese eine Meldung zu vermeiden hattest Du aber ja glaub' ich schon erwaehnt, mir ging es mehr um den Verweis in dem von mir verlinkten Beitrag wonach die dort eingetragene Anzahl nicht unbedingt auch greift weil an anderer Stelle eben diese Maximum noch einmal festgelegt wird.
Das ist aber nur ein Nebenkriegsschauplatz, das wichtige sind die haengenden Prozesse.

Heute ist mein Server sogar so lahm gewesen, dass man nicht mehr mal mit PuTTY draufkam. Musste dann booten...

Zu dem eigentlichen Problem, den haengenden Prozessen (wenn die nicht waeren, haette Dein System weniger zu tun mitunter damit, staendig neue Prozesse zu instanziieren, und der Apache brauchte keine so grosse Zahl Prozesse) ist mir noch das Naheliegendste eingefallen ...
Schau doch auch mal, dass Du mithilfe der logs feststellst, welche requests jeweil von den haendenden child-Prozessen zuletzt bearbeitet wurden; Wenn dabei heraus kommt, dass besonders viele mit derselben Verarbeitung / demselben request beschaeftigt sind, dann haengt darin etwas und dann kannst Du anhand der Information welche Anfrage da haengt womoeglich die Seite/ das Script/ was auch immer dann rauskommt eingrenzen und untersuchen, was da haengt.
Ansonsten ist halt bei dem Umstieg von Suse 9 auf 10 zu schaun, ob nicht Deine Webanwendungen oder Konfigurationen derselben Stress mit juengeren libs haben koennten.

Ciao,
Mercy.
 
Erstmal vielen Dank für die umfassenden Antworten :).
Schau doch auch mal, dass Du mithilfe der logs feststellst, welche requests jeweil von den haendenden child-Prozessen zuletzt bearbeitet wurden
Wie mache ich das (welche logs) und wonach muss ich Ausschau halten? Wie sähe z.B. so ein request aus?
 
Nun ich habe gerade kein wirklich passendes Beispiel parat ...
Das andere log, welches standard maessig geschrieben werden sollte heisst access_log und sollte dort zu finden sein, wo auch das von Dir oben teil-gelistete error_log liegt.
Ein Eintrag kann dan z.B. so aussehen:
192.168.12.10 - - [26/Aug/2006:17:31:09 +0200] "GET /tsdisplay/demo.php HTTP/1.1" 200 5442 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6"
Das sollte bei Dir irgendwie aehnlich aussehen; Was in meinem Beispiel fehlt ist die verknuepfende Information, die dann auch im Errorlog eine zugehoerigkeit zu einem Fehler anzeigt (da der Aufruf evtl. Minuten vor dem entgueltigen ERROR Eintrag erfolgte bietet sich die Uhrzeit eher nicht an).
Wenn das so ist kann die Information im access_log angepasst werden, dazu die Direktiven Logformat in der Apache-Konfiguration anpassen Details gibt's hier:
mod_log_config - Apache HTTP Server
Das Logformat sieht fuer obiges Beispiel so aus:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Zur Anwendung kommt das durch diesen Eintrag in der Apache Konfiguration:
CustomLog logs/access_log combined
Aus der oben verlinkten Doku entnehme ich (ich hatte urspruenglich wohl ein Tomcat log oder sowas vor meinem geistigen Auge), dass dann nur irgendwo in der Zeile erkennbar ein %P Einzubauen waere also z.B. an Ende anfuegen und schon habe ich auch die ID des bearbeitenden Prozesses zum request.

Auch schaun, ob Du evtl. sowas hier in der Apache Konfiguration aktiviert hast, dann befinden sich die richtigen logs evtl. woanders:
CustomLog logs/access_log common
Da Du im Moment eh ein Performance Problem hast und das ja der Ursachenfindung dient ist das o.k., wenn Du das Problem gefunden hast kannst Du ja das Logformat wieder drosseln dass nicht soviel Geplapper mitgeschrieben wird.

Ciao,
Mercy.
 
 
Was soll ich sagen, mich hat nochmal die Musse gepackt und ich hab eine Kollage von dem gemacht, wie die Fehlerursache fuer die haengenden Prozesse etwas eingegrenzt werden kann.

1. Es muss ein Logformat fuer das Access_log definiert werden, das eher geschwaetzig ist (zumindest muss die ProzessID des Bearbeiters erkennbar sein und der Inhalt der Anfrage) dazu einen solchen Eintrag in die apache-Konfiguration einfuegen:
LogFormat "%h %l %u %t PID: %P \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" accesslogmitpid
Kurzbeschreibung: 2 Argumente, ein Format-String das ist das zwischen den Gaensefuesschen, das bestimmt das Aussehen einer Logzeile und ein Alias mit dem dieses format identifiziert wird hier "acesslogmitpid".

2. Damit dieses Format benutzt wird muss der Alias zu den vorhandenen logs eingetragen werden also ueberall wo so eine Zeile steht
CustomLog logs/access_log combined
muss "combined" oder was auch immer da steht durch den oben vergebenen Alias also hier "accesslogmitpid" ersetzt werden.
CustomLog logs/access_log accesslogmitpid
Die Pfade und die Namen der Dateien sollten so bleiben -> Dort findet man dann spaeter auch die "Access_log-Eintraege" (Es lassen sich halt Ort und Name der Logdateien individuell veraendern).
Wenn das erweiterte Logformat nicht mehr gebraucht wird einfach den alten Alias (hier combined) wieder dort eintragen.
Hinweis -> Diese Einstellung zum Logfile kann fuer vHosts veraendert werden, es koennen also mehrere Eintraege existieren und folglich auch mehrere Logfiles.

3. Apache reloaden lassen.

Das Ergebnis sollte dann im (in den) Access_log (s) so wie hier aussehen:
192.168.12.10 - - [30/Aug/2006:18:46:19 +0200] PID: 2279 "GET /tsdisplay/demo.php HTTP/1.1" 200 5429 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6"
192.168.12.10 - - [30/Aug/2006:18:46:19 +0200] PID: 2279 "GET /tsdisplay/demo.css HTTP/1.1" 304 - "http://192.168.12.49/tsdisplay/demo.php" "Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6"
192.168.12.10 - - [30/Aug/2006:18:46:19 +0200] PID: 2279 "GET /tsdisplay/teamspeakdisplay/teamspeakdisplay.css HTTP/1.1" 304 - "http://192.168.12.49/tsdisplay/demo.php" "Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6"
192.168.12.10 - - [30/Aug/2006:18:46:19 +0200] PID: 2279 "GET /tsdisplay/teamspeakdisplay/teamspeak_online.png HTTP/1.1" 304 - "http://192.168.12.49/tsdisplay/demo.php" "Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6"
Die erste IP-Adresse ist die vom Anfrager, die ProzessID steht hinter "PID: " damit sie beim Suchen von Datumsangaben oder aehnlichem unterschieden werden kann. In den Gaensefuesschen hinter der ProzessID steht dann der Request.

Wenn dann im Error_log z.B. Eintraege wie diese auftauchen
[Wed Aug 30 18:50:35 2006] [error] child process 2279 still did not exit, sending a SIGKILL
[Wed Aug 30 18:50:35 2006] [error] child process 2289 still did not exit, sending a SIGKILL
[Wed Aug 30 18:50:35 2006] [error] child process 2285 still did not exit, sending a SIGKILL
[Wed Aug 30 18:50:35 2006] [error] child process 2310 still did not exit, sending a SIGKILL
Die ProzessID die hinter "child process " steht sollte dann auch im Access_log zu finden sein.
Einfach im Accesslog den Zeitpunkt aus dem Error_log suchen und von dort an die ProzessID rueckwaerts suchen lassen, dann sollte man den request an der Hand haben, der zum Zeitpunkt des Fehlers bearbeitet wurde.

Nuetzliche Quellen: mod_log_config - Apache HTTP Server

Ciao,
Mercy.
 
Hallo,

ich habe noch nicht die Zeit gefunden die Beiträge hier zu lesen. Werde das noch nachholen...

Ich habe in der access_log folgenden Eintrag gefunden, der nach Googlesuche immer wieder in Verbingung mit Hacking gebracht wird:

85.214.54.110 - - [29/Aug/2006:14:15:01 +0200] "GET /" 400 978 "-" "-"
85.214.54.110 - - [29/Aug/2006:14:16:14 +0200] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 303 "-" "-"

/w00tw00t.at.ISC.SANS.DFind:) taucht mehrmals auf. Passt auch zeitlich.

Über Google habe ich folgendes gefunden: Ebenso Spamangriff - wwww-data account ausgenutzt - Unixboard.de

Ich schaue mich mal weiter um...
 
Ich habe den Eintrag ans Ende der mod_log_config.conf geschrieben. Nur wo finde ich die CustomLog Einträge? Warum nicht einfach den combined Eintrag umschreiben?

Code:
#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# http://httpd.apache.org/docs-2.0/mod/mod_log_config.html
#

#
#         Format string:                Nickname:
#
LogFormat "%h %l %u %t \"%r\" %>s %b"           common
LogFormat "%v %h %l %u %t \"%r\" %>s %b"        vhost_common
LogFormat "%{Referer}i -> %U"               referer
LogFormat "%{User-agent}i"              agent
LogFormat "%h %l %u %t \"%r\" %>s %b \
\"%{Referer}i\" \"%{User-Agent}i\""         combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b \
\"%{Referer}i\" \"%{User-Agent}i\""         vhost_combined

# To use %I and %O, you need to enable mod_logio
<IfModule mod_logio.c>
LogFormat "%h %l %u %t \"%r\" %>s %b \
\"%{Referer}i\" \"%{User-Agent}i\" %I %O"       combinedio
</IfModule>

# Use one of these when you want a compact non-error SSL logfile on a virtual
# host basis:
<IfModule mod_ssl.c>
Logformat "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \
\"%r\" %b"                      ssl_common
Logformat "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \
\"%r\" %b \"%{Referer}i\" \"%{User-Agent}i\""       ssl_combined
</IfModule>
LogFormat "%h %l %u %t PID: %P \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" accesslogmitpid
 
Last edited by a moderator:
Ich habe den Eintrag ans Ende der mod_log_config.conf geschrieben. Nur wo finde ich die CustomLog Einträge? Warum nicht einfach den combined Eintrag umschreiben?
Klar, das geht auch, das ist dann das was ich in post 15 beschrieben hatte, nur muss man dann auch wissen, was man tut um danach wieder das alte Logformat zu bekommen. Da mein neuerlicher Text etwas mehr auf mini-howto abzielt und man als Schreiber ja nie wirklich weiss, auf welches Niveau man es denn nun bringen muss hab ich mir was ausgedacht, was wenig Detaileingriffe (Aenderungen an Vorhandenem, die man dann auch wieder Rueckgaengig machen muss) mit ein wenig copy-paste ermoeglicht.
Wenn Du nicht weisst, welche .conf Dateien bei Dir greifen und wo die Customlog-Eintraege zu finden sind ist es womoeglich auch am bequemsten/besten nur an einer Stelle den formatstring zum ueberall verwendeten Alias zu veraendern.
Nach zu sehen welcher das ist kannst Du Dir glaube ich sparen, das sieht sehr nach dem auch bei Dir zu findenden "combined" aus, was da in deinem access_log steht.

Du hattest schonmal eine "server-tuning.conf im /etc/apache2 " erwaehnt, wenn Du mal Zeit hast durchsuch doch mal /etc/apache2 bei Dir nach .conf Dateien und schau sie dir an, da wird die Gesamtkonfiguration Deines Apache samt vHosts "drin verteilt" sein.

// Wenn ein Suse Nutzer das jetzt besser qualifizieren kann .. nur zu!

Die Eintraege die Du aus Deiner access_log gepostet hast kommen mir uebrigens auch aus Threads rund um script-kiddies und einfache DOS bekannt vor, ich denke mal, dass die zitierten requests von Deinem Apache nicht sinnvoll beantwortet werden koennen.
Merk Dir die IP-Adresse des hosts (kannst ja mal whois danach suchen lassen), das koennte eine halbwegs fest Vergebene sein ...(sieht nach proxy aus); Wenn die requests immer von da kommen kannst ja mal eine abuse-mail schreiben, v40 kann da sicher gut beraten. ;>

Ciao,
Mercy.

P.S.: Wenn Du jetzt noch (fuer Dich) den Nachweis fuehrst, dass die haengenden Prozesse durch diese Requests verursacht werden, dann hast Du einen gut fundierten Grund fuer den Einsatz von mod_evasive wie Hooch ihn in post 8 vorschlaegt und die Suche nach Ressourcen ist ebenfalls mit gutem Gewissen erstmal beendet ;> . Ausserdem wuerde ich das dann fuer einen guten Grund halten erstmal wieder ruhig zu schlafen.
 
Last edited by a moderator:
Back
Top