Sehr viele PHP5-CGI Prozesse

K

katun.ch

Guest
hallo zusammen,

ich hab da ein komisches phänomen. ich weiss nicht an was es liegt. aber mein server schaukelt sich mit der anzahl prozesse hoch. ich weiss auch nicht genau wie ich mich ausdrücken soll. aber hier mal ein bild von munin.
Bild 1.png
wie man da sehen kann, steigt die anzahl der prozesse je länger der server läuft. auf einmal ist dann nichts mehr los und der server reagiert nicht mehr. das erklärt auch das ein abschnitt in der grafik fehlt.

ps -A sieht folgendermassen aus:
Code:
  PID TTY          TIME CMD
    1 ?        00:00:06 init
    2 ?        00:00:00 migration/0
    3 ?        00:00:00 ksoftirqd/0
    4 ?        00:00:00 watchdog/0
    5 ?        00:00:01 migration/1
    6 ?        00:00:00 ksoftirqd/1
    7 ?        00:00:00 watchdog/1
    8 ?        00:00:00 events/0
    9 ?        00:00:00 events/1
   10 ?        00:00:00 khelper
   11 ?        00:00:00 kthread
   16 ?        00:00:02 kblockd/0
   17 ?        00:00:00 kblockd/1
   18 ?        00:00:00 kacpid
  115 ?        00:00:00 khubd
  117 ?        00:00:00 kseriod
  167 ?        00:00:00 pdflush
  168 ?        00:00:50 pdflush
  169 ?        00:00:00 kswapd0
  170 ?        00:00:00 aio/0
  171 ?        00:00:00 aio/1
  762 ?        00:00:00 ata/0
  763 ?        00:00:00 ata/1
  764 ?        00:00:00 ata_aux
  767 ?        00:00:00 scsi_eh_0
  775 ?        00:00:00 scsi_eh_1
 1029 ?        00:00:00 md0_raid1
 1033 ?        00:00:43 md1_raid1
 1037 ?        00:00:23 md2_raid1
 1041 ?        00:08:08 md3_raid1
 1046 ?        00:00:48 md4_raid1
 1050 ?        00:00:13 md5_raid1
 1054 ?        00:00:04 md6_raid1
 1131 ?        00:00:16 kjournald
 1334 ?        00:00:00 udevd
 1724 ?        00:00:00 kpsmoused
 1888 ?        00:00:00 kmirrord
 2111 ?        00:00:00 kjournald
 2119 ?        00:00:20 kjournald
 2121 ?        00:01:40 kjournald
 2123 ?        00:00:02 kjournald
 2125 ?        00:00:00 kjournald
 2218 ?        00:00:00 portmap
 2479 ?        00:00:33 syslogd
 2485 ?        00:00:00 klogd
 2499 ?        00:05:56 named
 2556 ?        00:00:00 mysqld_safe
 2593 ?        13:01:55 mysqld
 2594 ?        00:00:00 logger
 2690 ?        00:00:00 amavisd-new
 2693 ?        00:00:04 policyd-weight
 2694 ?        00:00:04 policyd-weight
 2697 ?        00:00:02 postgrey
 2773 ?        00:00:00 acpid
 2783 ?        17:47:18 clamd
 2876 ?        00:00:00 courierlogger
 2877 ?        00:00:00 authdaemond
 2886 ?        00:00:00 courierlogger
 2887 ?        00:00:00 couriertcpd
 2889 ?        00:00:02 authdaemond
 2890 ?        00:00:02 authdaemond
 2891 ?        00:00:02 authdaemond
 2892 ?        00:00:02 authdaemond
 2893 ?        00:00:01 authdaemond
 2897 ?        00:00:00 couriertcpd
 2899 ?        00:00:00 courierlogger
 2908 ?        00:00:00 inetd
 2972 ?        00:00:27 master
 2979 ?        00:00:01 qmgr
 2998 ?        00:00:09 sshd
 3041 ?        00:00:00 mdadm
 3057 ?        00:00:00 proftpd
 3069 ?        00:00:00 atd
 3076 ?        00:00:02 cron
 3201 ?        00:00:07 munin-node
 3222 ?        00:00:00 ispcp_daemon
 3395 ?        00:00:46 monit
 3408 ?        00:00:00 uptimed
 3531 ?        00:00:00 miniserv.pl
 3555 tty1     00:00:00 getty
 3558 tty2     00:00:00 getty
 3559 tty3     00:00:00 getty
 3560 tty4     00:00:00 getty
 3561 tty5     00:00:00 getty
 3562 tty6     00:00:00 getty
 3576 ?        00:00:39 policyd-weight
