1 GB VPS - Apache Worker MPM - FCGID - Numero massimo di connessioni simultanee - RAM CAP


9

Ho trascorso una settimana o due a ricercare e configurare il mio server per eseguire Apache con Worker MPM e FCID. Sto cercando di ottimizzarlo per consentire le connessioni più simultanee possibili. È stato un incubo trovare buone informazioni su Worker MPM.

Server - VPS con 1 GB di RAM (con Apache disattivato utilizza solo circa 150 MB di RAM) Vorrei che Apache avesse un CAP di utilizzo della memoria di circa 750 MB - in modo che il mio server non esaurisca mai la RAM.

Gestisco il server da circa 2 anni senza problemi, ma recentemente abbiamo iniziato a trasmettere MP3 e questo richiede più connessioni simultanee. Il server ha anche avuto alcuni piccoli attacchi DDOS - quindi ho ridotto le impostazioni di una tonnellata per evitare che il server esaurisca la memoria - Ho anche aggiunto alcune regole del firewall al limite di velocità.

La configurazione che ho ora sembra funzionare bene, ma sto riscontrando alcuni errori di segmentazione

[Sat Mar 23 03:19:50 2013] [notice] child pid 28351 exit signal Segmentation fault (11)
[Sat Mar 23 03:56:20 2013] [notice] child pid 29740 exit signal Segmentation fault (11)
*** glibc detected *** /usr/sbin/httpd.worker: malloc(): memory corruption: 0xb83abdd8 ***

E alcuni errori di memoria insufficiente

Out of memory during array extend.

Questa è la mia configurazione attuale, apprezzerei davvero alcuni consigli.

Impostazioni di Apache:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
#####################
# Spawn 2 child processes, spawning 25 threads for each child process.
# So, a pool of 50 threads is left up and sleeping, ready to serve incoming requests.
# If more requests will come in, apache will spawn new child processes, each one spawning 25 threads,
# enlarging the thread pool until the total number of threads become 50. In that case, apache begin
# to cleanly drop processes, trying to reach 25 threads.
# New processes and its threads are spawned in case of a large spike of requests, until 200 parallel
# client requests are reached, then apache will no longer accept new incoming connections.
# When the load calm down, and requests come back under 200 parallel connections, apache will continue
# to accept connections. After 25, 000 requests served by a child, q. 1000 per thread, the process
# get closed by the father to ensure no memory leak is fired.
<IfModule worker.c>
ServerLimit      16
StartServers         2
MaxClients       400
MinSpareThreads   25
MaxSpareThreads  50 
ThreadsPerChild    25
MaxRequestsPerChild  1000
ThreadLimit          64 
ThreadStackSize      1048576
</IfModule>
#####################

E poi alcune impostazioni in fcgid.conf

FcgidMinProcessesPerClass 0 
FcgidMaxProcessesPerClass 8 
FcgidMaxProcesses  25
FcgidIdleTimeout 60 
FcgidProcessLifeTime 120 
FcgidIdleScanInterval 30

Come richiesto il mio output per /etc/my.cnf

[Mysqld]
datadir = / var / lib / mysql
socket = / var / lib / mysql / mysql.sock
user = mysql

# Skip-innodb

connect_timeout = 10
max_connections = 300
simbolico-links = 0
innodb_file_per_table = 1
myisam_sort_buffer_size = 8M
read_rnd_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
sort_buffer_size = 512K
table_cache = 32
max_allowed_packet = 1M
key_buffer = 16k
query_cache_type = 1
query-cache-size = 32M
thread_cache_size = 16
net_buffer_length = 2K
thread_stack = 256K
wait_timeout = 300

slow_query_log

# Log-slow-queries = / var / log / mysql / slow-queries.log
slow_query_log = / var / log / mysql / slow-queries.log
long_query_time = 1

[Mysqld_safe]
log-error = / var / log / mysqld.log
pid-file = / var / run / mysqld / mysqld.pid

E PHP memory_limit = 64M


Qualche idea qualcuno?
user1287874

1
quindi, dei 1 GB che hai, se Apache prende 750 MB, come pensi che ne vengano distribuiti altri 250? Questo è davvero importante ... lo sto chiedendo perché 750 è un'aspettativa altamente non realistica e malsana. Di questi 1 GB realisticamente se si desidera un sistema ben performante ~ 200 - 250 MB è probabilmente il valore massimo
Hrvoje Špoljar

Risposte:


0

Queste impostazioni riguardano l'equilibrio, quanto in alto puoi ottenerle senza rischiare di esaurire la memoria e arrestare il server, o far uccidere i tuoi processi dal genitore vps, il che è possibile per questo motivo stai ottenendo SegFaults.

Di solito, quando sto ottimizzando un server, eseguirò lo script mysql tuning-primer.sh per avere un'idea di quanta memoria può utilizzare al massimo MySQL:

https://launchpad.net/mysql-tuning-primer

Quindi per prefork moltiplicherei MaxClients per php memory_limit per avere un'idea di quanta memoria Apache + PHP può usare al massimo. Queste sono stime approssimative, ma una volta che lo hai fatto molto, puoi averne un'idea.

Cerco di mantenere il totale di quei 2 proprio attorno alla memoria massima del server, se il tuo VPS non ha una partizione di swap, proverei sicuramente a mantenerlo inferiore al massimo RAM per un paio di motivi:

1) Gli altri processi sul server utilizzeranno la memoria

2) Alcuni script php sul server potrebbero usare ini_set per cambiare da soli il memory_limit.

Se riesci a fornire /etc/my.cnf e php memory_limit, potrei essere in grado di trovare alcune buone impostazioni per te.


modifica: volevo solo ricordare che so che stai usando worker e non prefork, si applicano gli stessi concetti, ma worker deve gestire i thread e non solo MaxClients, quindi prefork è stato un esempio migliore. Dovrei esaminare le impostazioni dopo aver ottenuto le informazioni richieste per darti un buon consiglio


Ciao Michael, da allora ho aggiornato le mie impostazioni (dopo aver ricevuto alcuni consigli dalle persone) da allora ho spostato Serverlimit da 8 Maxclients a 200 e FCGID a 10 - lo terrò d'occhio e vedremo come va.
Pubblicherò

come va? aprile?
Eddie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.