SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 24 de diciembre de 2009

Diferencias entre LDOM, Dynamic System Domains y Solaris Zones

Introducción
En la actualidad el tema de la virtualización está más de moda que nunca, sin embargo, cuando hablamos de las diferentes tecnologías que Sun Microsystems nos aporta tenemos algunos problemas para ver las diferencias. Por ello, he creado este post con la intención de mostrar todos los tipos de virtualización que nos ofrecen y las principales diferencias entre ellos.

Tipos de Virtualización
Antes de comenzar con el post sobre las diferentes soluciones, vamos a definir qué tipos de virtualización o particionamiento disponemos. Yo las he clasificado en tres tipos:
  • Electrical. Particionamiento a nivel más bajo de máquina que se produce por una división eléctrica de los componente de forma que son completamente independientes
  • Firmware. Particionamiento a nivel de firmware que produce una separación lógica dentro del controlador del sistema (sin entrar en el Sistema Operativo)
  • Software. Particionamiento o Virtualización de los recursos del sistema mediante la separación lógica por software dedicado
Partición Eléctrica, Dynamic System Domains
Este tipo de particionamiento está incluido en la gama alta de Sun y también es conocido como Dominios <en el argot castellano>. Cada servidor está compuesto de una o varias Physical System Board  (PSB) y cada una de estas PSB puede estar lógicamente dividida en 1 unidad (no dividida) o lógicamente dividida en cuatro unidades. Si no está dividida, entonces se hace referencia como Uni-XSB; si está lógicamente dividida en cuatro, se hace referencia como Quad-XSB. Cada una de las divisiones lógicas se llama Extended System Board (XSB).

Un dominio puede estar compuesto con cualquier combinación de XSB disponibles en el sistema. Debemos tener en cuenta, que esta definición de partición lógica por PSB se aplica a high-level (M8000/M9000) en entry-level(M3000/M4000) una PSB siempre es Uni-XSB, en definitiva, una XSB debe ser CPU+RAM+IO.

Vamos a ver si podemos explicar este detalle con mayor claridad. Si tenemos una M4000 con dos SysB cada una de ellas con 2 CPU UltraSPARC VII QuadCore y 32Gb cada una (un total de 64Gb), como hemos explicado antes, es necesario tener CPU+RAM+IO y no es divisible, así que en el caso de la M4000 al contar con 2SysB es como si la máquina estuviese partida en dos partes simétricas y por lo tanto, eléctricamente divisibles, así que esta máquina soporta hasta 2 dominios siendo las configuraciones posibles las siguientes:
  • Un único dominio
1[2]SysB+32[64]GB RAM+IO (Dominio1)
  • Dos dominios
1SysB + 32GB RAM + IO (Dominio1)
1SysB + 32GB RAM + IO (Dominio2)
Si por el contrario sólo disponemos de una única SysB, únicamente podemos hacer un dominio, además las configuraciones mezcladas no están soportadas, por ejemplo, dominioA 3CPU+(32+16GB RAM), dominioB 1CPU + 16GB RAM, ya que la división tiene que ser "lineal"



 Así mismo, cada máquina que soporta Dynamic System Domains tiene sus propias limitaciones y os recomiendo leer la documentación específica de cada una de ellas.

Este tipo de particionamiento nos proporciona redimensionado en caliente de los recursos de los dominios y, además, una separación completa de máquinas. En definitiva, hemos partido nuestro chasis en n máquinas completamente independientes, por lo tanto, con diferentes kernel, parches, etc.

Firmware, LDOMS Logical Domains
Un escalón por encima nos encontramos LDOMS <Logical Domains> que nos proporciona una virtualización a nivel de firmware y por lo tanto, en teoría muy estable. Este tipo de virtualización nos proporciona aislamiento e independencia de kernel ya que estamos exponiendo un boot enviroment diferente para cada uno de los dominios.

