Renuncia de responsabilidad:
La versión original de este artículo fue publicada por IBM
developerWorks y es propiedad de Westtech Information Services. Este
documento es una versión actualizada del artículo original y contiene
mejoras introducidas por el Equipo de Documentación de Gentoo.
Este documento carece de soporte activo.
|
Maximizar el intercambio
1.
Conseguir mejorar el intercambio
Cuando se configura un nuevo servidor Linux, ¿creamos una sola partición de
128MB de intercambio? De hacerse así, hemos de saber que se está limitando
seriamente el rendimiento del espacio de intercambio (swap). ¿Se quiere
incrementar el rendimiento del intercambio en varios órdenes de magnitud y
crear particiones de intercambio de más de 1 GB? Es posible, no requiere
parches en el kernel ni un equipo especial, únicamente, saber cómo hacerlo.
A muchos no debería preocuparles el intercambio. Después de todo, los sistemas
Linux son muy eficientes en el manejo de la memoria, y el intercambio rara vez
se toca mínimamente. Mientras que esto es completamente cierto en estaciones de
trabajo o escritorios, los servidores son otra historia. Los servidores pueden
a llegar a situaciones muy complejas inesperadamente, como procesos fuera de
control, ataques de denegación de servicio e incluso pueden sufrir el efecto
barrapunto, por tanto necesitan tener un adecuado intercambio de alta velocidad
para que no dejen de funcionar o se cuelguen cuando se ocupe toda la memoria.
¿Aún no se está convencido de que es un asunto muy importante? Mostraré lo
sencillo que es hacer que se cuelgue un servidor lanzando una cantidad masiva
de nuevos procesos.
Aviso:
Por favor, si se intenta hacer ésto, ¡ha de hacerse en un servidor que no esté
en producción!
|
Digamos que se tienen dos comandos grep personalizados en /usr/bin
, llamados pedrogrep y juangrep. Ahora, vamos a asumir que
pedrogrep es sencillamente un archivo de comandos (shell script) que
llama al ejecutable ELF juangrep, como sigue:
Listado de Código 1.1: El archivo de comandos pedrogrep |
#!/bin/bash
juangrep -r $*
|
Todo parece correcto hasta aquí, ¿pero qué ocurre si de repente juangrep
es reemplazado con un enlace simbólico a pedrogrep? Bien, en este caso,
ejecutar pedrogrep o juangrep causará un bucle infinito,
originando el lanzamiento de cientos de procesos bash en pocos segundos. Ésto
me ha ocurrido una vez, y deben creerme, ¡dueleee!
Si un servidor no tiene un intercambio adecuado, una situación como esta puede
causar que el servidor se bloquee en mucho menos de un minuto. ¿Cómo
solucionamos el problema? Una forma es incrementar el tamaño del espacio de
intercambio más allá de 128 MB. Afortunadamente para nosotros, ya no existe el
límite de 128 MB de swap bajo los núcleos 2.2.x+ o posteriores, como existió en
el pasado. ¡Los límites actuales son de aproximadamente 2 GB en sistemas x86,
PowerPC y MC680x0, 512 MB en sistemas MIPS, 128 GB en Alpha, y de nada menos
que 3 terabytes en plataformas UltraSparc!
Listado de Código 1.2: Tamaño límite de la partición swap en núcleos Linux modernos |
x86 2 Gigabytes
PowerPC 2 Gigabytes
Motorola 680x0 2 Gigabytes
Sparc 1 Gigabyte
MIPS 512 Megabytes
Alpha 128 Gigabytes
UltraSparc 3 Terabytes
|
Mientras que es bueno poder incrementar el tamaño de la partición de
intercambio más allá de 128 MB, ¿qué hay acerca de incrementar el rendimiento?
Idealmente, sería fenomenal si podemos configurar las particiones swap en
bandas RAID 0 (stripe), para que las escrituras y lecturas se distribuyan entre
todas las particiones. Si estas particiones se encuentran en unidades separadas
y/o controladoras, multiplicará el rendimiento del espacio de intercambio,
permitiendo a los servidores manejar la utilización de memoria temporal usando
"pequeños impulsos" sin reducir demasiado su rendimiento.
Afortunadamente, todos los núcleos modernos Linux, por defecto (sin opciones
especiales en el núcleo ni parches) permiten hacer el espacio de intercambio
paralelo, como si fuera una banda RAID 0. Usando la opción pri en
/etc/fstab para configurar varias particiones swap con la misma
prioridad, le decimos a Linux que las use en paralelo:
Listado de Código 1.3: Configurar múltiples particiones swap con la misma prioridad |
/dev/sda2 none swap sw,pri=3 0 0
/dev/sdb2 none swap sw,pri=3 0 0
/dev/sdc2 none swap sw,pri=3 0 0
/dev/sdd2 none swap sw,pri=1 0 0
|
En el ejemplo anterior, Linux usará las particiones swap sda2, sdb2 y sdc2 en
paralelo. Dado que dichas particiones se encuentran en diferentes unidades y,
posiblemente, en diferentes controladoras SCSI, la velocidad de lectura y
escritura alcanzará fácilmente el triple. La cuarta partición swap, sdd2, se
usará únicamente cuando las tres primeras se hayan ocupado casi por completo.
La opción pri es realmente fácil de usar. La prioridad debe ser un
número entre 0 y 32767, siendo 32767 la mayor prioridad. Las particiones de
intercambio se usarán desde la mayor prioridad a la menor, significando que una
partición con una prioridad x sólo será usada si todas las particiones con una
prioridad mayor que x ya están llenas. Si varias particiones tienen la misma
prioridad, Linux hará paralelo el acceso a ellas automáticamente. Esto nos
permite no sólo paralelizar el intercambio, sino también asignar una mayor
prioridad de acceso a las particiones en las unidades más rápidas (o en las
partes del disco duro más rápidas) para que sean usadas primero. Así, se puede
configurar una partición de intercambio de emergencia en un viejo y más lento
disco duro, que únicamente será usada cuando las otras particiones más rápidas
se hallan llenado por completo.
Ahora es el momento de poner algo de este conocimiento sobre el espacio de
intercambio en acción.
Recursos
Acerca del autor
Daniel Robbins vive en Albuquerque, New Mexico. Él fué el Presidente/CEO de
Gentoo Technologies Inc., el Arquitecto Jefe del Proyecto Gentoo y contribuye
como autor de varios libros publicados por MacMillan: Caldera OpenLinux
Unleashed, SuSE Linux Unleashed y Samba Unleashed. Daniel se ha visto
involucrado en el mundo de las computadoras de algún modo desde segundo grado
cuando se expuso al lenguaje de programación Logo y a una potencialmente letal
dosis de Pac Man. Ésto probablemente explica porqué ha sido un artista de
gráficos en SONY Electronic Publishing/Psygnosis. Daniel disfruta pasando el
tiempo con su mujer Mary y con su hija, Hadassah. Se puede contactar con Daniel
en Daniel Robbins.
|