En las primeras parte de Crossbow Qué y Cómo Utilizarlo hacíamos una introducción a la tecnología. En esta ocasión vamos a ver una nueva utilidad <flowadm> que nos permitirá aplicar QoS de una forma muy sencilla.
Flow o Flujos
Los <flow> nos permiten discriminar el tráfico en función de unos parámetros, como por ejemplo puerto origen <local_port>, puerto destino <remote_port>, tipo de protocolo <protocol>, etc. y asignarle una prioridad y un ancho de banda.
Cómo utilizar flujos
Supongamos que tenemos un servidor con varias zonas, donde a su vez tenemos instalados diferentes servicios -por ejemplo Apache HTTP y PostgreSQL- y, queremos asignar unos "anchos de banda y prioridades" para garantizar los servicios.
Así crearemos dos flujos -uno para HTTP y otro para PostgreSQL- donde asignemos unos límites y prioridades sabiendo que ninguno de ellos "usará el ancho de banda del otro" y, de esta forma garantizando nuestros servicios.
Gestión de Flujos
Aunque pueda parecer que es lo mismo que veíamos en la Crossbow y Cómo utilizarlo en OpenIndiana - Parte 1, tiene algunas pequeñas diferencias.
En sí, se obtiene un mismo objetivo: "Asignar un ancho de banda máximo" sin embargo, si utilizamos la opción de asignarlo al interface todos los servicios estarán limitados -y no podemos establecer un ajuste más fino-, pero si utilizamos <flowadm>, seremos capaces de diferenciar por servicios y, de esta forma, hacer un ajuste muy fino.
El comando <flowadm>
Toda la gestión se realiza utilizando el comand </usr/sbin/flowadm> -al igual que sucedía con <dladm>- y sus opciones son las siguientes:
havoc@h100:~$ pfexec flowadm
usage: flowadm <subcommand> <args>...
add-flow [-t] -l <link> -a <attr>=<value>[,...]
[-p <prop>=<value>,...] <flow>
remove-flow [-t] {-l <link> | <flow>}
show-flow [-p] [-l <link>] [<flow>]
set-flowprop [-t] -p <prop>=<value>[,...] <flow>
reset-flowprop [-t] [-p <prop>,...] <flow>
show-flowprop [-cP] [-l <link>] [-p <prop>,...] [<flow>]
Nota: Recordar que se debe ejecutar como <root> o con un usuario con los privilegios suficientes. Si no sabes mucho de Privilegios y Roles te aconsejo que mires RBAC: Roles y Privilegios en Solaris/OpenIndiana.
Creación de un <flow>
Para crear un flow, simplemente deberemos utilizar la opción <add-flow> y definir sobre que interface queremos que se aplique. Recordar que ahora podemos utilizar tanto interface virtuales como físicos.
Así que vamos a crear un <flow> que nos asigne siempre una prioridad muy alta a los accesos que realicemos a nuestra PostgreSQL sobre nuestro interface es un virtual <vnic1>.
Podemos crear un <flow> utilizando las siguientes opciones como "filtros":
- Puerto: Local <local_port> o remoto <remote_port>
- Tipo Conexión: <transport>, tcp, udp, sctp, icmp, icmp6
- IP: Origen <local_ip> o destino <remote_ip>
havoc@h100:~$ pfexec flowadm add-flow -l vnic1 -a transport=TCP,local_port=5432 postgres-flowVer y Cambiar las propiedades
Como sucedía con los interfaces virtuales, podemos cambiarle las propiedades al flujo "en caliente", para ello, utilizaremos las opciones <show-flowprop> para mostrar las propiedades y <set-flowprop -p {PROPIEDAD=VALOR}< para asignar una nueva.
havoc@h100:~$ pfexec flowadm show-flowprop postgres-flowCuando no tenemos asignado un valor a la propiedad se muestran como "--" para indicarnos que no hay nada.
FLOW PROPERTY VALUE DEFAULT POSSIBLE
postgres-flow maxbw -- -- ?
postgres-flow priority -- -- ?
Y para cambiar una propiedad, por ejemplo asignarle la máxima prioridad haremos lo siguiente:
havoc@h100:~$ pfexec flowadm set-flowprop -p priority=high postgres-flowComprobamos sus propiedades, utilizando la opción <show-flowprop>
havoc@h100:~$ pfexec flowadm show-flowprop postgres-flowAsignar un Ancho de Banda (maxbw)
FLOW PROPERTY VALUE DEFAULT POSSIBLE
postgres-flow maxbw -- -- ?
postgres-flow priority high -- high
Para limitar el ancho de banda máximo para el <flow>, deberemos utilizar la propiedad <maxbw>. El valor a asignar será un valor entero y deberemos añadir la escala (K, M o G para Kilobits, Megabits o Gigabits), si no añadimos ninguna, Solaris entenderá que estamos introduciendo Megabits.
Un pequeño apunte sobre la limitación de ancho de banda a tener en cuenta es, si hemos limitado nuestro interface a un determinado valor, nuestro <flow> nunca superará éste aunque se mayor, es decir, si hemos puesto que nuestro interface tiene un valor de <maxbw=10M> y tenemos un flow con <maxbw=20M>, nuestro <flow> nunca nos dará un valor superior a 10M -porque lo limita el interface-
havoc@h100:~$ pfexec flowadm set-flowprop -p maxbw=2M postgres-flow
havoc@h100:~$ pfexec flowadm show-flowprop postgres-flow
FLOW PROPERTY VALUE DEFAULT POSSIBLE
postgres-flow maxbw 2 -- 2M
postgres-flow priority high -- high
Resetear todas las propiedades
Cuando se está "jugando" con las propiedades, hay veces que queremos empezar "de cero" para poder asignar otros parámetros, para ello, utilizaremos la opción <reset-flowprop&ght;, por ejemplo:
havoc@h100:~$ pfexec flowadm reset-flowprop postgres-flowEliminar un flujo
havoc@h100:~$ pfexec flowadm show-flowprop postgres-flow
FLOW PROPERTY VALUE DEFAULT POSSIBLE
postgres-flow maxbw -- -- ?
postgres-flow priority -- -- ?
Para eliminar un <flow> simplemente utilizaremos la opción <remove-flow> del comando <flowadm>, siguiendo con nuestro ejemplo:
havoc@h100:~$ pfexec flowadm remove-flow postgres-flowVer las Estadísticas
Podemos ver las estadísticas de un <flow> utilizando el comando <flowstats> que nos proporcionará los valores totales de los flujos, por ejemplo:
havoc@h100:~$ pfexec flowstatSi queremos ver las estadísticas de un período concreto, debemos activar los sistemas de auditoría que ... esto lo dejaremos para la Parte 4 ya que así lo podremos unir a Auditoría sobre RBAC en Solaris
FLOW IPKTS RBYTES IERRS OPKTS OBYTES OERRS
postgres-flow 14,14K 987,97K 0 15,68K 17,09M 0
pkg-flow 47 3,13K 0 47 2,54K 0
<< Qué es Crossbow y Cómo Utilizarlo en Solaris/OpenIndiana - Parte 1
<< Qué es Crossbow y Cómo Utilizarlo en Solaris/OpenIndiana - Parte 2
Conclusión
Poco a poco avanzamos en el uso de Crossbow, y, en esta ocasión nos hemos centrado en una parte importante de Calidad de Servicio (QoS) que, sinceramente se ha simplificado en gran medida.