# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Virtuozzo: Averiguar a que contenedor pertenece un proceso

Dentro de un nodo físico Virtuozzo, si ejecutamos un top podemos ver los procesos que más CPU y memoria están consumiendo, pero no podemos averiguar a simple vista a que máquina virtual pertenece. Para averiguarlo tenemos dos opciones.

La primera es sustituir el uso de top por vztop. Se trata de una versión de top modificada por Virtuozzo a través de la cual aparece una nueva columna que muestra el ID de la máquina virtual.

$ vztop

vztop - 16:59:44 up 72 days,  5:11,  1 user,  load average: 2.04, 2.60, 2.76
Tasks: 528 total,   1 running, 522 sleeping,   0 stopped,   5 zombie
Cpu(s): 19.6% us,  7.4% sy,  0.2% ni, 62.2% id,  9.9% wa,  0.0% hi,  0.6% si
Mem:   4038416k total,  3948496k used,    89920k free,   173288k buffers
Swap:  4192956k total,      160k used,  4192796k free,  1701956k cached

 CTID   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  104 20875 nobody    15   0 41748  32m 1508 S   11  0.8   0:00.17 httpd
  104 11085 nobody    15   0 41904  33m 1564 S   10  0.8   0:01.53 httpd
  104 20899 nobody    15   0 41748  32m 1508 S   10  0.8   0:00.09 httpd
  104 18757 nobody    15   0 42016  33m 1556 S    8  0.8   0:00.64 httpd
  104 21077 527       18   0     0    0    0 Z    8  0.0   0:00.04 php
  104 21079 527       18   0     0    0    0 Z    8  0.0   0:00.04 php
  104 18752 nobody    15   0 41632  32m 1536 S    6  0.8   0:00.50 httpd
  104 19390 nobody    15   0 41748  32m 1532 S    6  0.8   0:00.44 httpd
  104 20884 nobody    15   0 41932  33m 1600 S    6  0.8   0:00.11 httpd

La otra opción es utilizar otro comando propio de Virtuozzo,

vzpid

. Su uso es sencillo, hay que pasar como parámetro el PID y nos dirá el contenedor/máquina virtual al que pertenece:

# vzpid 20845
Pid	VEID	Name
20845	109	httpd

109 es el ID de la máquina virtual, ejecutando un

vzlist

veremos el hostname y más información sobre la misma:

# vzlist 109
      CTID      NPROC STATUS    IP_ADDR         HOSTNAME
       109        90 running   192.168.0.155       vps1.test.com

Activar Quotas en VPS Virtuozzo

Vamos a seguir los pasos descritos en la documentación de cPanel sobre la activación de quotas en una máquina virtual Virtuozzo.

Lo primero que tenemos que hacer es activar las Quotas a nivel de Virtuozzo/Máquina virtual. Este es el primer nivel disponible, el cual permite asignar un espacio e inodos a un contenedor VPS. Para verificar si están activadas a nivel de contenedor, ejecutamos el siguiente comando:

# vzquota show ID_de_contenedor

Si tenemos activadas las Quotas, debería aparecer una información similar a:

   resource          usage       softlimit      hardlimit    grace
  1k-blocks        2900544        10485760       10485760
     inodes         146576          600000         620000    

Los valores de espacio en disco e inodos se definen en el fichero de configuración de la máquina virtual (ve.conf):

DISKINODES="600000:620000"
DISKSPACE="10485760:10485760"

Se pueden modificar a tiempo real:

# vzctl set 101 --diskspace 1000000:1100000 --save
# vzctl set 101 --diskinodes 90000:91000 --save

Las Quotas de segundo nivel las define el parámetro QUOTAUGIDLIMIT del fichero de configuración ve.conf, por defecto su valor es desactivado (0). Si lo activamos permitimos que se calculen las Quotas dentro de la máquina virtual por usuario y grupo.

