Cómo Evitar Q Un Simple Script Colapse La Máquina?
#1
Escrito 04 January 2005 - 03:50 PM
Opción dos: ¿existe alguna forma maravillosa de restringir los recursos (cpu, memoria, etc.) a un usuario / vhost concreto? (los virtual hosts los tengo chrooteados para usuarios específicos, pero comparten toda la memoria y toda la cpu); me gustaría evitar q un simple script fuese capaz de colapsar el servidor completo durante horas
Se me ha ocurrido revisar a fondo la config php, mysql, etc. pero no se yo. O un demonio q bajase la prioridad de los procesos (o los matase directamente), pero tampoco creo q fuese solución. ¿No hay nada parecido a las quotas de disco duro pero para memoria y procesador?
#2
Escrito 04 January 2005 - 03:59 PM
#3
Escrito 04 January 2005 - 04:00 PM
#4
Escrito 04 January 2005 - 04:04 PM
#5
Escrito 04 January 2005 - 04:49 PM
Y con esto otro, q parece bastante interesante: http://cr.yp.to/daemontools.html
#6
Escrito 04 January 2005 - 04:58 PM
Lo puedes hacer de varias formas:Opción dos: ¿existe alguna forma maravillosa de restringir los recursos (cpu, memoria, etc.) a un usuario / vhost concreto? (los virtual hosts los tengo chrooteados para usuarios específicos, pero comparten toda la memoria y toda la cpu); me gustaría evitar q un simple script fuese capaz de colapsar el servidor completo durante horas
Lo más práctico es a nivel de aplicación como dice Deadsunrise. En MySQL puedes limitar el tamaño de las querys, la memoria por proceso y cosas así. Si son CGI, en Apache puedes hacer lo mismo con RLimitCPU y RLimitMem y, si es mod_php, cambiando el max_execution_time y el memory_limit en el php.ini.
Si quieres algo más general, lo puedes hacer a nivel del kernel. En Linux tienes las llamadas al sistema setrlimit() y getrlimit() y la orden ulimit para limitar los recursos a los que puede acceder una shell y los procesos hijos. Con eso puedes limitar el uso de la cpu, el número de procesos, la memoria, los archivos abiertos, el máximo tamaño de los archivos, etc. de cualquier proceso.
Lo malo es que el control con ulimit es a nivel de proceso, así que no puedes distinguir entre usuarios "vip" y normales a no ser que tengas varios procesos Apache y MySQL corriendo. Es decir, que si un cliente de un vhost hace el tonto todos los demás clientes se joden (la limitación es global para todos ellos) pero, si tienes algo más corriendo en el servidor, con eso ni se inmuta.
En realidad la solución más chupi para lo que pides es montar servidores virtuales (maquinón con VMWare Server, UML o, si no, pídele prestado el S/390 a Kujaku ) y un Apache o un Squid por delante que haga de proxy inverso... Pero sólo es apta para los que tengan mucho tiempo libre, o amplios bolsillos para pagar a alguien que sí lo tenga
Este tema ha sido editado por Issun Boushi: 04 January 2005 - 05:00 PM
#7
Escrito 04 January 2005 - 09:31 PM
el panel de control de la máquina es el ENSIM y yo pensaba ingenuamente q los Virtual Sites q se podían montar controlaban estos temas, pero ya he visto q no. Lo digo porque ellos mismos me han recomendao un par de enlaces para mirar:
http://www.rfxnetworks.com/prm.php
http://www.sitesouth...processkill.htm
miraré q se puede tunear a nivel de aplicación y/o si meto algún demonio asesino de procesos por si aparece otro script mal programado (a nivel de proceso creo q no me interesa porque no quiero limitar a saco las güebs q tenemos en la máquina, solo me interesa liquidar los procesos q se salgan de madre)
¡gracias!
#8
Escrito 04 January 2005 - 11:06 PM
jeje, no, si algo de idea de como se lo montan los ISPs tengo, y la verdad es q no se complican la vida, pillan una máquina física para clientes vips montando algunos Virtual Private Servers y otra con un apache twekeado (...) era un truco mu shulo con mod_rewrite q vi en apache.org
Imagino que sería con mod_rewrite y ProxyPass, de manera que el apache trucado resuelve los vhost y hace de pasarela entre la máquina virtual o real que tiene las páginas del cliente. Un proxy inverso.
Otra forma de hacer lo mismo es con Squid en vez de con Apache, con el plus de que puedes cachear los contenidos estáticos (y páginas php pregeneradas) y ahorrar tráfico a las máquinas que haya detrás.
(a nivel de proceso creo q no me interesa porque no quiero limitar a saco las güebs q tenemos en la máquina, solo me interesa liquidar los procesos q se salgan de madre)
Hombre, si no vas a mirar por usuario ni leches (servicio que se salga de madre, servicio que matas y reinicias) sí que te vale hacerlo con ulimit, te explico:
Si usas apache 1.3 puedes hacer un script para llamar al apache tal que:
#!/bin/sh ulimit -t 60 ulimit -H -t 60 httpd
Con eso el apache y cualquier proceso hijo del apache no puede estar más de 60 segundos de cpu haciendo algo. Como el apache 1.3 crea un nuevo proceso hijo por cada petición, en el momento que haya un cgi o código empotrado malvado, el hijo se dispara y el kernel lo mata. El apache (el proceso padre) sigue en pie, aunque la petición falla porque muere el hijo. Con apache 2.0 el tema creo que sería distinto porque es mulihilo.
Por otra parte, para limitar todos los scripts de los usuarios, como los tienes separados y cada uno chrooted y tal, lo puedes hacer en Fedora bastante fácil. No tienes ni que mancharte las manos con scripts: editas el /etc/security/limits.conf, añades los usuarios y los límites que más rabia te den y listo. Ya tienes a los usuarios puteados al margen del puteo del apache.
Con los servidores, el limits.conf puede no ser muy fiable. Los límites se fijan al hacer el login usando PAM, pero puede haber servidores que no usen PAM para cambiar a su usuario. Me suena que apache es uno de ellos (por eso puse el scriptillo de arriba, que funciona fijo) pero no lo sé seguro ahora mismo.
Luego, con daemontools, tienes que ir mirando si algo está caído y reiniciarlo (en el caso del apache no haría falta, pero por si acaso).
Edit: lo que no puedes hacer con ulimit es decirle al apache que las peticiones a las páginas del pepito tienen X restricciones y a las de fulanito Y. Limitas todo a lo mismo. Con apache debería funcionar pero no estoy seguro con MySQL.
Este tema ha sido editado por Issun Boushi: 04 January 2005 - 11:11 PM
#9
Escrito 05 January 2005 - 12:16 AM
*sería lo lógico, no creo q le devuelva los 5.000 y pico resultados de golpe
-edit- mu wapo lo del /etc/security/limits.conf (por aquí gastamos una RHE 3, q nos costaba lo mismo q la Fedora y al final nos fuimos por la distri comercial)
Este tema ha sido editado por danipage: 05 January 2005 - 12:22 AM
#10
Escrito 05 January 2005 - 12:33 AM
para hacer lo que dices deberias tirar de virtuozzo o algun sistema de virtual hosts.
joer, q buena pinta los VPS del Virtuozzo: http://www.sw-soft.c...tuozzo/hsp/vps/
#11 Guest_sceibe_*
Escrito 05 January 2005 - 11:51 AM
#12
Escrito 05 January 2005 - 12:26 PM
#13
Escrito 10 January 2005 - 04:01 PM
"On the edge of the blade, but no one makes the hero bleed."
1 usuarios están leyendo este tema
0 miembros, 1 invitados, 0 usuarios anónimos