VPS de 1GB - Apache Worker MPM - FCGID - Máximo de conexões simultâneas - RAM CAP

9

Eu passei uma semana ou duas pesquisando e configurando meu servidor para executar o Apache com o Worker MPM e o FCID. Eu estou tentando otimizá-lo para permitir as conexões mais simultâneas possíveis. Foi um pesadelo encontrar boas informações sobre o MPM do Trabalhador.

Servidor - VPS com 1GB de RAM (com o Apache desativado usando apenas 150MB de RAM) Eu gostaria que o Apache tivesse um CAP de uso de memória de aproximadamente 750MB - para que meu servidor nunca fique sem memória RAM.

Eu tenho funcionado o servidor por aproximadamente 2 anos sem nenhum problema - mas nós começamos recentemente streaming de MP3 e isso requer mais conexões simultâneas. O servidor também teve alguns ataques DDOS menores - então reduzi as configurações para evitar que o servidor fique sem memória - também adicionei algumas regras de firewall para limitar o limite.

A configuração que tenho agora parece estar 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, em seguida, algumas configurações no fcgid.conf

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

Como solicitado, minha saída para /etc/my.cnf

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

#skip-innodb

connect_timeout = 10
max_connections = 300
symbolic-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

    
por user1287874 25.03.2013 / 09:52

1 resposta

0

Essas configurações são todas sobre equilíbrio, o quão alto você pode obtê-las sem correr o risco de perder memória e travar o servidor, ou ter seus processos mortos pelo pai vps, o que é possível por isso que você está recebendo SegFaults. / p>

Normalmente, quando eu estou otimizando um servidor, eu vou rodar o script mysql tuning-primer.sh para ter uma idéia da quantidade de memória máxima que o MySQL pode usar:

link

Então, para prefork, eu multiplicaria MaxClients pelo php memory_limit para ter uma idéia da quantidade de memória que o Apache + PHP pode usar no max. Estas são estimativas aproximadas, mas uma vez que você fez muito isso, você tem uma ideia.

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 máximo de RAM por alguns motivos:

1) Os outros processos no servidor estarão usando a memória

2) Alguns scripts php no servidor podem estar usando ini_set para alterar o memory_limit para si mesmos.

Se você puder fornecer o /etc/my.cnf e o php memory_limit, poderei encontrar algumas boas configurações para você.

edit: Eu só queria mencionar que você está usando o worker e não o prefork, os mesmos conceitos se aplicam, mas o worker tem que lidar com threads e não apenas com o MaxClients, então o prefork foi um exemplo melhor. Eu teria que olhar para as configurações depois de obter as informações solicitadas, a fim de dar-lhe um bom conselho

    
por 30.03.2013 / 22:04