Erro 503... Take 20590050

rCrew

New member
Service Temporarily Unavailable

The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Apache/2.2.3 (Debian) PHP/4.4.4-8+etch4 Server at forum.autohoje.com Port 80



Estou sempre a receber este erro, hoje então tem sido o dia todo praticamente. Alguem sabe o que se passa?
 
Mas não fica muito tempo, espera-se um pouco e já dá...penso que seja alguém que tropeça nos cabos, e o tempo que demora é o tempo que a pessoa que tropeçou leva a reparar que o cabo saiu e o volta a pôr [:D]
 
é um robot que impede que algum dos servidores entre numa espiral por excesso de carga.

assim sempre que o loadaverage ultrapassa certo valor é despoletado um trigger que para de servir pedidos ate que o load baixe, assim evita que uma sobrecarga temporaria mate o forum .

agora vou ver onde meto o trigger se nos 25 se nos 50 se nos 75 .
consoante a frequencia com que isto acontece
 
Última edição:
Mete no maximo até acender a luzinha vermelha, e quado tiver quase a rebentar, ai sim, manda toda a gente a baixo. [:D]

normalmente acontece quando a um slow-query ( tipicamente uma pesquisa) em que é feito table scan.
a ideia sibjacente ´simples, antes 1 ou 2 minutos para recuperar folego que aterrar de vez e ficar a espera que alguem faça uma intervenção ( desligar o botão) [:D]
 
Mete no maximo até acender a luzinha vermelha, e quado tiver quase a rebentar, ai sim, manda toda a gente a baixo. [:D]

normalmente acontece quando a um slow-query ( tipicamente uma pesquisa) em que é feito table scan.
a ideia sibjacente ´simples, antes 1 ou 2 minutos para recuperar folego que aterrar de vez e ficar a espera que alguem faça uma intervenção ( desligar o botão) [:D]

Que lingua é essa???? :confused: :sh)
 
o procedimento é muito simples.


o processador tem um queue ( fila de espera) de processos, o principio logico é se deixarmos a fila de espera crescer muito , vai ficar de tal maneira atulhado que vai acabar por se ir abaixo.

a maquina unix guarda num ficheiro
/proc/loadavg

o numero de processos em espera.

por exempolo neste momento fazendo cat /proc/loadavg obtenho isto:

0.97 1.08 3.44 1/169 302


significa que no ultimo minuto tivemos em media 0.97 processos em espera
nos ultimos 5 minutos a media foi de 1.08 e nos ultimos 15 foi de 3.44


bom se cada vez que o servidor receb um pedido olhar para o primeiro valor fica a saber se a maquina esta muito ocupada.
assim o que ele faz é olhar para o primeiro valor e se for superior a 60 não aceita mais pedidos ate ter tudo despachado e manda o erro ou http 503 .


para os mais curiosos :



/*

Instructions :
==============

Install : apxs -i -a -c mod_load.c
Configure : MaxLoad apache directive (default is 25)


Apache 2.0 version :
--------------------

Copyright (C) 2005
Planet-Work SARL
http://www.planet-work.fr/
Frederic VANNIERE - f.vanniere@planet-work.com

Original Apache 1.3 version :
-----------------------------

Copyright (C) 2000,2001,2002,2003
SedNove Inc.
439 OAK
St-Lambert, QC, Canada
All rights reserved.
Pierre Laplante
Wed Nov 20 15:53:45 2002
Pierre.Laplante@sednove.com

*/

#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_log.h"
#include "http_protocol.h"
#include "http_request.h"
#include "http_main.h"
#include "util_script.h"
#include "util_md5.h"
#include "ap_config.h"
#include "unistd.h"

/*#define DEBUGLVL 9*/

#ifdef DEBUGLVL
#define DEBUG(lvl,x...) if (lvl<DEBUGLVL) fprintf(stderr, x);
#else
#define DEBUG(lvl,x...)
#endif

module AP_MODULE_DECLARE_DATA load_module;

typedef struct {
int max_load;
} load_handler_config;

static void *
create_config(apr_pool_t *p, server_rec *s) {
load_handler_config *c;

DEBUG(5, "create_config\n");

c = (load_handler_config *) apr_pcalloc(p, sizeof(load_handler_config));
c -> max_load = 25;

DEBUG(5, "create_config c=%x.\n", c);
return (void *) c;
}



static const char *
my_handler(cmd_parms *parms, void *mconfig, char *to) {
load_handler_config *c;

DEBUG(5, "my_handler, to=%s, mconfig=%x, parms=%x/%x\n", to, mconfig, parms, parms);
c = (load_handler_config *) ap_get_module_config(parms->server->module_config,
&load_module);

DEBUG(5, "c=%x\n", c);
c -> max_load = atoi(to);
return NULL;
}


static const command_rec load_cmds[] =
{
AP_INIT_TAKE1("MaxLoad",my_handler,(void*) 0,RSRC_CONF,"Set max Loadavg." ),
{NULL}
};


static int load_handler(request_rec *r) {
int fd;
float la;
char buf[1024];
load_handler_config *c;

DEBUG(5, "load_handler\n");

c = (load_handler_config *) ap_get_module_config(r->server->module_config,
&load_module);
DEBUG(5, "c=%x\n", c);
DEBUG(5, "load = %d \n", c -> max_load);
fd = open("/proc/loadavg", O_RDONLY);
if (read(fd, buf, 1024) <=0) {
//ap_log_reason("Can't open /proc/loadavg", "/proc/loadavg", r);
ap_log_error(APLOG_MARK, APLOG_ERR,0,NULL, "Can't open /proc/loadavg");
return DECLINED;
} else {
sscanf(buf, "%f", &la);
if (la > c -> max_load) {
ap_log_error(APLOG_MARK, APLOG_ERR,0,NULL,
"load is too high %f/%d ...\n", la, c->max_load);
return HTTP_SERVICE_UNAVAILABLE;
}
}
close(fd);

return DECLINED;
}

static void
load_register_hooks (apr_pool_t * p)
{
ap_hook_access_checker(load_handler,NULL,NULL,APR_HOOK_FIRST);
}

module AP_MODULE_DECLARE_DATA load_module =
{
STANDARD20_MODULE_STUFF,
NULL, /* per-directory config creator */
NULL, /* dir config merger */
create_config, /* server config creator */
NULL, /* server config merger */
load_cmds, /* command table */
load_register_hooks
};
 
Voltar
Superior