22167 ?        00:00:38 policyd-weight
11847 ?        00:00:37 policyd-weight
30974 ?        03:42:13 php5-cgi
30315 ?        03:29:30 php5-cgi
20216 ?        02:37:58 php5-cgi
 1830 ?        02:29:06 php5-cgi
13847 ?        02:27:56 php5-cgi
17885 ?        02:37:30 php5-cgi
15183 ?        02:33:38 php5-cgi
28559 ?        02:36:33 php5-cgi
30864 ?        02:28:51 php5-cgi
20648 ?        02:31:31 php5-cgi
 6359 ?        02:27:52 php5-cgi
  702 ?        01:48:46 php5-cgi
25396 ?        01:39:42 php5-cgi
  900 ?        01:33:52 php5-cgi
27585 ?        01:32:00 php5-cgi
22520 ?        01:21:25 php5-cgi
30682 ?        01:17:34 php5-cgi
11347 ?        01:14:35 php5-cgi
30198 ?        00:00:00 php5-cgi
30203 ?        00:00:00 php5-cgi <defunct>
30205 ?        00:00:00 php5-cgi <defunct>
 5656 ?        01:02:16 php5-cgi
 9890 ?        01:00:19 php5-cgi
 6656 ?        00:58:44 php5-cgi
13171 ?        00:50:15 php5-cgi
 4658 ?        00:48:58 php5-cgi
19664 ?        00:32:45 php5-cgi
 6727 ?        00:19:43 php5-cgi
31059 ?        00:00:00 php5-cgi
31064 ?        00:00:00 php5-cgi <defunct>
31065 ?        00:00:00 php5-cgi <defunct>
29459 ?        00:00:00 php5-cgi
29464 ?        00:00:00 php5-cgi <defunct>
29465 ?        00:00:00 php5-cgi <defunct>
 5169 ?        00:16:08 php5-cgi
21236 ?        00:02:14 php5-cgi
14095 ?        00:00:00 amavisd-new
 6944 ?        00:00:00 amavisd-new
 7368 ?        00:00:00 pickup
 5566 ?        00:00:12 php5-cgi
 6579 ?        00:00:00 apache2
 6581 ?        00:00:00 apache2
 6583 ?        00:00:00 apache2
 6584 ?        00:00:00 php5-cgi
 6585 ?        00:00:00 apache2
 6991 ?        00:00:00 php5-cgi
 6992 ?        00:00:00 php5-cgi
 6588 ?        00:00:00 apache2
 8922 ?        00:00:00 php5-cgi
 9089 ?        00:00:01 php5-cgi
 9141 ?        00:00:01 php5-cgi
21741 ?        00:00:00 smtpd
21744 ?        00:00:00 anvil
22851 ?        00:00:00 trivial-rewrite
12324 ?        00:00:00 courierpop3d
17306 ?        00:00:00 sshd
18419 pts/0    00:00:00 bash
23314 ?        00:00:00 cron
23315 ?        00:00:00 sh
23320 ?        00:00:00 munin-cron
23571 ?        00:00:00 munin-update
24020 ?        00:00:00 munin-update
24022 ?        00:00:00 munin-node
30399 ?        00:00:00 php5-cgi
30458 ?        00:00:00 php5-cgi
30464 ?        00:00:00 php5-cgi
30465 ?        00:00:00 php5-cgi
30466 ?        00:00:00 php5-cgi
30468 ?        00:00:00 php5-cgi
30469 ?        00:00:00 php5-cgi
30496 ?        00:00:00 php5-cgi
30501 ?        00:00:00 php5-cgi
30516 ?        00:00:00 df
30522 ?        00:00:00 df
30560 ?        00:00:00 php5-cgi <defunct>
30589 ?        00:00:00 php5-cgi <defunct>
30597 ?        00:00:00 php5-cgi <defunct>
30617 ?        00:00:00 php5-cgi
30625 ?        00:00:00 php5-cgi <defunct>
30644 ?        00:00:00 php5-cgi
30654 ?        00:00:00 php5-cgi <defunct>
30656 ?        00:00:00 php5-cgi
30675 ?        00:00:00 php5-cgi
30677 ?        00:00:00 php5-cgi <defunct>
30683 ?        00:00:00 php5-cgi
30687 ?        00:00:00 php5-cgi <defunct>
30708 ?        00:00:00 php5-cgi
30739 ?        00:00:00 php5-cgi
30740 ?        00:00:00 php5-cgi <defunct>
30769 ?        00:00:00 php5-cgi
30771 ?        00:00:00 php5-cgi
30796 ?        00:00:00 php5-cgi
30798 ?        00:00:00 php5-cgi <defunct>
30802 ?        00:00:00 php5-cgi
30827 ?        00:00:00 php5-cgi
30829 ?        00:00:00 php5-cgi
30832 ?        00:00:00 php5-cgi
30834 ?        00:00:00 php5-cgi
30836 ?        00:00:00 php5-cgi
30856 ?        00:00:00 php5-cgi
30858 ?        00:00:00 php5-cgi
30860 ?        00:00:00 php5-cgi
30861 ?        00:00:00 php5-cgi
30863 ?        00:00:00 php5-cgi
30865 ?        00:00:00 php5-cgi
30892 ?        00:00:00 php5-cgi
30893 ?        00:00:00 php5-cgi
30894 ?        00:00:00 php5-cgi
30896 ?        00:00:00 php5-cgi
30897 ?        00:00:00 php5-cgi
30898 ?        00:00:00 php5-cgi
30900 ?        00:00:00 php5-cgi
30920 ?        00:00:00 php5-cgi
30924 ?        00:00:00 php5-cgi
30927 ?        00:00:00 php5-cgi
30952 ?        00:00:00 php5-cgi
30953 ?        00:00:00 php5-cgi
30955 pts/0    00:00:00 ps
30957 ?        00:00:00 php5-cgi
30959 ?        00:00:00 php5-cgi
30960 ?        00:00:00 php5-cgi
was auffällig ist, dass es php5-cgi prozesse gibt, die schon sehr sehr lange am laufen sind. wie kann das sein? meines wissens sollt sich der php prozess beenden sobald der code ausgeführt wurde. warum bleiben hier prozesse bestehen?

