SafeChildren Banner

Havoc Oracle Solaris Experts

viernes, 26 de febrero de 2010

Manejo de Project y Configuraciones Dinámicas en Solaris 10 - Parte 2

Introducción
Hasta ahora hemos visto cómo gestionar los parámetros dinámicamente mediante el uso de <prctl> y project sin embargo, Cómo saber si se están superando los límites? Bien, para ello, tenemos el comando <rctladm> que nos permite examinar y modificar los parámetros globales de nuestro sistema de control de recursos.

Vamos a utilizar <rctladm> para habilitar el sistema de log y de esta forma, poder ver cuándo y quién está sobrepasando los límites que hemos asignado.

Si ejecutamos el comando <rctladm> sin ningún argumento, se nos mostrará el estado de cada una de las opciones del resource manager donde podremos ver si tenemos activado el sistema de log <syslog=notice> o, si por el contrario está apagado <syslog=off> -que es su valor por defecto-
# rctladm
process.max-port-events     syslog=off     [ deny count ]
process.max-msg-messages    syslog=off     [ deny count ]
process.max-msg-qbytes      syslog=off     [ deny bytes ]
process.max-sem-ops         syslog=off     [ deny count ]
process.max-sem-nsems       syslog=off     [ deny count ]
process.max-address-space   syslog=off     [ lowerable deny no-signal bytes ]
process.max-file-descriptor syslog=notice  [ lowerable deny count ]
process.max-core-size       syslog=off     [ lowerable deny no-signal bytes ]
process.max-stack-size      syslog=off     [ lowerable deny no-signal bytes ]
process.max-data-size       syslog=off     [ lowerable deny no-signal bytes ]
process.max-file-size       syslog=off     [ lowerable deny file-size bytes ]
process.max-cpu-time        syslog=off     [ lowerable no-deny cpu-time inf seconds ]
task.max-cpu-time           syslog=off     [ no-deny cpu-time no-obs inf seconds ]
task.max-lwps               syslog=notice  [ count ]
project.max-contracts       syslog=off     [ no-basic deny count ]
project.max-device-locked-memory syslog=off     [ no-basic deny bytes ]
project.max-locked-memory   syslog=off     [ no-basic deny bytes ]
project.max-port-ids        syslog=off     [ no-basic deny count ]
project.max-shm-memory      syslog=off     [ no-basic deny bytes ]
project.max-shm-ids         syslog=off     [ no-basic deny count ]
project.max-msg-ids         syslog=off     [ no-basic deny count ]
project.max-sem-ids         syslog=off     [ no-basic deny count ]
project.max-crypto-memory   syslog=off     [ no-basic deny bytes ]
project.max-tasks           syslog=off     [ no-basic count ]
project.max-lwps            syslog=off     [ no-basic count ]
project.cpu-cap             syslog=off     [ no-basic deny no-signal inf count ]
project.cpu-shares          syslog=n/a     [ no-basic no-deny no-signal no-syslog count ]
zone.max-swap               syslog=off     [ no-basic deny bytes ]
zone.max-locked-memory      syslog=off     [ no-basic deny bytes ]
zone.max-shm-memory         syslog=off     [ no-basic deny bytes ]
zone.max-shm-ids            syslog=off     [ no-basic deny count ]
zone.max-sem-ids            syslog=off     [ no-basic deny count ]
zone.max-msg-ids            syslog=off     [ no-basic deny count ]
zone.max-lwps               syslog=off     [ no-basic count ]
zone.cpu-cap                syslog=off     [ no-basic deny no-signal inf count ]
zone.cpu-shares             syslog=n/a     [ no-basic no-deny no-signal no-syslog count ]
Para activar el sistema de log simplemente deberemos ejecutar el siguiente comando
rctladm -e syslog __nombre.propiedad__
Y para desactivar el sistema de log
rctladm -d syslog __nombre.propiedad__
Como siempre, si intentamos hacerlo desde la zona no global Solaris nos mostrará el siguiente error:
# rctladm -e syslog project.max-port-ids
rctladm: unable to update control block contents: Not owner
De esta forma, cada vez que un recurso supere los límites que hemos definido -y esté activo el log- nos escribirá una entrada en </var/adm/message> de la zona global, indicando propiedad y límite superado
# tail -f /var/adm/messages
Feb 23 18:11:32 test genunix: [ID 120576 kern.notice] basic rctl process.max-file-descriptor (value 256) exceeded by process 323.
Veamos un ejemplo completo. Vamos a limitar el número de procesos ligeros que Apache HTTP Server puede crear, vamos a permitir sólo 5
# projmod -sK 'task.max-lwps=(priv,3,deny)' user.www
# /opt/www/apache-1.3.41/bin/apachectl stop
# /opt/www/apache-1.3.41/bin/apachectl start
# dmesg|tail