Este tipo de virtualización está compuesta de una parte a nivel de firmware y una instalación de Solaris especial llamada Domain Controller que será la encargada de gestionar los Logical Domains creados. Podemos comparar <aunque no es exactamente igual> este tipo de vitualización a la que se realiza con VMWare ESX ya que nuesto SPOF <Single Point Of Failure> se encuentra en esta instalación concreta de Solaris que hace de Controlador, puesto que si se produce un panic en él, los Logical Domains dejarán de ser operativos.

Dentro de esta arquitectura, nuestro hypervisor se encuentra a nivel de firmware, y nuestro control domain <primary> a nivel de Sistema Operativo, en definitiva, podemos decir que nuestro Control Domain es el encargado de gestionar los dominios y comunicarse con el firmware.

Existe diferentes tipos de Logical Domains, como ya hemos comentado siempre debe existir como mínimo el Domain Controller y a partir de aquí podemos tener los siguientes tipos:
  • Control Domain. Gestiona los Dominios y se comunica con el Firmware. Siempre debe existir uno.
  • Service Domain. Proporciona servicios al resto de los dominios, como por ejemplo, red virtual, discos virtuales, etc. Este tipo de dominios son los productores de servicios
  • IO Domain. Este tipo de dominio tiene acceso directo al IO, por ejemplo, PCI, NIC, etc. y puede compartir <exportar> el servicio si quiere
  • Guest Domain. Este tipo de dominio hace uso de los servicios proporcionados por los demás, es decir, es un consumidor y es gestionado por el Domain Controller
Este tipo de virtualización nos permite redimensionado en caliente, y diferentes versiones de kernel, parches, etc. El comportamiento del firmware proporciona un OpenBoot diferente para cada uno de los lógical domains y, teóricamente, es posible instalar "cualquier" Sistema Operativo con arquitectura SPARC.

Además, el soporte de LDOMS en la actualidad sólo está disponible para los procesadores UltraSPARC T1, T2 y T2+.

Software, Solaris Zones
Aunque es el método de virtualización probablemente más conocido de Sun, como ya hemos comentado antes no es el único. Las Zonas de Solaris nos permiten instanciar el Sistema Operativo con diferente configuración de: Hostname, ip, users, devices

De esta forma, tenemos un único kernel  compartido aunque aislado. Un panic en una zona "no tiene" por qué afectar a otra. Sin embargo, seguimos teniendo el mismo SPOF, en este caso, la instalación base del sistema.

Esta funcionalidad es la suma de Resource Manager más Kernel Isolation introducida en la versión 10 de Solaris. Cada instalación de Solaris 10, tendrá como mínimo una zona global y tantas zonas non-global como queramos <o pueda nuestro host>

Al igual que sucede con LDOMS, nuestra zona global será la encargada de gestionar las demás y, a diferencia de LDOMS aquí no hay productores y consumidores.

La principal diferencia, a parte del kernel compartido, está en la reconfiguración dinámica que no es posible. Es necesario reiniciar para que cualquier cambio en la configuración de la zona se vea reflejada.

