Proyectos y Zonas

Page last edited hace 2181 días 3 horas
De Solaris-ES
Saltar a: navegación, buscar

Proyectos[editar]

Que son los proyectos[editar]

La gestión de los recursos de nuestra máquina (CPU, Memoria, Etc) la podemos obtener mediante la utilizacion de los proyectos.
Estos nos permiten trabajar de forma simple e ir ajustando los mismos en caliente segun las necesidades del momento.
Por ejemplo en versiones anteriores de Solaris, la definicion de los semaforos para Oracle se realizaba en el /etc/system, 
esto nos obligaba a que todas las BDs en el equipo utilizaran los mismos y no solo eso, cualquier cambio en uno de ellos 
implicaba un reboot del sistema.
Hoy con los proyectos podemos realizar lo mismo, pero con la granularidad de asignar un proyecto a cada DB del sistema, lo
que nos permitiria tener diferentes configuraciones y si alguna de ellas se tiene que actualizar, esta tarea seria de forma
dinamica sin reiniciar el sistema.

Una definicion que me gusta es la de jjmora.es
Un project define las características de ejecución de un grupo de procesos. Todos los usuarios del sistema están asignados a
uno o varios projects.


Nota: Se explica el funcionamiento de los proyectos ya que es la base para entender como limitar y gestionar
      los recursos dentro de una ZONA de Solaris.

Equivalencia entre /etc/system y los Proyectos[editar]

/etc/system           -> projects
-------------------------------------------------
shmsys:shminfo_shmmax -> project.max-shm-memory
shmsys:shminfo_shmmni -> project.max-shm-ids
semsys:seminfo_semmni -> project.max-sem-ids
semsys:seminfo_semmsl -> process.max-sem-nsems
semsys:seminfo_semopm -> project.max-sem-ops

Creación de Proyectos[editar]

  • Los comandos mas utilizados para trabajar con proyectos son los siguientes:
# projects -l
# projadd ...
# projmod ...
# prctl ...
# id -p
# prstat -J
# newtask
# rcapstat -g
# rcapstat -z
  • Los archivos donde estaran las configuraciones son:
/etc/project
/etc/user_attr
  • Creamos el project para el usuario Oracle
# projadd user.oracle
# cat /etc/user_attr
# cat /etc/project
  • Aplicar los parametros al usuario ORACLE
# projadd -p 200 -c "Project de Oracle" -U oracle \
  -K 'project.max-sem-ids=(priv,4096,deny)' \ *
  -K 'process.max-sem-nsems=(priv,5010,deny)' \
  -K 'project.max-shm-ids=(priv,100,deny)' \ *
  -K 'project.max-shm-memory=(priv,18446744073709551615,deny)' \
  -K 'process.max-sem-ops=(priv,512,deny)' \
  -K 'process.max-file-descriptor=(basic,65536,deny),(priv,65536,deny)' user.oracle

Ejemplo completo de creacion de un proyecto[editar]

  • Definicion del proyecto pkg71 en una sola linea
# projadd -p 104 -c "Proyecto para la BBDD pkg71" -U oracle -G dba \
  -K 'process.max-file-descriptor=(basic,65536,deny),(priv,65536,deny)' \
  -K 'process.max-msg-messages=(priv,8192,deny)' \
  -K 'process.max-msg-qbytes=(priv,65536,deny)' \
  -K 'process.max-sem-nsems=(priv,2048,deny)' \
  -K 'process.max-sem-ops=(priv,512,deny)' \
  -K 'project.cpu-shares=(privileged,25,none)' \
  -K 'project.max-msg-ids=(priv,128,deny)' \
  -K 'project.max-sem-ids=(priv,1024,deny)' \
  -K 'project.max-shm-ids=(priv,256,deny)' \
  -K 'project.max-shm-memory=(privileged,18446744073709551615,deny)' \
  -K 'rcap.max-rss=12g' pkg71
  • Definicion del proyecto pkg71 en multiples lineas