und warum habe ich da mehrere apache2 prozesse? würde einer nicht reichen?

ach ja: meine systeminfos mit uname -a
Code:
Linux mysrv 2.6.18-5-amd64 #1 SMP Tue Dec 18 21:39:26 UTC 2007 x86_64 GNU/Linux
betriebssystem ist debian 4.0

ich hoffe ihr könnt mir ein bisschen helfen. stehe momentan voll aufm schlauch.
 
Was sagt top? Haste Zombies? Bin zwar in Php + cgi nur laie, aber würde behaupten, das dass script sich nach vervolständigung nicht beendet?!
 
also top sagt folgendes:
Bild 2.png

sieht schon ziemlich nach zombieprozessen aus.
 
14 Zombies, nicht schlecht. Poste doch bitte mal den MPM Abschnitt der Apache Config und deine FCGI Starter Scripts. Weitere Angaben zur Hardware wären hilfreich.

In der Zwischenzeit kannste mal deine Apache Error log auf Auffälligkeiten prüfen.
 
Die langen Laufzeiten müssen ja auch eine Ursache haben!
In der php.ini wird normalerweise eingestellt wie lange die max. Laufzeit ist. Typisch sind 8 bis 30Sec. Nur in wenigen Ausnahmefällen macht mehr Sinn.

1. Warum greift das nicht?
Wird da evtl. im Script noch mal dran gedreht?

2. Frage:
Warum würgt der Apache das nicht ab?
Der hat schließlich ja auch noch einen Timeout.

3. Auch der Browser hat einen Timeout. Dieser müsste als Verbindungsabbruch auch bis zum Script durchschlagen.


Meine Vermutung:
Es ist nur ein einziges Script welches das Problem verursacht. Das hat eine Endlosschleife. Und ein trotteliger Programmierer hat so heftig an den Einstellungen gedreht dass sich das nicht automatisch abbrechen läßt.
 
Der Rechner steht auch ganz schön unter Dampf bei einem Load von 63 und 100% CPU Last.

Ich tippe auch auf ein amoklaufendes Skript.
 
also ich habe gestern nacht noch bis um 6uhr früh daran rumgeschraubt.

jetzt sehen die auswertungen von munin so aus:
MOD: Siehe Anhänge.

sieht schon ein bisschen besser aus. und der load ist auch runter gegangen. einzelne php5-cgi prozesse habe ich mithilfe von htop gekillt.

zur maschine. die sollte eigentlich genug power haben. hier mal die specs:
Single Xeon 3040, 4GB, 2x250GB
hmm jetzt frage ich mich allerdings warum diese kiste mit einem amd64 kernel läuft?

zu den configs... ich habe die ispcp config dateien mal nach diesem link hier angepasst. 1. Apache MPM [ispCP Documentation]
also punkt 1.1 und punkt 1.2 habe ich durchgeführt. mysql habe ich mal seinlassen. meine configs sehen jetzt wie folgt aus:
MPM-Abschitt
Code:
#   <IfModule mpm_worker_module>
#    StartServers          2
#    MaxClients          150
#    MinSpareThreads      25
#    MaxSpareThreads      75 
#    ThreadsPerChild      25
#    MaxRequestsPerChild   0
#</IfModule>
<IfModule mpm_worker_module>
    StartServers          1
    MaxClients          100
    MinSpareThreads       1
    MaxSpareThreads      50 
    ThreadsPerChild      10
    MaxRequestsPerChild  5000
