Ich habe ein oder zwei Wochen lang nachgeforscht und meinen Server eingerichtet, um Apache mit Worker MPM und FCID auszuführen. Ich versuche es zu optimieren, um möglichst gleichzeitige Verbindungen zu ermöglichen. Es war ein Albtraum, gute Informationen über das Worker MPM zu finden.
Server - VPS mit 1 GB RAM (bei ausgeschaltetem Apache werden nur ca. 150 MB RAM verwendet) Ich möchte, dass Apache eine Speicherauslastung von ca. 750 MB hat - damit meinem Server nie der RAM ausgeht.
Ich habe den Server ungefähr 2 Jahre lang ohne Probleme betrieben - aber wir haben kürzlich damit begonnen, MP3s zu streamen, und dies erfordert mehr gleichzeitige Verbindungen. Der Server hatte auch einige kleinere DDOS-Angriffe - daher habe ich die Einstellungen um eine Tonne reduziert, um zu verhindern, dass dem Server der Speicher ausgeht. Außerdem habe ich einige Firewall-Regeln hinzugefügt, um die Rate zu begrenzen.
Das Setup, das ich jetzt habe, scheint gut zu funktionieren - aber ich erhalte einige Segmentierungsfehler
[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 ***
Und einige Speicherfehler
Out of memory during array extend.
Dies ist mein aktuelles Setup, ich würde mich über Ratschläge sehr freuen.
Apache-Einstellungen:
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>
#####################
Und dann einige Einstellungen in der Datei fcgid.conf
FcgidMinProcessesPerClass 0
FcgidMaxProcessesPerClass 8
FcgidMaxProcesses 25
FcgidIdleTimeout 60
FcgidProcessLifeTime 120
FcgidIdleScanInterval 30
Wie gewünscht meine Ausgabe für /etc/my.cnf
[mysqld] datadir = / var / lib / mysql Socket = / var / lib / mysql / mysql.sock user = mysql # skip-innodb connect_timeout = 10 max_connections = 300 symbolische 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 Abfrage-Cache-Größe = 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
Und PHP memory_limit = 64M
quelle
Antworten:
Bei diesen Einstellungen geht es um das Gleichgewicht, darum, wie hoch Sie sie erreichen können, ohne das Risiko einzugehen, dass nicht genügend Speicherplatz zur Verfügung steht und der Server abstürzt oder Ihre Prozesse vom vps-Elternteil beendet werden. Möglicherweise erhalten Sie deshalb SegFaults.
Wenn ich einen Server optimiere, führe ich normalerweise das Skript mysql tuning-primer.sh aus, um eine Vorstellung davon zu erhalten, wie viel Speicher maximal MySQL verwenden kann:
https://launchpad.net/mysql-tuning-primer
Dann würde ich für prefork MaxClients mit dem php memory_limit multiplizieren, um eine Vorstellung davon zu bekommen, wie viel Speicher Apache + PHP bei max. Dies sind grobe Schätzungen, aber wenn Sie dies einmal getan haben, bekommen Sie ein Gefühl dafür.
Ich versuche, die Summe dieser 2 direkt um den maximalen Speicher des Servers herum zu halten. Wenn Ihr VPS keine Swap-Partition hat, würde ich aus mehreren Gründen definitiv versuchen, sie niedriger als den maximalen RAM zu halten:
1) Die anderen Prozesse auf dem Server verwenden Speicher
2) Einige PHP-Skripte auf dem Server verwenden möglicherweise ini_set, um das memory_limit für sich selbst zu ändern.
Wenn Sie /etc/my.cnf und php memory_limit bereitstellen können, kann ich möglicherweise einige gute Einstellungen für Sie vornehmen.
Bearbeiten: Ich wollte nur erwähnen, dass ich weiß, dass Sie Worker und nicht Prefork verwenden. Es gelten dieselben Konzepte, aber Worker muss sich mit Threads und nicht nur mit MaxClients befassen, sodass Prefork ein besseres Beispiel war. Ich müsste die Einstellungen überprüfen, nachdem ich die angeforderten Informationen erhalten habe, um Ihnen gute Ratschläge zu geben
quelle