# projadd -p 104 -c "Proyecto para la BBDD pkg71" -U oracle -G dba pkg71
# projmod -sK 'process.max-file-descriptor=(basic,65536,deny),(priv,65536,deny)' pkg71
# projmod -sK 'process.max-msg-messages=(priv,8192,deny)' pkg71
# projmod -sK 'process.max-msg-qbytes=(priv,65536,deny)' pkg71
# projmod -sK 'process.max-sem-nsems=(priv,2048,deny)' pkg71
# projmod -sK 'process.max-sem-ops=(priv,512,deny)' pkg71
# projmod -sK 'project.cpu-shares=(privileged,25,none)' pkg71
# projmod -sK 'project.max-msg-ids=(priv,128,deny)' pkg71
# projmod -sK 'project.max-sem-ids=(priv,1024,deny)' pkg71
# projmod -sK 'project.max-shm-ids=(priv,256,deny)' pkg71
# projmod -sK 'project.max-shm-memory=(privileged,18446744073709551615,deny)' pkg71
# projmod -sK 'rcap.max-rss=12g' pkg71
  • Ver la configuracion del proyecto pkg71
# projects -l
pkg71
        projid : 104
        comment: "Proyecto para la BBDD pkg71"
        users  : oracle
        groups : dba
        attribs: process.max-file-descriptor=(basic,65536,deny),(priv,65536,deny)
                 process.max-msg-messages=(priv,8192,deny)
                 process.max-msg-qbytes=(priv,65536,deny)
                 process.max-sem-nsems=(priv,2048,deny)
                 process.max-sem-ops=(priv,512,deny)
                 project.cpu-shares=(privileged,25,none)
                 project.max-msg-ids=(priv,128,deny)
                 project.max-sem-ids=(priv,1024,deny)
                 project.max-shm-ids=(priv,256,deny)
                 project.max-shm-memory=(privileged,18446744073709551615,deny)
                 rcap.max-rss=12884901888
# cat /etc/project
pkg71:102:Proyecto para la BBDD pkg71:oracle::
 process.max-msg-messages=(priv,8192,deny);
 process.max-msg-qbytes=(priv,65536,deny);
 process.max-sem-nsems=(priv,2048,deny);
 process.max-sem-ops=(priv,512,deny);
 project.cpu-shares=(privileged,25,none);
 project.max-msg-ids=(priv,128,deny);
 project.max-sem-ids=(priv,1024,deny);
 project.max-shm-ids=(priv,256,deny);
 project.max-shm-memory=(priv,18446744073709551615,deny);
 rcap.max-rss=12884901888
  • Arrancar la DB y asignarle los parametros del proyecto
 En el script que arranca nuestra DB podemos incluir las siguientes lineas las cuales verifican si el proyecto 
 esta definido y de ser asi carga el mismo para que todos los procesos que este ejecute tengan su configuracion.

###
### Configura el proyecto si existe
###

/usr/bin/projects -l pkg71 > /dev/null 2>&1
if [ $? = 0 ]
then
  newtask -p pkg71 -c $$
  echo "******************************************************************"
  echo "* Proyecto pkg71 existe y ha sido cargado"
  echo "******************************************************************"
fi

Modificación Dinámica de recursos[editar]

  • Modificar el numero de File Descriptors para el usuario Oracle
# projmod -sK 'process.max-file-descriptor=(basic,65536,deny),(priv,65536,deny)' user.oracle 
  • Ampliar la memoria de 12G a 14G para el proyecto pkg71
# projmod -sK 'rcap.max-rss=14g' pkg71

Planificadores de Solaris[editar]

- Definir el tipo de Process Scheduler que vamos a utilizar (TS, FSS, Etc)
  FSS para fair-share.
  TS  para time-sharing.
  RT  para real-time.
  IA  para inter-active.
  FX  para fixed-priority.

FSS - Fair share scheduler[editar]

 Planificación por reparto equitativo, es decir la planificación se lleva a cabo por prioridades lo que garantizaria un 
 reparto equitativo de los recursos del sistema y al mismo tiempo nos garantiza que no tengamos recursos asignados pero 
 no disponibles.
 
 Por ejemplo si nuestro sistema tiene 12GB de memoria RAM, podriamos asignar al proceso A 5G y al proceso B 5G y reservarnos 
 2G para SO y otros procesos. Si utilizamos el FSS y el proceso A necesita mas de 5G podriamos utilizarlos sin problema siempre 
 y cuando el proceso B no los necesite, si este es el caso, el demonio (rcapd) que gestiona estos recursos comenzaria a limitar 
 la memoria del proceso A y asignandosela al B de forma dinamica. 
   
 Trabajar de esta forma nos permitiria tener recursos asignados y no ociosos.
 
 La gestion de los recursos se realiza en Solaris mediante los proyectos.
 Es importante destacar que el FSS solo limita recursos de CPUs y memoria.
 
 Podemos habilitar el FSS con el siguiente comando: # dispadmin -d FSS

