Iniciación a Omnet++ José Daniel García Sánchez Grupo de Arquitectura Comunicaciones y Sistemas Universidad Carlos III de Madrid.

Download Report

Transcript Iniciación a Omnet++ José Daniel García Sánchez Grupo de Arquitectura Comunicaciones y Sistemas Universidad Carlos III de Madrid.

Iniciación a Omnet++
José Daniel García Sánchez
Grupo de Arquitectura Comunicaciones y Sistemas
Universidad Carlos III de Madrid
Contenido
Pasos

Definir la estructura de la red.


Completar el comportamiento.


Lenguaje NED.
Lenguaje C++.
Configurar la simulación

Archivo ini
Ejemplo 1




1 Servidor.
El tiempo entre llegadas tiene una
distribución exponencial con media de 1
segundo.
El tiempo de servicio tiene una distribución
exponencial de 0.99 segundos.
¿Cuál es el tiempo medio que una
petición permanece en la cola?
Cola M/M/1


Evidentemente, este sistema tiene solución
analítica.
Simplemente se usa como ejemplo muy
sencillo para ilustrar Omnet++.
Lenguaje NED Básico

Definición de módulos simples.

Definición de módulos compuestos.

Definición de redes.
Módulos simples

Parámetros:


numeric, numeric const
(o const), bool, string,
xml.
Puertas.


in o out.
Pueden ser arrays.
simple Modulo
parameters:
p1 : tipo,
p2 : tipo;
gates:
in: g1;
out: g2;
out: g3[];
endsimple;
Generador de peticiones
simple Generador
parameters:
tiempoEntreLlegadas :
numeric;
gates:
out: salidaPeticiones;
endsimple;
Servidor
simple Servidor
parameters:
tiempoServicio: numeric;
gates:
in: entradaPeticiones;
endsimple;
Módulos compuestos



Permiten componer
módulos complejos a
partir de otros.
Se usan para
interconectar módulos.
Se pueden realizar
múltiples niveles de
composición.
module nombre
parameters:
//...
gates:
//...
submodules:
//...
connections:
//...
endmodule;
Conexión de módulos
module Red
parameters:
tiempoLlegadas : numeric,
tiempoServicio : numeric;
submodules:
gen : Generador;
parameters:
tiempoEntreLlegadas = tiempoLlegadas;
svr : Servidor;
parameters:
tiempoServicio = tiempoServicio;
connections:
gen.salidaPeticiones --> svr.entradaPeticiones;
endmodule;
Red


Instanciación de la
red.
Puede contener
asignación de
parámetros.
network red : Red
endnetwork;
Programación de módulos
simples

Es necesario definir el comportamiento
de los módulos simples.




Iniciación
Finalización.
Tratamiento de mensajes.
Cada módulo simple se programa como
una clase C++.

Hereda de cSimpleModule
Modelos de tratamiento de
mensajes

Síncrono




Se define un bucle
completo de
tratamiento.
Más sencillo de
comprender
inicialmente.
Requiere espacio de
pila.
Otros problemas.

Asíncrono



Disparado por
eventos.
Más costoso de
comprender.
No requiere espacio
de pila.
Clase generador
#include <omnetpp.h>
class Generador : public cSimpleModule
{
Module_Class_Members(Generador, cSimpleModule, 4096); 
private:
virtual void initialize();
virtual void activity();
virtual void finish();
private:
int salida_;
private:
int enviados_;
};
Generador: Iniciación y
Finalización
#include "generador.h"
Define_Module(Generador); 
void Generador::initialize()
{
salida_ = findGate("salidaPeticiones");
if (salida_ < 0)
opp_error("puerta de salida no encontrada");
enviados_ = 0;
}
void Generador::finish()
{
ev << "Mensajes enviados: " << enviados_ << endl;
}
Generador: Actividad
void Generador::activity()
{
cPar
tiempo_entre_llegadas=par("tiempoEntreLlegadas");
for (;;) {
double tiempo = tiempo_entre_llegadas;
wait(tiempo);
cMessage * msg = new cMessage("peticion");
send(msg, salida_);
enviados_++;
}
}
Clase servidor
#include <omnetpp.h>
class Servidor : public cSimpleModule
{
Module_Class_Members(Servidor, cSimpleModule, 4096);
private:
virtual void initialize();
virtual void activity();
virtual void finish();
private:
int procesados_;
};
Servidor: Iniciación y Finalización
#include "servidor.h"
Define_Module(Servidor);
void Servidor::initialize()
{
procesados_ = 0;
}
void Servidor::finish()
{
ev << "Peticiones procesadas: "
<< procesados_ << endl;
}
Servidor: Actividad
void Servidor::activity()
{
cPar tiempo_servicio =
par("tiempoServicio");
for (;;) {
cMessage * msg = receive();
delete msg;
double tiempo = tiempo_servicio;
wait(tiempo);
procesados_++;
}
}
Vale ¿Y ahora qué?

