Prozesse

Apache, Lighttpd, nginx, Cherokee
fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Prozesse

Post by fulltilt » 2008-06-06 11:38

Habe hier ein System (ispCP RC3) PHP5, fcgi, mpm-worker mit 250 Domains.
An sich habe ich keine Probleme mit der Load, ich habe in den letzen 2 Wochen beobachtet, das sich die Prozesse fast verdoppelt haben - es kamen seitdem ca. 20 neue Domains hinzu.
Das geht jetzt bis 450 Prozesse hoch - ist im Rahmen für eine worker fcgi Konfiguration?

Code: Select all

load average: 1.10, 0.93, 0.67
Tasks: 309 total,   2 running, 307 sleeping,   0 stopped,   0 zombie
Cpu(s):  7.3%us,  6.3%sy,  0.0%ni, 86.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2010660k total,  1957092k used,    53568k free,    55920k buffers
Swap:  3943948k total,   507408k used,  3436540k free,   609720k cached


AMD Athlon(tm) 64 Processor 3700+
Debian 4 - 2.6.22.6 (SMP)
Bogomips 4392.07

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Prozesse

Post by daemotron » 2008-06-06 16:54

Na, deine vielen Prozesse scheinen ja genüßlich vor sich hin zu poofen. Aber um Deine Frage zu beantworten, wäre es vielleicht hilfreich, wenn Du ein wenig präzisieren könntest, wovon Du so viele Prozesse hast. Apache? PHP? oder was ganz anderes...?

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: Prozesse

Post by fulltilt » 2008-06-06 17:21

jfreund wrote:Na, deine vielen Prozesse scheinen ja genüßlich vor sich hin zu poofen. Aber um Deine Frage zu beantworten, wäre es vielleicht hilfreich, wenn Du ein wenig präzisieren könntest, wovon Du so viele Prozesse hast. Apache? PHP? oder was ganz anderes...?


Also die meisten sind fcgi Prozesse meine fcgi-starter:
PHP_FCGI_MAX_REQUESTS=500

Die Performance war bislang immer gut soweit, Zugriffe haben sich allerdings auch erhöht. Deshalb die Frage ob das zuviel ist oder noch O.K. in Verbindung mit worker ...

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: Prozesse

Post by fulltilt » 2008-06-09 18:16

sorry hatte die Tage viel Stress komme jetzt erst dazu die confs zu posten:

Code: Select all

apache2:

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          800
    MinSpareThreads      30
    MaxSpareThreads      50
    ThreadsPerChild      50
    MaxRequestsPerChild   0
</IfModule>

fastcgi.conf:

<IfModule mod_fastcgi.c>
FastCgiWrapper On
FastCgiIpcDir /var/lib/apache2/fastcgi2
FastCgiConfig -minProcesses 1
 -maxProcesses 400
 -maxClassProcesses 5
 -multiThreshold 80
 -killInterval 60
 -singleThreshold 0
 -startDelay 5

php5-fcgi-starter.tpl:

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


mysql:

key_buffer      = 64M
join_buffer_size        = 4M
sort_buffer             = 2M
read_buffer_size        = 2M
read_rnd_buffer_size    = 8M
myisam_sort_buffer_size = 64M
max_allowed_packet   = 1M
thread_stack      = 128K
thread_cache_size   = 10
max_connections         = 40
table_cache            = 10000
thread_concurrency     = 10
max_heap_table_size       = 128M
tmp_table_size            = 128M
open_files_limit          = 26000
low_priority_updates      = 1
query_cache_type          = 1
query_cache_size          = 32M
query_cache_limit         = 2M
max_connect_errors        = 10
log_warnings              = 2
long_query_time           = 2

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: Prozesse

Post by cirox » 2008-07-15 01:59

Zieh Dir bei z. Bsp. Debian fastcgid aus den unstable sourcen und bau Dir das Paket. Du kannst in der libapache2-mod-fcgid-2.2/fcgid_conf.c setzen vor dem Kompilieren:

Code: Select all

