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

9

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

user1287874
fonte
Alguma idéia para alguém?
user1287874
1
Assim, dos 1 GB que você possui, se o Apache ocupa 750 MB, como você imagina que outros 250 sejam distribuídos? Isso é realmente importante ... Estou perguntando, porque 750 é uma expectativa altamente irrealista e doentia. 250 MB é provavelmente valor teto - de este 1 GB realisticamente se você quer sistema de ~ 200 bom desempenho
Hrvoje Špoljar

Respostas:

0

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

Michael Wineland
fonte
Olá Michael, desde então, atualizei minhas configurações (depois de receber conselhos de pessoas). Desde então, reduzi o Serverlimit para 8 Maxclients para 200 e FCGID para 10 - ficarei de olho nele e veremos como vai. Vou postar as saídas na postagem original em breve
#
como sooN? abril?
Eddie #