Publicado el Sábado 28 de Abril del 2007 @ 23:16 por Armonth.
A menudo los que usamos un servidor compartido tenemos un problema de fondo: si la compañía de hosting abusa a la hora de “apiñar” gente en una misma máquina a la larga acabará saturada.
Otro problema de usar servidores compartidos es que si bien los planes para controlar el consumo pueden ser “razonables” siempre puede aparecer un usuario que por desconocimiento (o malicia…) sature el servidor con algún script mal optimizado o algo similar.
En general yo puedo decir que con Dreamhost aunque esté en un compartido estoy muy contento, sé que a algunas personas no les ha ido bien pero a la mayoría que conozco no les ha dado ningún problema.
El caso es que normalmente los servidores ocultan los procesos ejecutándose actualmente que no son tuyos (los procesos se pueden ver con — por ejemplo — el comando ps -ax). Esto aparte de ser una medida de seguridad es una comodidad: es de locos buscar entre cientos de procesos los tuyos (aunque bien es cierto que siempre podríamos usar top + u para ver sólo los de un usuario).
Vamos a ver las formas más habituales de mirar la saturación de una máquina, principalmente en GNU/Linux.
Una forma interesante de ver la carga de tu servidor es con uptime un “clásico” de los comandos que ya de paso te dice el tiempo que la máquina lleva encendida, veamos el de mi servidor:
11:27:21 up 43 days, 22:39, 6 users, load average: 5.61, 5.39, 5.25
Cabe aclarar que la “carga de tu servidor” no es el % de CPU usándose en ese momento, si no el número de procesos en la cola de procesos listos para ejecutar.
Según ese uptime lleva 43 días, 22 horas y 39 segundos online. Los valores son en el último minuto 5.61 de carga, en los últimos 5 minutos 5.39 y en los últimos 15 minutos 5.25.
Podemos decir que una carga de 0 a 4 es razonable, de 4 a 6 moderada y 6 o más es alta. También hay que aclarar que son valores totales o al menos creo que en GNU/Linux y BSD es así (tengo entendido que en algunos Unix varía) por lo que si tenemos más de una CPU hay que dividir la carga por el número de procesadores.
Ahí también tengo la duda de que si eso incluye los DualCore ya que son 1 microprocesador con doble núcleo, al menos la máquina donde estoy alojado en Dreamhost es un AMD Opteron (Dual Core) por lo que en teoría la carga sería 5.61 / 2 = 2.80.
La forma de ver la CPU es leyendo el fichero /proc/cpuinfo por ejemplo con cat /proc/cpuinfo y nos saldrá el número de microprocesadores que “encuentra” con toda la información, si es un microprocesador simple pues saldrá información de un microprocesador, si es DualCore o un Pentium 4 con HyperThreading saldrán dos (y seguramente idénticos) o más si ya hablamos de algo más potente.
Apuntes sacados a Ricardo Galli: depende del tipo de carga, si es por muchas aperturas de sockets aguanta mucho más que por E/S. El Apache cuando se sobrecarga genera cargas muy altas por la cantidad de cambios de contexto que genera.
Varía en lo que hace, si tienes 200 de carga (un valor aparentemente alto) y Apache sólo sirve ficheros estáticos, aguantará bien aunque sea alto, si es dinámico y BBDD estará hecho una mierda.
El Load average de por sí no sirve para saber si “está bien”, es sólo orientativo, hay que mirar otras cosas, por ejemplo el tiempo de espera (wait) y el uso real de la CPU, ambas se pueden ver en el top o en el vmstat.
Valores altos de waits significa que se está perdiendo mucho tiempo esperando por E/S, por ejemplo una bbdd mal diseñada o sobrecargada y el wait hace subir exponencialmente los procesos apaches, que a su vez hacen subir la carga.
Está es fácil: con “free” aunque mejor todavía ejecutar free -m para verlo en megabytes. Aquí lo único que hay que tener en cuenta es que no hay que mirar la memoria libre.
GNU/Linux (y supongo que el resto de Unix más o menos igual) usan toda la memoria RAM posible y mantienen datos “en cache”, por ejemplo si abrimos un programa y lo cerramos se mantendrá en memoria RAM “cacheado” y si lo vuelves a abrir en lugar de volver a acceder al disco duro lo abrirá desde RAM.
Si una aplicación de repente necesita más RAM de la disponible pues el sistema liberará la memoria usada para datos cacheados “por si se vuelven a usar” y llegado a cierto punto empezará a “raspar” memoria SWAP (memoria de intercambio) es decir usará una una partición o un fichero del disco duro como si fuera más memoria RAM.
La forma correcta de ver la memoria es viendo el valor buffers/cache, un ejemplo en mi máquina (PC de trabajo):
total used free shared buffers cached
Mem: 504 494 9 0 12 313
-/+ buffers/cache: 169 335
Swap: 0 0 0
Medio GB de RAM, se ha usado casi todo pero 313MB están cacheados, “en uso” realmente están 169.
En el caso de la máquina de Dreamhost obviamente está bastante más cargada, 4GB de ellos 2GB cacheados, 1.6GB en buffers y 170MB libres (y raspa de swap pero no mucho: máximo 500MB).
El mayor cuello de botella en un PC doméstico para acceder a Internet suele ser la conexión y la tarjeta ethernet pero para ejecutar aplicaciones la lectura a disco, en un servidor no es tan raro que debido a algunas operaciones (aún estando bien de CPU, RAM y ancho de banda) el rendimiento caiga por tener que esperar a operaciones de I/O (input/output) o en cristiano: esperar para poder acceder al dispositivo, en este caso el disco duro.
Para ello tenemos iostat (forma parte del paquete “sysstat” en Debian/Gentoo) que nos da mucha información:
avg-cpu: %user %nice %sys %iowait %idle
56.75 1.25 10.80 0.00 31.21
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 15.99 43.91 314.65 167088814 1197432548
sda1 0.43 6.40 1.14 24337978 4331616
sda3 12.30 35.72 244.97 135949674 932259906
sda5 0.08 1.63 1.79 6185976 6803424
sda6 0.00 0.00 0.00 8 0
sda7 0.00 0.00 0.00 8 0
sda8 3.18 0.16 66.75 615130 254037602
Los datos ordenados por dispositivos, sinceramente y con todas las palabras no tengo ni puta idea de qué significan (o mejor dicho: qué valores son normales), pero lo interesante es la parte avg-cpu: nos dice el % de CPU usado en procesos en espacio de aplicación (%user), en espacio de aplicación pero con valores “nice” para darles mayor o menor prioridad (%nice), en espacio de kernel (%sys) y los que nos interesan:
Cualquier cosa a añadir/mejorar, correcciones, dudas y demás comentarios como siempre son bien recibidos. Por otro lado este artículo bien se podría haber llamado “Cómo saber si una máquina con GNU/Linux está saturada… y dónde están sus cuellos de botella” o incluso más génerico, que muchos Unix tienen comandos iguales o similares.
PD: Si tu hosting es tan receloso que ni siquiera te permite ver datos tan inocuos pero interesantes como los devueltos por /proc/cpuinfo, free, iostat, etcétera, mejor cambiate de hosting ;).
Creo que un día de estos voy a tener que leerme una buena guía para aprender a manejarme con una linea de comandos. Por cierto, muy útil esta mini-guia para poder saber lo saturados que están nuestros hostings.
Por mi experiencia en Dreamhost (larga y de varias cuentas) pude comprobar que tu estadía con ellos depende mucho de en que servidor te tiren. Algunos son un lujo, van bárbaro y pocas veces se caen, y hay otros que no pasan la semana de uptime sin tener algún problema.
Y aparte hay que tener en cuenta otra cosa (siempre hablando de DH): Por más que estés en un servidor web específico, tus mails están en otro y las bases de datos en otro (y no se si los archivos en varios más), por lo que el rendimiento de tu hosting va a depender del buen funcionamiento (y no-stauracion) de tres o más servidores, lo que aumenta la probabilidad de fallas.
Pues yo pensaba que el estar los servicios en distintos servidores era mejor (excepto a la hora de configurar alguna página que no sirve con ponerle localhost como dirección de la base de datos XD) porque si tienen un servidor para archivos, otro para bases de datos… lo lógico sería que cada uno esté optimizado para su función en concreto tanto en hardware (los de DB con mas CPU y RAM, los de archivos con buenos discos duros…) como en software, ya que si un servidor solo hace una cosa solo tendrá que tener un par de programas y por tanto cualquir problema debería ser mucho mas fácil de solucionar.
Soy un novato en esto y tengo contratado hosting en varios sitios, entre ellos site5.
¿Qué tengo que hacer para poder introducir los comando que dices?
Gracias de antemano por la ayuda.
Muy práctico
El problema que yo veo en Dreamhost son la cantidad de microcortes que se producen y algunos cortes largos tambien que a veces duran horas, aunque estos se producen rara vez
armonth, desde mi punto de vista la mejor forma de ver la carga de un servidor es el vmstat.
Muy buen artículo, hace unas semanas que tarda en cargar mi pagina en Dreamhost. Hice el uptime y el ultimo valor que me dió es de 9,41… bastante mal… y eso que ninguna de las páginas tienen mucho tráfico continuo.
hay alguna forma de solventar esto?
jeje, si, es posible, pero no es la unica web, no es uqe tarde, en eso estoy deacuerdo, es muy pesada, pero bueno ya lo veré.
pero el gran problema es que todas ms paginas a veces se trabaan y no cargan siquiera el doctype, se ve que el pedido en el servidor a veces queda un poco trabado, no se, si pero no sucede siempre sino aleatoriamente. si quieres te paso una lista como para que veas, pero no quiere decir que no te carguen cuando lo pruebes, si no que a veces no carga, en 24×7 me marca timeout como 5 veces por dia, eso no es normal. Fijate en www.franjafadu.com.ar que tampoco uso mucha imagen, pero se cuelga…
Sin dudas hay varios truquitos que entre todos ayudan a mejorar el rendimiento del servidor. Yo recomiendo usar Phpsuexec. php se ejecuta como un script de usuario y no como un nobody. Así si algún sitio causa problemas no afecta a los demás alojado en el mismo servidor.
bueno, he instalado wp-cache, yo antes lo usaba pero luego de repetidos post sobre la inseguridad de tal plugin lo he sacado y nunca volvi a pensar en el ;)
por otro lado, los logs que me da dreamhost son un o de accesos y otro de errores, a esos te refieres?
gracias nuevamente.
Process CPU seconds user machine count average
php5.cgi 158.1300 99.994% 0.659% 869 0.182
bash 0.0100 0.006% 0.000% 2 0.005
sendmail 0.0000 0.000% 0.000% 1 0.000
bash 0.0000 0.000% 0.000% 1 0.000
iostat 0.0000 0.000% 0.000% 1 0.000
cat 0.0000 0.000% 0.000% 1 0.000
uptime 0.0000 0.000% 0.000% 1 0.000
postdrop 0.0000 0.000% 0.000% 1 0.000
free 0.0000 0.000% 0.000% 1 0.000
vmstat 0.0000 0.000% 0.000% 1 0.000
———————————————————————-
Total: 158.1400 100.000% 0.659% 879
Average per day: 158.1400 1 days
CPU percentage assumes 24000 cpu seconds per day total.
en un servidor compartido utlizando wordpress hasta cuantas visitas diarias soparta sin saturar el cpu?