Si la ejecución del siguiente comando es igual a 0 significa que no están activadas, si devuelve un valor distinto a 0 están activas (CT_ID es el ID de contenedor):

grep -i QUOTAUGIDLIMIT /etc/sysconfig/vz-scripts/CT_ID.conf

Cambiando este valor y reiniciando la máquina virtual ya las tendremos activadas, el número configurado indicará el límite de número de propietarios de fichero en el VPS. A tiempo real (también requiere reinicio se puede modificar también.

# zctl set 101 --quotaugidlimit 50 --save

Una vez realizado esto, si utilizamos cPanel/WHM únicamente tendríamos que inicializar las Quotas desde la interfaz WHM, sección “Initial Quota Setup“.

Arreglar inconsistencias y fallos en VZFS (máquina virtual Virtuozzo)

El otro día, tras la migración de una máquina virtual en modo online (sin parada de servicio) me encontré con el problema de que ciertos ficheros (realmente son enlaces simbólicos a la plantilla del sistema operativo que utiliza el VPS) estaban corruptos, por ejemplo, en la ruta /var/empty, sshd aparecía del siguiente modo:

?--------- ? ? ? ? ? sshd

Esto provocaba que el servicio SSH no levantara. Para solventar este tipo de problemas, Virtuozzo ofrece una herramienta que revisa todos los ficheros/enlaces simbólicos de la máquina virtual contra los de su plantilla, en caso de que no sean correctos los restablece. Efectivamente así fue, ejecutando el siguiente comando todos los enlaces fueron regenerados correctamente:

# vzfsutil --call=move --oall=do -t /vz/template /vz/private/$VEID

La utilidad se ejecuta con el comando vzfsutil, le indicamos la ruta en la que se encuentran en primera instancia las plantillas (templates) y después la zona privada de la máquina virtual (cambiaríamos $VEID por el id de la máquina virtual). El parámetro

--call

sirve para corregir todos los errores que la ejecución de la herramienta encuentre, y le especificamos que mueva “move” los ficheros con inconsistencias a la ruta

$VE_PRIVATE/lost_files

, podríamos decirle que los borre directamente o que únicamente nos informe y no haga nada.

Os recomiendo, en caso de encontrar este problema revisar bien la documentación de vzfsutil aquí.

Migración de un VPS Virtuozzo sin parada de servicio

Uno de los principios básicos de la virtualización es la flexibilidad a la hora de asignar recursos a las máquinas virtuales y por supuesto la de poder mover los VPS entre nodos físicos con el menor tiempo de parada posible, y a ser posible nulo.

En Virtuozzo, la utilidad para realizar migraciones es vzmigrate, a través de la cual podemos migrar un contenedor entre dos máquinas físicas de forma transparente para el usuario final.

A continuación podéis ver como sería para hacer una migración entre dos nodos físicos sin parada de servicio, os recomiendo revisar la documentación de Virtuozzo, en esta página encontraréis toda la información sobre esta utilidad.

En el siguiente ejemplo utilizamos el parámetro –online para indicar que no habrá parada de servicio en la migración, –require-realtime sirve para indicar que la principal cantidad de memoria del contenedor se transfiere al nodo de destino antes de volcar y guardar la imagen del VPS en un fichero. Esto permite lograr la menor cantidad de pérdida de servicio. En mi experiencia, para máquinas virtuales de alrededor de 3GB la pérdida de servicio ha sido de apenas 5 segundos, y para máquinas virtuales de unos 22GB de un minuto aproximadamente. Con los parámetros –new-private y –new-root podemos modificar la ruta en la que se almacenará la máquina virtual. Si queremos también podemos modificar el ID del contenedor con el parámetro –new-id.

A continuación el ejemplo, migramos sin parada de servicio la máquina virtual con ID 126, cambiando las rutas en las que se almacenará en el nodo de destino. El nodo de destino es el host nodo2.virtuozzo.com. El comando lo ejecutaríamos en el nodo en el que se encuentra actualmente el contenedor. Debe haber conectividad ssh entre ambas máquinas físicas:

# vzmigrate --online --require-realtime --new-private=/virtuozzo/private/126 --new-root=/virtuozzo/root/126 nodo2.virtuozzo.com 126

Consumo excesivo de memoria en Virtuozzo

Revisando el consumo de memoria en un nodo de Virtuozzo, que parecía demasiado elevado para el número de máquinas virtuales que contenía, confirmé que había un proceso que estaba utilizando una cantidad muy alta de memoria. Concretamente se trataba del proceso que gestiona los backups:

/opt/vzagent/bin/vzlpl VZABackupLibClient/VZABackupLibClient.so vzlin_backup_serializer

El proceso estaba utilizando el 12.6% de memoria del sistema. Investigando, encontré este post en los foros de Parallels que confirmaban este problema. Este proceso consume más y más memoria incluso cuando no está ejecutando los backups. La solución de momento parece ser reiniciar el Service Container y el vzagent_ctl cuando encontremos el problema, o incluso añadirlo en un cron para hacerlo periódicamente:

/usr/sbin/vzctl restart 1 >/dev/null 2>&1; /usr/sbin/vzagent_ctl restart

Control de contenedores (VPS) Virtuozzo con vzctl

Seguimos descubriendo los distintos comandos y utilidades que integra el sistema de virtualización Virtuozzo para la gestión de las máquinas virtuales. En este caso vamos a ver el comando vzctl, alrededor del cual giran todas las tareas de gestión y control de contenedores.

Son muchísimos los parámetros y posibilidades que nos ofrece el comando, os recomiendo revisar bien la página man del mismo para conocerlos a fondo, ya que sería muy extenso citarlos aquí.

# man vzctl

Bien, vamos a ver los usos más comunes que le podemos dar a este comando. Lo primero que debemos aprender es a modificar el estado de un contenedor:

vzctl destroy | mount | umount | start | stop | status | enter | quotaon | quotaoff | quotainit <ctid|name>

Como véis en la línea anterior, podemos destruir (apagado forzado), arrancar, parar, ver el estado, activar/desactivar/iniciar cuotas, etc de cualquiera de los contenedores. Ejemplos:

Parar contenedor con ID 101:

# vzctl stop 101

Arrancar contenedor con ID 101:

# vzctl start 101

Para saber el nombre del contenedor, o su ID, podéis ejecutar el comando vzlist, que listará todos los contenedores que hay en el nodo físico.

Seguimos con otra opción interesante del comando, se trata de la creación de nuevos contenedores, no voy a entrar en todos los parámetros disponibles, podéis verlo en la página man. Básicamente podemos crear un nuevo contenedor con una única línea de comando, especificarle la plantilla a utilizar, configuraciones de red, límites de recursos, etc:

# vzctl create <ctid|name> {--pkgset <set> [--pkgver <ver>] | --ostemplate <name>}
[--config <name>] [--private <path>] [--root <path>]
[--ipadd <addr>] | [--hostname <name>] [--skip_app_templates]

Para suspender y reactivar contenedores, utilizaremos suspend y resume:

# vzctl suspend <ctid|name>
# vzctl resume <ctid|name>

Para ejecutar comandos en la máquina virtual desde el nodo hardware, usaremos exec, seguido del ID de contenedor, el comando, y los argumentos:

# vzctl exec <ctid|name> <command> [arg ...]

Por último, vzctl set nos permite modificar cualquier parámetro de configuración de los contenedores en tiempo real, a continuación podéis ver todas las opciones:

# vzctl set <ctid|name> [--save] [--ipadd <addr>] [--ipdel <addr>|all]
[--hostname <name>] ]
[--nameserver <addr>] [--searchdomain <name>] [--onboot yes|no]
[--userpasswd <user>:<passwd>] [--cpuunits <N>] [--cpulimit <N>] [--cpus <N>]
[--diskspace <soft>[:<hard>]] [--diskinodes <soft>[:<hard>]]
[--quotatime <N>] [--quotaugidlimit <N>]
[--rate <dev>:<class>:<Kbits>] [--ratebound yes|no]
[--noatime yes|no] [--capability <name>:on|off ...]
[--devnodes device:r|w|rw|none]
[--applyconfig <name>] [--setmode restart|ignore] [--description <desc>]
[--netif_add <ifname[,mac,host_ifname,host_mac]]>] [--netif_del <ifname>]
[--bindmount_add <dst[,nosuid,noexec,nodev]>]
[--bindmount_del <dst|all>] [--name <name>]
[--offline_management yes|no] [--offline_service <name>]
[--netdev_add <name> [--netdev_del <name>]
[--iptables <name>] [--disabled <yes|no>]
[--slmmemorylimit B[:B]] [--slmmode ubc|slm|all] [--ioprio <N>]
[--features name:on|off
[UBC parameters]
UBC parameters (N - items, P - pages, B - bytes):
Two numbers divided by colon denote barrier:limit.
In case the limit is not given it is set to the same value as the barrier.
--numproc N[:N]	--numtcpsock N[:N]	--numothersock N[:N]
--vmguarpages P[:P]	--kmemsize B[:B]	--tcpsndbuf B[:B]
--tcprcvbuf B[:B]	--othersockbuf B[:B]	--dgramrcvbuf B[:B]
--oomguarpages P[:P]	--lockedpages P[:P]	--privvmpages P[:P]
--shmpages P[:P]	--numfile N[:N]		--numflock N[:N]
--numpty N[:N]	--numsiginfo N[:N]	--dcachesize N[:N]
--numiptent N[:N]	--physpages P[:P]	--avnumproc N[:N]
--swappages P[:P]
vzctl set <ctid|name> [--save] [--ipadd <addr>] [--ipdel <addr>|all]   [--hostname <name>] ]   [--nameserver <addr>] [--searchdomain <name>] [--onboot yes|no]   [--userpasswd <user>:<passwd>] [--cpuunits <N>] [--cpulimit <N>] [--cpus <N>]   [--diskspace <soft>[:<hard>]] [--diskinodes <soft>[:<hard>]]   [--quotatime <N>] [--quotaugidlimit <N>]   [--rate <dev>:<class>:<Kbits>] [--ratebound yes|no]   [--noatime yes|no] [--capability <name>:on|off ...]   [--devnodes device:r|w|rw|none]   [--applyconfig <name>] [--setmode restart|ignore] [--description <desc>]   [--netif_add <ifname[,mac,host_ifname,host_mac]]>] [--netif_del <ifname>]   [--bindmount_add <dst[,nosuid,noexec,nodev]>]   [--bindmount_del <dst|all>] [--name <name>]   [--offline_management yes|no] [--offline_service <name>]   [--netdev_add <name> [--netdev_del <name>]   [--iptables <name>] [--disabled <yes|no>]   [--slmmemorylimit B[:B]] [--slmmode ubc|slm|all] [--ioprio <N>]   [--features name:on|off   [UBC parameters]UBC parameters (N - items, P - pages, B - bytes):Two numbers divided by colon denote barrier:limit.In case the limit is not given it is set to the same value as the barrier.   --numproc N[:N]	--numtcpsock N[:N]	--numothersock N[:N]   --vmguarpages P[:P]	--kmemsize B[:B]	--tcpsndbuf B[:B]   --tcprcvbuf B[:B]	--othersockbuf B[:B]	--dgramrcvbuf B[:B]   --oomguarpages P[:P]	--lockedpages P[:P]	--privvmpages P[:P]   --shmpages P[:P]	--numfile N[:N]		--numflock N[:N]   --numpty N[:N]	--numsiginfo N[:N]	--dcachesize N[:N]   --numiptent N[:N]	--physpages P[:P]	--avnumproc N[:N]   --swappages P[:P]

Por supuesto hay más opciones y posibilidades, como os comentaba antes, tenéis todo disponible en la página man de vzctl.

vzstat: el top de virtuozzo

vzstat es una utilidad integrada en los sistemas de virtualización Virtuozzo que muestra estadísticas y utilización de recursos a tiempo real, al más puro estilo del comando top.

Entre otras cosas, con vzstat podemos ver el estado general y carga del sistema y el listado de todos los containers con la utilización de recursos utilizada por cada uno. A partir de esta base, podemos personalizar la salida del programa, ordenando por contenedores con un uso mayor de recursos, visualizar el I/O a tiempo real y estadísticas totales de escritura/lectura, etc.

Por defecto, los datos se actualizan cada segundo, podemos modificar este tiempo con el parámetro “-d”. Lo primero que vemos al acceder a vzstat es el uptime del sistema y las medias de carga al igual que en top. A continuación podemos ver el número de contenedores activos, el número de procesos totales en el nodo hardware y el estado de los procesos (running, stopped, zombie, etc). Posteriormente, se muestra un resumen de la utilización de CPU y memoria (similar también a top). Para la memoria podréis comprobar que se muestra mucha información, fragmentación de las zonas de memoria, estado, latencia, caché, swap, etc.

La siguiente sección nos muestra estadísticas a tiempo real de la utilización de las interfaces de red, total de tráfico entrante y saliente en MB/s, paquetes y estadísticas de totales.

En lo referente a disco también podemos ver estadísticas de lectura y escritura por contenedor en MB/s y totales por nodo físico. Os recomiendo no obstante acceder a la página man de la utilidad porque hay muchísima información:

man vzstat

Os dejo algunos ejemplos de utilización:

Información estandar e información de CPU, procesos, sockets, %vm y %km por contenedor:

# vzstat

Información estandar e información de IO extendida (id,st,ior,iow,iort,iowt,ip) por contenedor:

# vzstat -i

Información estandar e información de red extendida (id,st,rx,tx,rxt,txt,rxpt,txpt,ip) por contenedor:

# vzstat -n

Con el parámetro “-o” podemos personalizar nosotros los parámetros a mostrar, ejemplo:

# vzstat -o id,st,vm,km,proc,cpu,sock,fcnt,mlat,ip,host,ior,iow,iort

A partir de aquí podéis seguir investigando y tomar contacto con la utilidad por vuestra cuenta.

Instalar plantillas en Virtuozzo

Parallels cuenta con un repositorio de plantillas, tanto de sistemas operativos como aplicaciones, las cuales podemos instalar de forma sencilla. En este caso vamos a ver como instalar en el nodo Hardware una plantilla de un sistema operativo, para usarlo posteriormente como sistema de máquinas virtuales (contenedores).

Pinchando aquí encontraréis todo el catálogo de plantillas disponibles. En este caso vamos descargar la plantilla de Fedora Core 13. Vamos al nodo hardware y descargamos el rpm:

# wget http://downloads.swsoft.com/cgi-bin/getfile.pl/fedora-core/13/x86_64/fedora-core-13-x86_64-ez-4.0.0-2.swsoft.noarch.rpm

Una vez descargado, simplemente instalamos la plantilla con el comando vzpkg install template:

# vzpkg install template fedora-core-13-x86_64-ez-4.0.0-2.swsoft.noarch.rpm

Ahora, al tratarse de una plantilla de sistema operativo debemos cachearla para poder comenzar a utilizarla como plantilla de contenedores. Ejecutamos un vzpkg list para ver el nombre de la plantilla y luego ejecutamos la caché:

# vzpkg list
centos-5-x86                       2010-06-07 14:34:15
fedora-core-11-x86_64              2010-09-01 14:37:17
# vzpkg create cache fedora-core-11-x86_64

Ahora ya podemos utilizarla como plantilla para nuestros contenedores Virtuozzo.