Se pueden generar dos tipos de
ejecutables:


Interfaz de usuario gráfico: Útil para
depurar y comprender.
Interfaz de consola: Más eficaz para
realizar las simulaciones por lotes.
Proceso de compilación
Compilación


Omnet++ permite generar
automáticamente los Makefile.
Ejemplo para Windows:



opp_nmakemake –u Cmdenv –f –o simred
opp_nmakemake –u Tkenv –f –o simred
nmake –f Makefile.vc
Configuración: omnetpp.ini
[General]
network=red
sim-time-limit = 10s
[Parameters]
red.tiempoLlegadas=1
red.tiempoServicio=0.99
Seamos realistas



No se puede sustituir una distribución por su
media.
Hace falta asignar distribuciones aleatorias a
los parámetros.
Y además:

No se puede recibir un mensaje mientras se está
en un wait.
Uso de una cola de peticiones
class Servidor : public
cSimpleModule
{
//...
private:
cQueue * cola_peticiones_;
//...
};
activity()
void Servidor::activity()
{
cPar tiempo_servicio = par("tiempoServicio");
for (;;) {
cMessage * msg;
if (cola_peticiones_->empty()) {
msg = receive();
}
else {
msg = check_and_cast<cMessage*>(cola_peticiones_->pop());
}
ev << "Enviado: " << msg->sendingTime()
<< ", procesando: " << simTime() << endl;
delete msg;
double tiempo = tiempo_servicio;
waitAndEnqueue(tiempo,cola_peticiones_);
procesados_++;
}
}
Generación de números
aleatorios

Un generador de números
pseudoaleatorios




Genera números enteros.
Basado en un algoritmo determinista.
Parte de una semilla inicial.
Necesarios para generar distribuciones
aleatorias.
Generadores de números
aleatorios

Congruencial lineal.


Mersenne-Twister [1998]


Periodo 231
Periodo de 219937-1.
Akaroa.

Para ejecutar replicaciones paralelas en clusters.
Distribuciones aleatorias



Basadas en generadores de números
aleatorias.
Disponibles las más típicas.
Se pueden añadir nuevas (si uno sabe
matemáticas suficientes).
Importante


Cuidado con las variables
autocorreladas.
Mucho cuidado con generar dos
distribuciones a partir de una misma
fuente aleatoria.
Configuración de parámetros
[General]
network=red
sim-time-limit = 1m
num-rngs=2
**.rng-0=0
**.rng-1=1
[Parameters]
red.tiempoLlegadas=exponential(1,0);
red.tiempoServicio=exponential(0.9,1);
Recogida de estadísticas


Omnet++ ofrece herramientas para
recoger estadísticas de los resultados.
La más sencilla es cStdDev que permite
recoger estadísticos sencillos de una
muestra.
Generador: Recogida de
estadísticas
class Servidor : public
cSimpleModule
{
//...
private:
cStdDev tiempo_espera_;
};
Generador: Recogida de
estadísticas
void Servidor::activity()
{
//...
tiempo_espera_.collect(simTime() - msg->sendingTime());
//...
}
void Servidor::finish()
{
delete cola_peticiones_;
ev << "Peticiones procesadas: "
<< tiempo_espera_.samples() << endl;
ev << "Tiempo medio: " << tiempo_espera_.mean() << endl;
ev << "Varianza: " << tiempo_espera_.variance() << endl;
}
Recogida de estadísticas más
detallada

cWeightedStdDev