Feb 23 17:51:53 test genunix: [ID 748619 kern.notice] privileged rctl task.max-lwps (value 3) exceeded by process 24512 in task 32260.
Feb 23 17:51:57 test genunix: [ID 748619 kern.notice] privileged rctl task.max-lwps (value 3) exceeded by process 24526 in task 32260.
Feb 23 17:51:58 test genunix: [ID 748619 kern.notice] privileged rctl task.max-lwps (value 3) exceeded by process 24533 in task 32260.
Como hemos visto en otras ocasiones, podemos modificar los valores de un proceso en ejecución sin tener que reiniciarlo, vamos a modificar el valor de max-lwps del PID 24582
# ps -u www -f
     UID   PID  PPID   C    STIME TTY         TIME CMD
     www 24582 24577   0 17:52:14 ?           0:00 /opt/www/apache-1.3.41/bin/httpd
     www 24581 24577   0 17:52:14 ?           0:00 /opt/www/apache-1.3.41/bin/httpd
     www 24579 24577   0 17:52:14 ?           0:00 /opt/www/apache-1.3.41/bin/httpd
     www 24580 24577   0 17:52:14 ?           0:00 /opt/www/apache-1.3.41/bin/httpd
     www 24691 24577   0 17:54:20 ?           0:00 /opt/www/apache-1.3.41/bin/httpd
     www 24578 24577   0 17:52:14 ?           0:00 /opt/www/apache-1.3.41/bin/httpd
# prctl -n task.max-lwps -i process 24582
process: 24582: /opt/www/apache-1.3.41/bin/httpd
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
task.max-lwps
        privileged        250       -   deny                                 -
# prctl -r -t priv -n task.max-lwps -v 350 -i process 24582
# prctl -n task.max-lwps -i process 24582
process: 24582: /opt/www/apache-1.3.41/bin/httpd
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
task.max-lwps
        privileged        350       -   none                                 -

<< Configuraciones Dinámicas Parte 1

Conclusión
Poco a poco vamos avanzando en el uso de Resource Manager y vemos como podemos aplicarlo a nuestras instalaciones. Os dejo que hagáis vuestras pruebas y ver cómo se comporta.

Referencias

2 comentarios:

  1. Quisiera primeramente felicitarte por tu blog, me ha sacado de más de un apuro!
    Y ya puestos a abusar de tu conocimiento, quería hacerte una pregunta acerca del max-shm-memory. Igual es muy simple: ¿es posible utilizar la memoria total de la máquina para hacer los cálculos de reparto entre los proyectos?
    Hasta ahora, he estado haciendo los cálculos respecto a la memoria física y nunca lo he probado con la total (me refiero a fisica+swap)

    Y otra cosa, ¿sería válido tener dos proyectos, uno para un grupo de usuarios y otro para un solo usuario, que también pertenezca a ese grupo? y en tal caso ¿prevalece el grupo sobre el usuario o al contrario.

    Con un ejemplo:
    group.oinstall
    projid : 101
    comment: ""
    users : (none)
    groups : oinstall
    attribs: project.max-shm-memory=(priv,4294967295,deny)
    user.oracle
    projid : 100
    comment: ""
    users : oracle
    groups : oinstall
    attribs: project.max-shm-memory=(priv,6294967295,deny)

    muchas gracias!!

    ResponderEliminar
    Respuestas
    1. Hola Gemma,

      Lo primero muchas gracias por tus comentarios, me alegro que te sirvan mis posts.

      Sobre lo que preguntas, si, en el tema de proyectos prevalece el del usuario, y sí, se puede pertenecer a varios grupos y cambiar de uno a otro utilizando
      $ newtask -p _nombre_proyecto_

      Como creo que es un tema muy interesante, me he tomado la libertad de tenerlo como base para un ejemplo más detallado, ya que hay mucho que contar ;)

      Un Saludo,
      Urko

      Eliminar