PHP FCGI Prozesse beenden sich nicht

Bierteufel

Registered User
Hallo,

ich habe ein "kleines" Problem mit PHP als FCGI mit folgenden System:

- CENTOS 5.4
- PHP 5.2.13
- PLESK 9.2.x
- PHP FCGI mit eigner PHP.INI je Domain (via Wrapper Script)
- das ganze auf einen VSERVER

Die gestarteten PHP FCGI Prozesse scheinen sich nicht zu beenden. So, dass beim Zugriff auf die jeweiligen Webseiten, im Laufe
der Zeit immer mehr Prozesse gestartet werden.

Nun dachte ich mir ich umgehe das in dem ich PHP mit SUPHP betreibe. Das funktioniert auch, jedoch ist die Performance bei einigen
CMS schlechter da ja keine OP Caches (EAC, XCACHE etc.) damit laufen. Mit FCGI tut Sie dies aber sehr schön.

Mein Ziel ist/muss es also sein, die Ursache zu finden warum, die FCGI Prozesse nicht beendet werden und halt immer mehr RAM aufbrauchen.

Hier noch die notwendigen Logs, evtl. kann ja jemand einen Tip geben.


HTTPD.CONF

Code:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers   3
ServerLimit      15
MaxClients       15
MaxRequestsPerChild  4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers         1
MaxClients         10
MinSpareThreads     1
MaxSpareThreads     1 
ThreadsPerChild     10
MaxRequestsPerChild  4000
</IfModule>

SWTUNE.CONF
Code:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       1
MinSpareServers    1
MaxSpareServers    3
ServerLimit       15
MaxClients        15
MaxRequestsPerChild  4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers       1
MaxClients        10
MinSpareThreads    1
MaxSpareThreads    1
ThreadsPerChild     10
MaxRequestsPerChild  4000
</IfModule>

FCGID.CONF

Code:
# added by psa-mod-fcgid-configurator
LoadModule fcgid_module /usr/lib64/httpd/modules/mod_fcgid.so

<IfModule mod_fcgid.c>
  SocketPath /var/lib/httpd/fcgid/sock
</IfModule>

# added by psa-mod-fcgid-configurator
<IfModule mod_fcgid.c>
  IdleTimeout 30
  IdleScanInterval 15
  BusyScanInterval 15
  ErrorScanInterval 6
  ZombieScanInterval 6
  ProcessLifeTime 1800
  MaxProcessCount 64
  DefaultMaxClassProcessCount 8
  IPCConnectTimeout 30
  IPCCommTimeout 45
  DefaultInitEnv RAILS_ENV production
</IfModule>

WRAPPER SCRIPT

Code:
#!/bin/sh
#
# Custom PHP FCGID wrapper for Plesk domains
#

PHPRC="/etc/php-ini.d/php-${UID}.ini"
[ -f ${PHPRC} ] || PHPRC="/etc/php.ini"


export PHPRC
exec /usr/bin/php-cgi.app
 
Die fcgi Prozesse sollen sich ja nicht beenden. Gerade das ist der Vorteil gegenüber CGI. Denn wenn bei jedem Webseiten Aufruf php-cgi neu geladen werden müsste, hättest ne sehr dicke Performance-Bremse

Und was heisst "immer mehr Prozesse"? Von meinen Kisten kann ich dir sagen dass für jeden VHost in der Regel immer drei php-cgi Instanzen laufen.
 
Ja, das mit den "Vorhalten" ist eigentlich recht gut bei FCGI, aber irgendwie scheint meine Begrenzung an Prozessen nicht zu greifen.

Wie und wo hast Du denn Deine FCGI Prozesse begrenzt ?


Also sprich

z.B.

PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS


hatte ich mal in mein Wrapper Script geschieben, doch scheinbar wurde dies ignoriert..


EDIT:

Und dann hatte ich im Netz gelesen:

You need mod_fcgid version >= 2.1 to support arguments in FCGIWrapper,

Und ich habe:

psa-mod_fcgid-1.10-3
psa-fcgi-2.4.0-2
psa-mod-fcgid-configurator-1.0-14

am laufen..
 
Last edited by a moderator:
Hallo, meine eingesetzten Versionen:
Code:
# emerge -p apache php mod_fcgid

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   ] www-servers/apache-2.2.14-r1
[ebuild   R   ] dev-lang/php-5.2.12
[ebuild   R   ] www-apache/mod_fcgid-2.2

mod_fcgid Konfig
Code:
<IfDefine FCGID>
LoadModule fcgid_module modules/mod_fcgid.so
SocketPath /var/run/fcgidsock
SharememPath /var/run/fcgid_shm

IdleTimeout 1200
ProcessLifeTime 3600
IPCConnectTimeout 1200
IPCCommTimeout 900
</IfDefine>

exemplarisches Wrapper-Script
Code:
#!/bin/sh

umask 022
PHPRC='/var/www/php-fcgi-scripts/webX/TLD.de/'
export PHPRC
PHP_FCGI_CHILDREN=0
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=250
export PHP_FCGI_MAX_REQUESTS
exec /usr/bin/php-cgi -c '/var/www/php-fcgi-scripts/webX/TLD.de/'
 
Back
Top