#define DEFAULT_IDLE_TIMEOUT 600
#define DEFAULT_IDLE_SCAN_INTERVAL 240
#define DEFAULT_BUSY_TIMEOUT 300
#define DEFAULT_BUSY_SCAN_INTERVAL 120
#define DEFAULT_SHUTDOWN_TIMEOUT 20
#define DEFAULT_ERROR_SCAN_INTERVAL 6
#define DEFAULT_ZOMBIE_SCAN_INTERVAL 6
#define DEFAULT_PROC_LIFETIME (60*60)
#define DEFAULT_SOCKET_PREFIX "/var/lib/apache2/fcgid/sock"
#define DEFAULT_SHM_PATH "/var/lib/apache2/fcgid/shm"
#define DEFAULT_SPAWNSOCRE_UPLIMIT 10
#define DEFAULT_SPAWN_SCORE 1
#define DEFAULT_TERMINATION_SCORE 2
#define DEFAULT_TIME_SCORE 1
#define DEFAULT_MAX_PROCESS_COUNT 500
#define DEFAULT_MAX_CLASS_PROCESS_COUNT 10
#define DEFAULT_MIN_CLASS_PROCESS_COUNT 0
#define DEFAULT_IPC_CONNECT_TIMEOUT 60
#define DEFAULT_IPC_COMM_TIMEOUT 120
#define DEFAULT_OUTPUT_BUFFERSIZE 65536
#define DEFAULT_MAX_REQUESTS_PER_PROCESS 500
#define DEFAULT_MAX_REQUEST_LEN (1024*1024*1024)   /* 1G */
#define DEFAULT_MAX_MEM_REQUEST_LEN (1024*64)   /* 64k */


Bewährt sich folgende Konfig für einen frequentierten Server:

Code: Select all

<IfModule mod_fcgid.c>

# IdleTimeout n (300 seconds)
# An idle fastcgi application will be terminated after IdleTimeout seconds.
IdleTimeout 600

# IdleScanInterval n (120 seconds)
# The scan interval for idle fastcgi applications.
IdleScanInterval 240

# BusyTimeout n (300 seconds)
# A fastcgi application will be terminated if handing a single request
# longer than busy timeout.
BusyTimeout 300

# BusyScanInterval n (120 seconds)
# The scan interval for busy timeout fastcgi applications.
BusyScanInterval 120

# ErrorScanInterval n (3 seconds)
# The scan interval for exit pending fastcgi applications. fastcgi
# applications will be terminated within this scanning.
ErrorScanInterval 6

# ZombieScanInterval n (3 seconds)
# The scan interval for zombie process.
ZombieScanInterval 6

# ProcessLifeTime n (3600 seconds)
# A fastcgi application will be terminated if lifetime expired,
# even no error is detected.
ProcessLifeTime 3600

# SocketPath path (logs/fcgidsock)
# The directory to put the UNIX domain socket. (UNIX only)
# This directory should be writable only by apache user
SocketPath /var/lib/apache2/fcgid/sock

#SharememPath path (logs/fcgid_shm)
#The share memory file path. (UNIX only) (version >= 2.1 only)
SharememPath /var/lib/apache2/fcgid/shm

# SpawnScoreUpLimit n (10)
# The spawn-speed control score up water limit. Score increases while
# a process is spawned or terminated, and decreases as time progresses;
# while the score is higher than SpawnScoreUpLimit, the spawning will be
# held for a while. The higher this number is, the higher speed of the
# spawning can be.
SpawnScoreUpLimit 10

# SpawnScore n (1)
# The weight of spawning.  This weight will be plused to the spawn-control
# score on every spawn. The higher this number is, the lower speed of
# spawning can be.
SpawnScore 1

# TerminationScore n (2)
# The weight of termination. This weight will be plused to the score while
# fastcgi process terminates. The higher this number is, the lower speed
# of spawning can be.
TerminationScore 2

# MaxProcessCount n (1000)
# The max count of total fastcgi process count.
MaxProcessCount 250

# DefaultMaxClassProcessCount n (100)
# The maximum number of fastcgi application instances allowed to run for
# particular one fastcgi application.
DefaultMaxClassProcessCount 10