rcapd - Resource Capping Daemon[editar]

El rcapd es utilizado para regular la cantidad de memoria que consume un proyecto segun la configuracion dada. El rcapd toma
muestrar repetidamente en un intervalo preconfigurado y analiza el consumo real con lo configurado y de ser necesario realiza 
los ajustes pertinentes para garantizar que cada recurso consuma lo definido.

Zonas[editar]

Segun Wikipedia: 
   Una Zona o Container, permite la creación de muchos ambientes privados de ejecución y una sola instancia de solaris. 
   Cada ambiente tiene su propia identidad, independiente del hardware subyacente aunque se comporta como si se estuviera ejecutando 

en su propio sistema, permitiendo así que la consolidación sea un proceso sencillo, confiable y seguro. Y dado que los recursos del sistema están virtualizados, los administradores pueden incrementar la utilización del hardware, al tiempo que satisfacen los altos picos de demanda.

Tipos de Zonas[editar]

Existen 2 tipos de Zonas Whole y Sparse

Whole Root[editar]

Las zonas de tipo whole tienen sus propios /usr/lib, /usr/local y /platform, de manera que no pueden heredarse estos directorios
de la zona global. Dado esto, estas zonas tienen mayor independencia de la zona global pero por contrapartida ocupan un poco mas
de espacio.

Sparse[editar]

Las zonas de tipo sparse, hereden todos los directorios de la zona global, lo cual hace que sean mas pequeñas que las anteriores.
Los directorios heredados /usr/lib, /sbin/local y /platform son de solo lectura. 

Informacion necesaria para poder comenzar![editar]

- Zone Path       : /zonas/zona1
- Zpool           :
- Interfaz de Red : igb0
- IP              : 192.168.1.22
- Gateway         : 192.168.1.1
- Shares          : 33
- Memoria         :  7g
- Swap            : 10g

Crear el pool y la zona[editar]

  • Los comandos mas utilizados para trabajar con zonas son los siguientes:
# zlogin opcion zone-name
# zoneadm -z zone-name boot
# zoneadm -z zone-name halt
# zoneadm -z zone-name install
# zoneadm -z zone-name ready
# zoneadm -z zone-name reboot
# zoneadm -z zone-name uninstall
# zoneadm -z zone-name verify
# zonecfg -z zone-name: Modo interactivo; Puede ser utilizado para remover propiedades del tipo: fs, device, rctl, net, attr.
# zonecfg -z zone-name commit
# zonecfg -z zone-name create
# zonecfg -z zone-name delete
# zonecfg -z zone-name verify
# rcapstat -z
  • Los archivos donde estaran las configuraciones son:
/etc/zones/index         -> Informacion de las zonas definidas en el sistema.
/etc/zones/global.xml    -> Definicion de la zona global.
/etc/zones/zone-name.xml -> Definicion de la zona zone-name.

Posibles estados que puede tomar una Zonas[editar]

La informacion de estado de las zonas puede verse con el comando "zoneadm list -iv" ejecutado desde la zona global. 
Las zonas No-globales pueden tener los siquientes estados:
 configured: Configuration complete and in stable storage.
 incomplete: Installation or uninstallation underway
 installed: Configuration instantiated on system. Zone has no associated virtual platform.
 ready: Virtual platform established, zsched started, IPs plumbed, filesystems mounted, zone ID assigned. No zone processes started yet.
 running: This state entered when zone init process starts.
 shutting down: Zone being halted.
 down: Transitional state during zone shutdown.

Configurar, Instalar y Arrancar una Zona[editar]

La mejor forma de explicar la configuracion de una zona es mediante un ejemplo. Con lo cual, manos a la obra!!!
  • Primero definimos el tipo de scheduler a utilizar FSS
# dispadmin -d FSS
# priocntl -s -c FSS -i all ????
  • Creamos la/s carpetas donde se guardaran las zonas.