Podéis encontrar más información en algún post sobre Gestión Básica de Zonas.

    Software, VirtualBox
    Por último, sólo nos queda comentar el hypervisor de Sun para tecnologías x86 similar a VMWare. Por ello, no vamos a entrar en hacer un análisis detallado ya que asumo que la tecnología de VM es conocida por todos.

    Y ... cuál utilizo?
    Bueno, esto es una pregunta con dificil respuesta. Depende mucho de: Dinero y Necesidades. Si tenemos necesidades de reconfiguración en caliente,por ejemplo tenemos mucha carga de CPU la última semana del mes y el resto es mínima, y disponemos de arquitectura Mx000, entonces, nuestra solución pasa por utilizar dominios.

    Si queremos consolidar aplicativos web, correo, j2ee y tenemos máquinas CMT aka T1, T2 o T2+ la solución pasa por utilizar LDOMS y sobre algunos Solaris Zones.

    Por último, si queremos trastear y necesitamos entornos de pruebas rápidos y sencillos, las zonas son nuestro gran aliado.

    Y mi RDBMS dónde encaja? Bien, mi recomendación es que no se sitúe Oracle en Zonas de Solaris si estamos en un momento de expansión ya que Existen Problemas y Limitaciones de Oracle en Zonas además, si disponemos de hardware SPARC y necesitamos alta disponibilidad, es más fácil otro tipo de Soluciones.

    Conclusión
    Espero no haber soltado un rollo muy largo, pero creo que una explicación sobre las diferentes posibilidades que nos ofrece Sun son muchas y variadas, más allá de las Zonas de Solaris. Además, prometí que escribiría sobre el tema, y así lo he hecho,

    Las ilustraciones han sido obtenidas de los documentos de Sun Microsystems "Guide to LDOMS" y "Mx000 Administation Guide"

    Referencias

    miércoles, 23 de diciembre de 2009

    Cómo ver Uso CPU por Procesador

    Introducción
    Solaris nos ofrece el comando <prstat> para poder ver el uso de cpu, memoria, cola de procesos, etc.  sin embargo, puede que nos interese saber qué cpus (o cores) se encuentran más saturados, para ello, deberemos utilizar el comando <mpstat>

    Al igual que sucede con los comando xxSTAT (iostat, vmstat, prstat) tiene dos argumentos opcionales <intervalo> y <número de muestras>, recordar que si establecemos un intervalo inferior a 6, podemos estar interfiriendo en la muestra.

    Si utilizamos el comando sin ningún argumento, entonces, se nos mostrará la media desde el último boot time, por ejemplo,
    # mpstat
    CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
      0   11   0  233    11    6  126    1   11    4    0   137    5   0   0  95
      2    9   0  227   353   55  140    1   10    4    0   120    3   0   0  96
     16    8   0   69    19   15   73    1    7    4    0   105    5   0   0  94
     18    7   0  110    98   52  101    1    7    4    0   120    4   0   0  96

    Ahora vamos a obtener tres muestras en intervalos de 6 segundos
    # mpstat 6 3
    CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
      0   11   0  235    11    6  126    1   11    4    0   137    5   0   0  95
      2    9   0  228   353   55  140    1   10    4    0   120    3   0   0  96
     16    8   0   69    19   15   74    1    7    4    0   105    5   0   0  94
     18    7   0  110    98   52  101    1    7    4    0   120    4   0   0  96
    CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
      0   26   0 6364    12    6  307    2   26   14    3   529    6   1   0  92
      2  127   0 3823   736  133  229    5   28   12    1   517   21   1   0  78
     16   13   0 1554    12    6  177    2   13   16    1   280   16   1   0  84
     18   38   0 2164   161  152  271    3   15   11    1   331   18   1   0  81
    CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
      0    0   0 3991    14    6  543    2   40   32    1   330    2   2   0  96
      2    0   0 1311  1125  171  320    2   35   15    1   235   13   1   0  86
     16    0   0 1214    12    6  259    1   16   38    0   168    4   1   0  96
     18    1   0  550   292  278  199    6   10    9    1   440   40   1   0  59
    La definición de las columnas será la siguiente, aunque te recomiendo que leas el man page
    • CPU, Nº de CPU
    • csw, Context SWitch
    • icsw, Involuntary Context SWitch
    • usr, Tiempo de Usuario
    • sys, Tiempo de Sistema
    • wt, IO working time
    Debemos prestar atención a los valores de icsw y wt ya que estos nos dirán si tenemos bien dimensionada la máquina.

     Referencias

    martes, 22 de diciembre de 2009

    Cómo Poner un Banner SSH en Solaris 10

    Introducción
    Una de las medidas de seguridad es incluir un Banner de Aviso cuando un usuario intenta acceder al sistema mediante SSH, para ello, simplemente deberemos editar el archivo </etc/ssh/sshd_config> y en la propiedad <Banner> asignaremos un archivo de texto existente

    Si queremos que una vez logeado en el sistema, podemos hacer que se muestre nuesto motd con las informaciones que consideremos necesarias, veamos un ejemplo

    # echo "Bienvenido al Sistema de SafeChildren" > /etc/issue
    # vi /etc/ssh/sshd_config
         Banner /etc/issue
         PrintMotd no
    :wq

    # pkill -HUP sshd

    Al logearnos, nos mostrará lo siguiente:
    $ ssh test@test.sfchildren.com
    Bienvenido al Sistema de SafeChildren
    Contraseña:
     Referencias

    lunes, 21 de diciembre de 2009

    Cómo Saber el Tipo de Archivo 64bits o 32bits en Solaris

    Introducción
    Para saber si un tipo de archivo binario de Solaris es de 64bits o de 32bits, simplemente deberemos utilizar el comando <file>
    $ file squid
    squid:          ELF 64 bits MSB ejecutable SPARCV9 Versión 1, enlazado dinámicamente, no quitado
    $ file /usr/bin/bash
    /usr/bin/bash:  ELF 32 bits MSB ejecutable SPARC Versión 1, enlazado dinámicamente, quitado
     Referencias

    viernes, 18 de diciembre de 2009

    Instalar Apache Mod GZip Solaris 10 64bits

    Introducción
    Vamos a instalar mod_gzip sobre Apache 1.3.41 en Solaris 10 en 64bits para, continuando con la serie de Optimización de páginas web en Solaris, en esta ocasión nuestro objeto será optimizar el tamaño de transferencia de nuestras páginas web.

    Este módulo nos va a permitir comprimir las páginas "al vuelo" utilizando el formato de compresión GZIP. Los navegadores actuales, soportan el envío de páginas web en formato gzip de forma nativa, y por lo tanto, no deberemos hacer ningún cambio en los clientes.

    El servidor Apache será el encargado de decidir si el cliente es capáz de entender el formato comprimido analizando la cabecera Accept-Encoding y verificando que contiene el valor de  gzip o deflate, si tiene esta cabecera, entonces Apache enviará el contenido comprimido en formato gzip, si no es así, lo enviará en formato plano.

    La cabecera que debe contener será la siguiente:
    Accept-Encoding: gzip,deflate
    Al reducir el tamaño a enviar, haremos que nuestro servicio sea más rápido, sin embargo, debemos tener en cuenta que estamos cargando al servidor con el proceso de compresión al vuelo de nuestras páginas web, sin embargo, esto es fácilmente solucionable introduciendo proxys reversos para descargar al Apache.

    Veamos cómo podemos compilar y configurar Mod_Gzip en nuestro Apache 1.3.41 64bits sobre Solaris.


    Nota Importante sobre GCC y Expat en Solaris 10

    Ya os he comentado en post anteriores los problemas que existen al Compilar Apache HTTP Server en 64bits con GCC en Solaris 10, y Problemas de Compilación de Apache HTTP Server y Mod JK con GCC 64bits en Solaris 10, así que os remito a Compilar Apache HTTP Server en 64bits con SunCC en Solaris 10 para poder continuar.

    Si tenéis compilado vuestro Apache con GCC en 64bits, el módulo de mod_gzip no funcionará, aunque compile perfectamente.


    Bajamos y descomprimimos el Source Code de Mod Gzip 
    Podemos descargar el código fuente de mod_gzip desde SourceForge, donde tiene alojada la página principal. Una cosa que nos llama la atención es que la última versión es la 1.3.26a del año 2002, así que es una versión muy estable, :D

    $ wget http://downloads.sourceforge.net/project/mod-gzip/mod-gzip13x/mod_gzip-1.3.26.1a/mod_gzip-1.3.26.1a.tgz?use_mirror=sunet
    $ gtar zxpf mod_gzip-1.3.26.1a.tgz
    Compilamos e Instalamos el Módulo
    Antes de poder compilar el módulo, debemos hacer algunos cambios en el <Makefile> ya que por defecto tiene los modifcadores para GCC, y por lo tanto, debemos adaptarlos a SunCC.

    Así que buscaremos el archivo <Makefile> ubicado en $MOD_GZIP_HOME/Makefile y sustituiremos la entrada del tag <build>
    $(APXS) -Wc,-Wall,-O3,-fomit-frame-pointer,-pipe -c mod_gzip.c mod_gzip_debug.c mod_gzip_compress.c -o mod_gzip.so
    Por la siguiente
    $(APXS) -Wc,-m64 -Wc,-O3 -c mod_gzip.c mod_gzip_debug.c mod_gzip_compress.c -o mod_gzip.so
    Sólo una nota para GCC 32bits
    Para aquellos que tenéis el Apache HTTP Server en 32bits compilado con GCC, el parámetro de optimización se encuentra en su nivel máximo -O3, y este valor provoca que se produzcan muchos coredump, además de ser un nivel que no se debe utilizar según GCC a no ser que se tenga muy testeado. Después de muchos Apaches con mod_gzip instalados, puedo asegurarte que con este flag en 32bits, falla, y falla mucho, así que mi recomendación es dejarlo en -O2 para GCC, por lo tanto, quedaría así:
     $(APXS) -Wc,-Wall,-O2,-fomit-frame-pointer,-pipe -c mod_gzip.c mod_gzip_debug.c mod_gzip_compress.c -o mod_gzip.so

    Además vamos a utilizar el comando <GNU Make> en vez de <Make> y de esta forma, nuestro mod_gzip no nos dará problemas (aunque con <make> tampoco protesta ;) )
    $ cd mod_gzip-1.3.26.1a
    $ gmake APXS=/opt/www/apache-1.3.41/64/bin/apxs
    $ su
    password:
    # gmake APXS=/opt/www/apache-1.3.41/64/bin/apxs install
    /opt/www/apache-1.3.41/64/bin/apxs -A -i mod_gzip.so
    [preparing module `gzip' in /opt/www/apache-1.3.41/64/conf/httpd.conf]
    cp mod_gzip.so /opt/www/apache-1.3.41/64/libexec/mod_gzip.so
    chmod 755 /opt/www/apache-1.3.41/64/libexec/mod_gzip.so
    cp /opt/www/apache-1.3.41/64/conf/httpd.conf /opt/www/apache-1.3.41/64/conf/httpd.conf.bak
    cp /opt/www/apache-1.3.41/64/conf/httpd.conf.new /opt/www/apache-1.3.41/64/conf/httpd.conf
    rm /opt/www/apache-1.3.41/64/conf/httpd.conf.new
    Configuración Mog Gzip
    Dentro del directorio donde hemos descomprimido mod_gzip <MOD_GZIP_HOME> encontraremos un archivo de ejemplo <mod_gzip.conf.sample> que podemos utilizar para ir comprobando el funcionamiento. Podemos copiar este template en $APACHE_HOME/conf/extra/modules/mod_gzip.conf y utilizando la directiva <Include> de configuración de Apache podemos añadirlo tanto a nuestro servidor principal, o a los VirtualHost que deseemos, por ejemplo podemos tener lo siguiente en nuestro $APACHE_HOME/conf/http.conf
    #############################################
    # CARGA DE MODULOS
    #############################################
    LoadModule gzip_module        libexec/mod_gzip.so
    #################################################
    ## MOD_GZIP
    #################################################
    Include conf/extra/modules/modgzip.conf

    Conclusiones
    Salvo el problema con GCC en 64bits, la instalación de mod_gzip en Solaris 10 no es más complicada que otro módulo, además nos permite utilizarlo de forma muy flexible sólo en aquellos lugares donde nos interese.

    Recordar que debemos comprobar el rendimiento obtenido mediante Pruebas de JMeter para Web y de esta forma, ver cómo vamos mejorando <o no> nuestro sistema desde la base

    Referencias