Passei uma semana ou duas pesquisando e configurando meu servidor para executar o Apache com o Worker MPM e FCID. Estou tentando otimizá-lo para permitir as conexões mais simultâneas possíveis. Foi um pesadelo encontrar boas informações sobre o MPM de trabalhadores.
Servidor - VPS com 1 GB de RAM (com o Apache desativando apenas 150 MB de RAM) Eu gostaria que o Apache tivesse um CAP de uso de memória de cerca de 750 MB - para que meu servidor nunca fique sem RAM.
Estou executando o servidor há cerca de 2 anos sem problemas - mas recentemente começamos a transmitir MP3`s e isso requer mais conexões simultâneas. O servidor também teve alguns ataques DDOS menores - então reduzi as configurações em uma tonelada para evitar que o servidor fique sem memória - também adicionei algumas regras de firewall ao limite de taxa.
A configuração que eu tenho agora parece que está funcionando bem - mas estou recebendo alguns erros de falha de segmentação
[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 alguns erros de falta de memória
Out of memory during array extend.
Esta é a minha configuração atual, eu realmente aprecio alguns conselhos.
Configurações do 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 então algumas configurações no fcgid.conf
FcgidMinProcessesPerClass 0
FcgidMaxProcessesPerClass 8
FcgidMaxProcesses 25
FcgidIdleTimeout 60
FcgidProcessLifeTime 120
FcgidIdleScanInterval 30
Conforme solicitado, minha saída para /etc/my.cnf
[mysqld] datadir = / var / lib / mysql socket = / var / lib / mysql / mysql.sock usuário = mysql # skip-innodb connect_timeout = 10 max_connections = 300 simbólico-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 arquivo pid = / var / run / mysqld / mysqld.pid
E PHP memory_limit = 64M
fonte
Respostas:
Essas configurações têm tudo a ver com equilíbrio, quão alto você pode obtê-las sem correr o risco de ficar sem memória e travar o servidor ou ter seus processos mortos pelo pai vps, e é possível que seja por isso que você está recebendo SegFaults.
Normalmente, quando estou otimizando um servidor, executarei o script tuning-primer.sh do mysql para ter uma idéia de quanta memória no máximo o MySQL pode usar:
https://launchpad.net/mysql-tuning-primer
Então, no prefork, eu multiplicaria o MaxClients pelo php memory_limit para ter uma idéia de quanta memória o Apache + PHP pode usar no máximo. Essas são estimativas aproximadas, mas uma vez que você tenha feito isso muito, poderá sentir isso.
Eu tento manter o total desses 2 em torno da memória máxima do servidor, se o seu VPS não tiver uma partição de swap, eu definitivamente tentaria mantê-lo menor que o max ram por alguns motivos:
1) Os outros processos no servidor estarão usando memória
2) Alguns scripts php no servidor podem estar usando o ini_set para alterar o memory_limit por si mesmos.
Se você pode fornecer o /etc/my.cnf e o php memory_limit, talvez eu consiga algumas boas configurações para você.
edit: Eu só queria mencionar que sei que você está usando worker e não prefork, os mesmos conceitos se aplicam, mas worker tem que lidar com threads e não apenas com MaxClients, de modo que o prefork foi um exemplo melhor. Eu precisaria examinar as configurações depois de obter as informações solicitadas para dar um bom conselho
fonte