# mkdir -p /zonas
# cd /zonas
# zonecfg -z zona1
zona1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zona1> create -b
zonecfg:zona1> set zonepath=/zonas/zona1
zonecfg:zona1> set autoboot=true
zonecfg:zona1> add net
zonecfg:zona1:net> set physical=igb0
zonecfg:zona1:net> set address=192.168.1.22
zonecfg:zona1:net> end
zonecfg:zona1> set cpu-shares=33
zonecfg:zona1> add capped-memory
zonecfg:zona1:capped-memory> set physical=7g
zonecfg:zona1:capped-memory> set swap=10g
zonecfg:zona1:capped-memory> end
zonecfg:zona1> add rctl
zonecfg:zona1:rctl> set name=zone.max-swap
zonecfg:zona1:rctl> add value (priv=privileged,limit=99990737418240,action=deny)
zonecfg:zona1:rctl> end 
zonecfg:zona1> add dataset
zonecfg:zona1:dataset> set name=zona1-zpool/aplicacion
zonecfg:zona1:dataset> end
zonecfg:zona1> verify
zonecfg:zona1> commit
zonecfg:zona1> exit
# zoneadm -z zona1 install
Preparing to install zone <zona1>.
Creating list of files to copy from the global zone.
Copying <147436> files to the zone.

Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1138> packages on the zone.
Initialized <1138> packages on zone.
Zone <zona1> is initialized.
Installation of <2> packages was skipped.
The file </zonas/zona1/root/var/sadm/system/logs/install_log> contains a log of the zone installation.
# zoneadm -z zona1 boot
# zlogin -C zona1
[Connected to zone 'zona1' console]
[NOTICE: Zone booting up]
SunOS Release 5.10 Version Generic_144489-17 64-bit
Copyright (c) 1983, 2011, Oracle and/or its affiliates. All rights reserved.
Hostname: zona1
Loading smf(5) service descriptions: 159/159
  • Una vez instalada la zona y dentro de la misma se procederá a modificar el punto de pontaje de filesystem de la aplicacion
# zfs set mountpoint=/var/www zona1-zpool/aplicacion
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zona1-zpool 4.11G 258G 21K none
zona1-zpool/aplicacion 200M 258G 21K none

Modificación Dinámica de recursos[editar]

Reparto de shares de CPU[editar]

  • Comprobar los shares que tiene asignados una zona en un momento determinado
# prctl -n zone.cpu-shares -i zone zona1
zone: 33: zona1
NAME         PRIVILEGE      VALUE    FLAG ACTION RECIPIENT
zone.cpu-shares
             privileged        33    -    none           -
             system         65.5K    max  none           -
  • Modificar temporalmente los shares asignados a una zona (en este caso asignado 20 shares a zona1)
# prctl -n zone.cpu-shares -r -v 20 -i zone zona1
  • Cambiar los shares asignados a una zona de manera permanente
# zonecfg -z zona1 set cpu-shares=20
# prctl -n zone.cpu-shares -r -v 20 -i zone zona1

Gestión de memoria física[editar]

  • Comprobar la memoria física asignada a una zona
 zlogin zona1 prtconf -v | grep Memory
 prtconf: devinfo facility not available
 Memory size: 7168 Megabytes
  • Comprobar el límite y el consumo actual de la memoria de cada zona.
# rcapstat -z  
  • Modificar el límite de memoria física de manera temporal (asignamos 2Gbytes a zona1)
# rcapadm -z zona1 -m 2g
  • Modificar el límite de memoria física asignada a una zona de manera permanente.
# zonecfg -z zona1 "select capped-memory; set physical=2g; end"
# rcapadm -z zona1 -m 2g

Gestión de memoria swap[editar]

  • Comprobar la memoria swap asignada a una zona
# prctl -n zone.max-swap -i zone zona1
zone: 33: zona1
NAME         PRIVILEGE      VALUE    FLAG ACTION RECIPIENT
zone.max-swap
             privileged     10.0GB   -    deny           -
             system         16.0EB   max  deny           - 
  • Modificar el límite memoria swap asignada a la zona de manera temporal (asignamos 20 gbytes a zona1)
# prctl -n zone.max-swap -r -v 20gb -i zone zona1
  • Modificar el límite memoria swap asignada a la zona de forma permanente
# zonecfg -z zona1 "select capped-memory; set physical=20g; end"
# prctl -n zone.max-swap -r -v 20gb -i zone zona1

ZFS[editar]

Si se utiliza ZFS, se tiene que limitar en el "/etc/system", que limita la cache ARC del ZFS para que no consuma toda la memoria
como un valor de referencia se puede utilizar la mitad de la RAM del equipo

/etc/system:set zfs:zfs_arc_max = 0x300000000