</IfModule>
(das auskommentierte ist die vorherige einstellung)

und hier noch das fastcgi-starterscript:
Code:
<IfModule mod_fastcgi.c>
    FastCgiWrapper On
    FastCgiIpcDir /var/lib/apache2/fastcgi2
    FastCgiConfig -minProcesses 1 -maxProcesses 10 -singleThreshold 100 \
                  -idle-timeout 240 \
                  -killInterval 60
                  #-autoUpdate \
                  #-pass-header HTTP_AUTHORIZATION

    FastCgiServer /var/www/fcgi/master/php5-fcgi-starter -user vu2000 -group vu2000

    #
    # PHP5 SUPPORT
    #

    AddHandler php-fastcgi .php .php5

    <Location /php5/php5-fcgi-starter>
        SetHandler fastcgi-script
        Options +ExecCGI
    </Location>

    Action php-fastcgi /php5/php5-fcgi-starter
    AddType application/x-httpd-php .php .php5
</IfModule>
die parameter "-idle-timeout" und "-killInterval" waren ursprünglich auskommentiert.

hier noch das starterscript zur jeweiligen domain:
Code:
#!/bin/sh

umask 022

PHPRC="/var/www/fcgi/domain.tld/php5/"

export PHPRC
PHP_FCGI_CHILDREN=2
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=500
export PHP_FCGI_MAX_REQUESTS

exec /usr/bin/php5-cgi
und hier noch die resource limits der php.ini
Code:
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 30     ; Maximum execution time of each script, in seconds
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
;max_input_nesting_level = 64 ; Maximum input variable nesting level
memory_limit = 128M      ; Maximum amount of memory a script may consume (128MB)
wie hier schon einige vermutet haben, läuft ein script amok. das kann sehr gut sein. wie finde ich denn am besten heraus welches script hier amok läuft? geht sowas überhaupt? theoretisch müsste ich doch anhand des php5-cgi prozesses herausfinden können wie er gestartet wurde bzw. welches script zu diesem zeitpunkt angefordert wurde?

ach ja: frohes neues jahr allen zusammen!
 

Attachments

  • Bild 1.png
    Bild 1.png
    77.3 KB · Views: 422
  • Bild 2.png
    Bild 2.png
    70.5 KB · Views: 375
Last edited by a moderator:
Der AMD64 Kernel läuft wegen der 64 Bit Unterstützung deiner Prozessoren, sonst kannst du die 64bit Erweiterungen deiner Prozessoren nicht nutzen. Die Bezeichnung AMD ist meiner Meinung nach etwas ungünstig gewählt, da Intel fast dieselbe Erweiterung unter EMT64 verkauft. Man sollte also einfach sagen es läuft ein 64bit Kernel und nicht AMD64.
 
Wie gesagt, erstmal das Script suchen, welches vermutlich Amok läuft, dann anpassen. Wenns nicht hilft evtl. mal mod_fastcgi durch mod_fcgid ersetzen. mod_fcgid hat eine modernere Prozessmanagement-Strategie.
 
Sehr ähnliches Problem

Wir haben derzeit ein sehr ähnliches Problem, bei dem sich der Server im Schnitt alle 1 1/2 Tage abschießt aufgrund zu vieler PHP Prozesse, wie bekommt man denn heraus, welches Script da so frei dreht?

Ebenfalls Wordpress, hier mal ein Bild, wenn er normal läuft, aber irgendwas jagt plötzlich die Anzahl der Tasks hoch und keiner weiß warum.

Zwischendurch gingen die Tasks mal auf 44 hoch, dann aber wieder runter. Kurz nach dem Crash und Neustart liefen 75, wo Strato bereits meinte, dass sei viel zu viel. Normalisierten sich dann aber wieder.
 

Attachments

  • SNAG_Program-0025.png
    SNAG_Program-0025.png
    48.8 KB · Views: 272
Last edited by a moderator:
Hi,

vielen Dank erstmal ... lässt sich das ohne Root Zugriff bewerkstelligen? Haben einen Managed Server, zwar mit SSH Zugriff aber sehr beschränkt. Mir wurde halt das Monitoring per Top-Befehl nahe gelegt, aber das ist ja nicht wirklich aufschlussreich, um den genauen Übeltäter zu finden.

Haben jetzt nochmal die Caching Methode umgestellt, (WP-Super-Cache), von Mod_rewrite auf PHP Cache und er läuft seit nahezu drei Tagen ohne Absturz durch, verlassen möchte ich mich darauf jetzt aber noch nicht.
 
Back
Top