# DefaultMinClassProcessCount n (3)
# The minimum number of fastcgi application instances for any one fastcgi
# application.
# Idle fastcgi will not be killed if their count is less than n
# Set this to 0, and tweak IdleTimeout
DefaultMinClassProcessCount 0

# DefaultInitEnv  env_name env_value
# The default environment variables before a fastcgi application
# is spawned. You can set this configuration more than once.

# IPCConnectTimeout n (3 seconds)
# The connect timeout to a fastcgi application.
IPCConnectTimeout 60

# IPCCommTimeout n (20 seconds)
# The communication timeout to a fastcgi application. Please increase this
#  value if your CGI have a slow initialization or slow respond.
IPCCommTimeout 120

# OutputBufferSize n (64k bytes)
# CGI output cache buffer size.

# PHP_Fix_Pathinfo_Enable n(n=0/1, default 0)
# If you are using PHP and set cgi.fix_pathinfo=1 in php.ini, set PHP_Fix_Pathinfo_Enable 1.
# From php.ini:
# cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
# previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
# what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
# this to 1 will cause PHP CGI to fix it's paths to conform to the spec.  A setting
# of zero causes PHP to behave as before.  Default is zero.  You should fix your scripts
# to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
# cgi.fix_pathinfo=1
PHP_Fix_Pathinfo_Enable 1


MaxRequestsPerProcess 500

<Location /irgendwas/php-fcgi-starter>
SetHandler fcgid-script
Options +ExecCGI
</Location>

<Location /pfad/php4-fcgi-starter>
SetHandler fcgid-script
Options +ExecCGI
</Location>

AddHandler php-fastcgi .php
AddHandler php4-fastcgi .php4

Action php-fastcgi /irgendwas/php-fcgi-starter
Action php4-fastcgi /irgendwas/php4-fcgi-starter

AddType application/x-httpd-php .php
AddType application/x-httpd-php .php4

</IfModule>


In der apache2.conf für den worker:

Code: Select all

Timeout 300
KeepAlive On
KeepAliveTimeout 2
MaxKeepAliveRequests 100
<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild 500
</IfModule>


In den php Starter kommt folgendes für php5:

Code: Select all

#!/bin/sh
PHPRC="/etc/apache2/pfad_zu_php-inis"
export PHPRC
PHP_FCGI_CHILDREN=0
export PHP_FCGI_CHILDREN
exec /pfad_zum_php-binary/php-fcgi


In den php Starter kommt folgendes für php4:

Code: Select all

#!/bin/sh
PHPRC="/etc/apache2/pfad_zu_php-inis"
export PHPRC
PHP_FCGI_CHILDREN=2
export PHP_FCGI_CHILDREN
exec /pfad_zum_php-binary/php-fcgi


In der mysql.conf würde ich grundsätzlich setzen:

Code: Select all

# als crashed markierten Tabellen automatisch erkennen und reparieren
myisam_repair_threads           = 1
myisam_recover = FORCE,BACKUP


Bei PHP4 wirst Du immer ein wenig mehr Prozesse haben, die nicht richtig gekillt werden können. Bei PHP5 klappt das schon ganz gut. Durch "PHP_FCGI_CHILDREN=0" wird auch die ganze Prozessverwaltung abgegeben. Dadurch starten nur neue Prozesse, wenn Sie auch angefordert werden, bzw. nicht gleich soviele.

Siehe oben. In der Config: "DefaultMinClassProcessCount 0". Dadurch killen sich bei mir auch die Prozess mit Idle richtig. Ab und zu kommt es immer noch zu kleineren Prozessausreißern, die einfach nicht gekillt werden. Aber das hält sich sehr in Grenzen.

Wenn man jetzt noch irgenwie den Speicher ernsthaft begrenzen könnte, dann läuft das alles schon recht gut.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: Prozesse

Post by fulltilt » 2008-07-15 07:55

Danke Dir :-)
werde es gleich mal auf einer VM testen.

EDIT:
Hatte hier auch apache Logs mit to many open files ...
würde es etwas bringen das ulimit im Apache init Script zu setzen?
z.B.

Code: Select all

