Ir a contenido


Foto
- - - - -

Cómo Evitar Q Un Simple Script Colapse La Máquina?


  • Please log in to reply
12 replies to this topic

#1 danipage

danipage

    Super Advanced Member

  • Hentais
  • PipPipPip
  • 1701 Mensajes:

Escrito 04 January 2005 - 03:50 PM

Opción uno: matar al scripter q hizo un script php q devolvía 5000 y pico registros de la base de datos mysql cada vez q un usuario visitaba la página correspondente, consiguiendo un load average de 63 :kazka: antes de matar al server :guu1:

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 Deadsunrise

Deadsunrise

    Speunaigh

  • Admin
  • 27632 Mensajes:

Escrito 04 January 2005 - 03:59 PM

Arregla la query, usa algun tipo de cache. Puedes matar un proceso si sobrepasa X recursos, los que hacen el apt y sim creo que tenian algun programilla chulo que cada X minutos comprobaba la carga de sistema, el numero de procesos de cada programa y los reiniciaba si hace falta.

#3 Deadsunrise

Deadsunrise

    Speunaigh

  • Admin
  • 27632 Mensajes:

Escrito 04 January 2005 - 04:00 PM

para hacer lo que dices deberias tirar de virtuozzo o algun sistema de virtual hosts.

#4 danipage

danipage

    Super Advanced Member

  • Hentais
  • PipPipPip
  • 1701 Mensajes:

Escrito 04 January 2005 - 04:04 PM

Thanx, joer, este foro Linux es bastante mejor q unos cuantos ahí fuera :)

#5 danipage

danipage

    Super Advanced Member

  • Hentais
  • PipPipPip
  • 1701 Mensajes:

Escrito 04 January 2005 - 04:49 PM

Buscando buscando he topado con esto: http://www.linuxjunk...itor-HOWTO.html

Y con esto otro, q parece bastante interesante: http://cr.yp.to/daemontools.html

#6 Issun Boushi

Issun Boushi

    Advanced Member

  • Hentais
  • PipPip
  • 325 Mensajes:

Escrito 04 January 2005 - 04:58 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

<{POST_SNAPBACK}>

Lo puedes hacer de varias formas:

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 danipage

danipage

    Super Advanced Member

  • Hentais
  • PipPipPip
  • 1701 Mensajes:

Escrito 04 January 2005 - 09:31 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 (las cosas tan wapas q se pueden hacer con apache) para poder meter 20.000 cutre-hostings de 20 megas en la misma máquina sin q se caiga (cuando lo sensato sería meter 200-400 vhosts pasivos, de esos q no dan guerra xDD, bueno, dependiendo de la máquina), era un truco mu shulo con mod_rewrite q vi en apache.org (no me acuerdo mu bien, pero creo q podéis imaginar por donde van los tiros)

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 :D (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 Issun Boushi

Issun Boushi

    Advanced Member

  • Hentais
  • PipPip
  • 325 Mensajes:

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

<{POST_SNAPBACK}>


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 danipage

danipage

    Super Advanced Member

  • Hentais
  • PipPipPip
  • 1701 Mensajes:

Escrito 05 January 2005 - 12:16 AM

mmm, el caso es q el proceso mysqld era el q se ponía a chupar muchísimo de CPU (y poco de memoria), pero no estoy seguro de si el problema era la query q pedía 5.000 y pico registros (se supone q el mysql le devuelve al script un puntero al primer registro ¿no?*, pero claro, no se hasta q punto será prohibitiva la operación de SELECT en sí repetida unas cuantas veces de forma concurrente, apuesto a q la bbdd no tenía ni los índices apropiados creados), o el "loop" del script encargado de mostrarlos; voy a ver si me entero de eso y/o hago alguna pruebecilla

*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 danipage

danipage

    Super Advanced Member

  • Hentais
  • PipPipPip
  • 1701 Mensajes:

Escrito 05 January 2005 - 12:33 AM

para hacer lo que dices deberias tirar de virtuozzo o algun sistema de virtual hosts.

<{POST_SNAPBACK}>


joer, q buena pinta los VPS del Virtuozzo: http://www.sw-soft.c...tuozzo/hsp/vps/

#11 Guest_sceibe_*

Guest_sceibe_*
  • Guests

Escrito 05 January 2005 - 11:51 AM

En RH ni idea, en Freebsd sería tremendamente fácil http://www.freebsd.o...s-limiting.html

#12 danipage

danipage

    Super Advanced Member

  • Hentais
  • PipPipPip
  • 1701 Mensajes:

Escrito 05 January 2005 - 12:26 PM

lo primero q tuve fue un VPS FreeBSD, apuesto a q el admin hizo algo así :)

#13 Dhampir

Dhampir

    Hentai-sama

  • Hentais
  • PipPipPipPipPipPipPip
  • 4662 Mensajes:

Escrito 10 January 2005 - 04:01 PM

Estableciendo valores de pico en /etc/security/limits.conf tb ayuda.

Imagen enviada
"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