cLongHistogram, cDoubleHistogram,
cVarHistogram


Pesos en las medidas  Longitud media.
Histogramas
cPSquare

Cuantiles
Grabación de datos vectoriales



Posibilidad de guardar una serie
temporal para posterior análisis.
Archivo con extensión vec.
Se puede procesar con herramienta
plove.
Servidor: Grabación de
vectores
class Servidor : public
cSimpleModule
{
//...
private:
cOutVector vec_tiempo_espera_;
cOutVector vec_longitud_cola_;
};
Servidor: Grabación de datos
vectoriales
void Servidor::activity()
{
//...
vec_tiempo_espera_.record(
simTime()-msg->sendingTime());
vec_longitud_cola_.record(
cola_peticiones_->length());
//...
}
Estimación del tiempo de
espera


Sea Ti el tiempo de espera de la i-ésima
petición.
¿Puedo usar T para estimar el tiempo
de espera de las peticiones?


No porque Ti no son independientes ni
idénticamente distribuidas.
Pero podría estimar las distribuciones
de cada uno de los Ti.


Si solamente ejecuto la simulación una vez
solamente tengo una muestra de cada
variable aleatoria Ti.
Solución:




Realizar m ejecuciones independientes.
Tij: Tiempo de espera de la i-ésima petición en la
j-ésima replicación.
Cada ejecución usa las mismas condiciones
inciales.
Solo cambian las semillas de generación de
números aleatorios.
Independencia entre
ejecuciones



T11,T12,...,T1n son muestras de la
variable aleatoria Ti.
Cada Ti puede seguir una distribución
distinta.
Pero ¿Cómo se determina m?

¿Depende del tipo de simulación?
Simulaciones con finalización
predefinida

Se sabe cuando terminan.


Un sistema que se reinicia pasado un cierto
tiempo.
Un sistema que tiene una condición de
terminación.

Simular la transmisión de un video.
Preguntas para simulaciones
con finalización predefinida


Estimación del intervalo de confianza a
partir de n realizaciones de simulación
estocástica.
¿Cuántas realizaciones tengo que hacer
si quiere obtener una precisión
determinada?
Simulación sin terminación
definida


No existe un evento de terminación de
la simulación.
Nos interesan el comportamiento del
sistema en su estado estacionario.

Hay que detectar y eliminar el estado
transitorio.
Estado transitorio y estado
estacionario
Preguntas


¿Cómo elimino la parte de la simulación
que se corresponde con el estado
transitorio?
Finalización de la simulación:


Si termino demasiado pronto  resultados
con variabilidad dependiente de las
semillas.
Si termino demasiado tarde  estoy
desperdiciando tiempo y recursos.
Compliquemos el problema

El cliente y el servidor están conectados
por un canal:



Ancho de banda de 128 Kbps.
El retraso sigue una distribución normal de
media 1us y sigma 0.01.
Los tamaños de los mensajes tienen
una distribución lognormal mu=6 y
sigma=0.4
Definición de canales

Omnet permite
definir un tipo de
canal a partir de:



Ancho de banda.
Tasa de errores.
Retraso.
channel nombre
delay valor
error valor
datarate valor
endchannel;
Ejemplo de canal
channel conexion
datarate 128000
delay normal(1e-6,0.01,3)
endchannel
module Red
//...
connections:
gen.salidaPeticiones --> conexion -->
svr.entradaPeticiones;
endmodule;
Generación de mensajes con
tamaño
void Generador::activity()
{
cPar tiempo_entre_llegadas =
par("tiempoEntreLlegadas");
cPar tam_mensaje = par("longitudMensaje");
for (;;) {
double tiempo = tiempo_entre_llegadas;
wait(tiempo);
cMessage * msg = new cMessage("peticion");
long longitud = tam_mensaje;
msg->setLength(longitud);
send(msg, salida_);
enviados_++;
}
}
Y aún hay más ...





Implementación asíncrona de módulos.
Mensajes definidos por el usuario.
Enrutamiento automático.
Recogida de datos no vectoriales para
múltiples realizaciones.
Simulación paralela:


Realizaciones paralelas.
Partición del modelo.
Y todavía más ...



INET Framework.
Mobility Framwork.
IPV6.