start)....................
echo -n "Starting web server: Apache2"
ulimit -n 65535
$APACHE2CTL startssl
..............................................
reload)
echo -n "Reloading web server config..."
ulimit -n 65535
$APACHE2CTL graceful $2
......................................
restart | force-reload)
echo -n "Forcing reload of web server: Apache2"
apache_stop
ulimit -n 65535
$APACHE2CTL startssl

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Prozesse

Post by daemotron » 2008-07-15 08:14

ulimit hilft nur, wenn das System überhaupt so viel hergibt und als Shell tatsächlich bash (und nicht eine generische sh-Implementierung) genutzt wird.

Code: Select all

cat /proc/sys/fs/file-max
sysctl -a | grep 'fs.file-max'
sollten Dir mehr verraten.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: Prozesse

Post by fulltilt » 2008-07-15 08:29

jfreund wrote:ulimit hilft nur, wenn das System überhaupt so viel hergibt und als Shell tatsächlich bash (und nicht eine generische sh-Implementierung) genutzt wird.

Code: Select all

cat /proc/sys/fs/file-max
sysctl -a | grep 'fs.file-max'
sollten Dir mehr verraten.


Danke,

demnach müsste ich ulimit direkt in der Shell setzen, das wäre auch nur temporär nehme ich an ...

sind dies die Kapazitäten und was wäre ein guter Wert?

Code: Select all

cat /proc/sys/fs/file-max = 199880

sysctl -a | grep 'fs.file-max'
error: permission denied on key 'net.ipv4.route.flush'
fs.file-max = 199880

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Prozesse

Post by daemotron » 2008-07-15 15:10

Wenn das Startskript mittels bash ausgeführt wird, sollte ulimit bei Dir funktionieren, da die Systemgrenzen deutlich über den von Dir veranschlagten 64k liegen - es sei denn, $APACHECTL verweist auf ein weiteres Shell-Skript, für das natürlich ein eigener Shell-Prozess gestartet wird. Das müsstest Du sonst mit source oder . aufrufen...

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: Prozesse

Post by fulltilt » 2008-07-15 15:20

Danke Dir, das hilft mir weiter :-)
werde es zumindest einmal über ein paar Tage versuchen.
Das Problem liegt mitunter auch am Log System von ispCP (zu viele Logfiles) und ich werde wohl nicht drumrum kommen in den nächsten Tagen ein weiteres System aufzusetzen.
Momentan habe ich auf diesem 260 Domains ... Speicherbelegung erst mal 40% ...

jfreund wrote:Wenn das Startskript mittels bash ausgeführt wird, sollte ulimit bei Dir funktionieren, da die Systemgrenzen deutlich über den von Dir veranschlagten 64k liegen - es sei denn, $APACHECTL verweist auf ein weiteres Shell-Skript, für das natürlich ein eigener Shell-Prozess gestartet wird. Das müsstest Du sonst mit source oder . aufrufen...

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: Prozesse

Post by fulltilt » 2008-07-17 13:48

Hm also mit dem ulimit (to many open files) im init script hat nicht wirklich etwas geändert.
Wäre es auch machbar über die limits.conf?

/etc/security/limits.conf
* soft nofile 32768
* hard nofile 32768

ist das im laufenden Betrieb möglich oder muss rebootet werden?

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: Prozesse

Post by cirox » 2008-07-17 14:44

Am besten Du lagerst den mysql Server aus, verwendest eine sehr restriktive config, siehe oben, und schmeisst die vhosts runter, die mit Ihren Webseiten diese Probleme verursachen -> logfile beachten.

Ansonsten schau Dir mal RSBAC an. ich selbst warte noch auf die Implementierung in einen domU Kernel (XEN) oder normalen Kernel, der halt XEN Unterstützung hat und RSBAC.

fulltilt
Posts: 363
Joined: 2006-08-27 02:06

Re: Prozesse

Post by fulltilt » 2008-11-02 12:26

cirox wrote:Zieh Dir bei z. Bsp. Debian fastcgid aus den unstable sourcen und bau Dir das Paket. Du kannst in der libapache2-mod-fcgid-2.2/fcgid_conf.c setzen vor dem Kompilieren:


Der Wechsel auf fcgid hat hier letzendlich geholfen, die Prozesse sind um 50% runtergegangen.