Download Instrumentacion de código

Document related concepts
no text concepts found
Transcript
Instrumentacion de código
Diseño y Evaluación de Configuraciones
Curso 2010-11
Miguel Telleria de Esteban
telleriam AT unican.es
Computadores y Tiempo Real
http://www.ctr.unican.es
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Contenido
●
Introducción
●
Medida de tiempo en java
●
Dynamic Probekit de TPTP
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 2 de 29
Introducción
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Estrategias para medir el tiempo en un programa
●
De menor a mayor intrusismo
●
●
●
Monitorización externa periódica (top, htop, ps)
–
El programa y el sistema se ejecutan de manera independiente
–
Los muestreos se realizan puntualmente a nivel de sistema
Activación de las trazas del kernel
–
El programa sigue ejecutándose igual
–
El sistema está instrumentado y nos da información del programa
Ejecución bajo un profiler
–
●
5 Abr 2011
El programa se ejecuta en un entorno de vigilancia
Instrumentación de código fuente
–
El programa se ejecuta modificado
–
Java permite instrumentar en el Bytecode (BCI)
Miguel Telleria de Esteban telleriam AT unican.es)
Página 4 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Concepto de instrumentación de código
●
●
Idea:
●
Se insertan sondas en el código fuente (o en el binario)
●
Estas sondas recogen información que nos interesa
–
Timestamps absolutos, de ejecución
–
Información aplicativa (pid, dato)
●
Estos datos se almacenan rápidamente en bruto y en un buffer
●
Se analizan externamente
Necesitamos:
●
Conocer el código fuente de la aplicación a debuguear
●
Poder modificar dicho código
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 5 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Tiempo transcurrido y tiempo de proceso
●
Tiempo transcurrido (Wall clock time):
●
Desde que empezamos hasta que acabamos incluyendo todo
●
Es influido por otros procesos o sistemas externos
●
–
Procesos de mayor prioridad
–
Sobrecargas externas
No representa el consumo de recurso (CPU, red...)
–
●
●
No es lo más aconsejable para nuestros modelos
Sí representa un objetivo (plazos, deadlines)
Tiempo de proceso (CPU time)
●
Tiempo que estamos realmente ejecutando
●
Indepediente de la carga del sistema
–
●
5 Abr 2011
mientras podamos ejecutar
Válido para modelos
Miguel Telleria de Esteban telleriam AT unican.es)
Página 6 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Tiempo transcurrido y tiempo de proceso (II)
●
Buenas noticias
●
El sistema operativo lleva la cuenta del tiempo de proceso
–
●
●
Existen estandares de API para la obtención de este tiempo
–
POSIX
–
RTSJ
Malas noticias
●
●
Lo necesita para implementar la planificación, balance de carga...
Java 1.6 no contempla este concepto en su API
Alternativas para obtener el tiempo de proceso en Java
●
Medir TODO el sistema (o el más prioritario) e ir descontando trozos
–
●
5 Abr 2011
Es lo que hacen los profilers (Eclipse TPTP, Jensor...)
JNI: Hacemos visibles los servicios POSIX a nuestras clases en Java
Miguel Telleria de Esteban telleriam AT unican.es)
Página 7 de 29
Midiendo el tiempo desde Java
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Medida de tiempos en Java
●
●
Java tiene ciertas limitaciones intrínsecas para dar precisión
●
Garbage collector
●
JIT compiling
En JRE 1.6 sólo existen 2 funciones de medidas de tiempo
(ambas en la clase System)
●
public static long currentTimeMillis()
–
●
●
Resolución de milisegundos
public static long nanoTime()
–
Resolución de nanosegundos
–
Precisión: Los jiffies del kernel (msg)
Ninguna de ellas soporta tiempos de ejecución
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 9 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Opción 1: Real Time Specification for Java (RTSJ)
●
Es una especificación de API (javax.realtime)
●
●
●
Existen diferentes implementaciones
–
http://java.sun.com/javase/technologies/realtime.jsp
–
http://en.wikipedia.org/wiki/Javolution
La experiencia de sistemas de tiempo real llevada a Java
●
Limitación de acción del garbage collector
●
Políticas de planificación estrictas
●
Mutexes con techos de prioridad o herencia de prioridad
●
Relojes de tiempo de ejecución
●
…
Basado en las API's POSIX de tiempo real
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 10 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Opción 2: Métodos JNI con la API de POSIX
●
Valida para el Java normal
●
Nos permite usar tecnología genérica (no sólo de Java)
●
Es la que vamos a usar
●
Vamos a cambiar a C un rato
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 11 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Soporte de POSIX en el kernel Linux
●
La gestión del tiempo está definida en el estándar 1003.1a
(Extensiones de tiempo real) y no en el estándar que define los
PThreads (1003.1b).
●
●
●
Aunque pertenezca a la parte de tiempo real ya está plenamente
integrado en el kernel sin necesidad de añadir ningún parche externo
El soporte está implementado en el kernel, pero la interfaz se
utiliza a través de la glibc que implementa la abstracción de
pthreads.
Desde el kernel 2.6.16 (marzo 2006) se usan los hrtimers para
los timers POSIX.
●
La resolución pasa a depender del hardware y es superior a los jiffies
●
Pasamos de milisegundos a microsegundos
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 12 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Medidas de tiempo en POSIX
●
Se basan en relojes virtuales (clockid_t)
●
A partir de una única fuente de tiempo hardware
–
●
●
en la CPU o en el chipset
Se ofrecen diferentes vistas
–
Manteniendo un registro de desfase
–
Manteniendo estadísticas de consumo de tiempo
Esos relojes se les puede:
●
Consultar “la hora”
–
Y calcular incrementos
●
Preguntar la precisión
●
Programar timers
●
5 Abr 2011
–
De tiempo absoluto
–
De tiempo relativo
Dormirse
Miguel Telleria de Esteban telleriam AT unican.es)
Página 13 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Tipos de relojes disponibles en POSIX
●
●
●
●
5 Abr 2011
CLOCK_MONOTONIC
–
Wall clock time que mide el tiempo desde que se encendió la CPU
–
Es inmutable, no se reajusta nunca
–
Puede ser usado por las aplicaciones para periodos cortos de precision
CLOCK_REALTIME
–
Wall clock time pensado para el medir el tiempo del mundo real
–
Se ajusta por el administrador, NTP...
–
Pensado para medidas de tiempos largos o sincronismo con otros sistemas
Relojes de proceso
–
Mide tiempo consumido por un proceso acumulando el de todos sus threads
–
Se obtiene a partir del PID del proceso
Relojes de thread
–
Mide el tiempo consumido por un thread
–
Se obtiene a partir de su pthread_t
Miguel Telleria de Esteban telleriam AT unican.es)
Página 14 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Demostración
●
Clase Multithread del proyecto ExecutionTime
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 15 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
API de relojes en Linux (glibc)
●
●
#include <time.h>
●
Linkar con -lrt
En Linux el tipo clockid_t es un entero de 32 bits
●
●
●
Los relojes MONOTONIC y REALTIME tienen sus constantes
predefinidas
●
CLOCK_MONOTONIC
●
CLOCK_REALTIME
Los relojes de proceso se obtienen mediante la función
●
●
Necesario saber esto para la JNI
int clock_getcpuclockid(pid_t pid, clockid_t *clock_id);
Los relojes de thread se obtienen mediante la función
●
5 Abr 2011
int pthread_getcpuclockid(pthread_t thread, clockid_t *clock_id);
Miguel Telleria de Esteban telleriam AT unican.es)
Página 16 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Formato de tiempo en POSIX
●
POSIX de tiempo real utiliza la estructura timespec
struct timespec
{
long tv_sec;
long tv_nsec;
};
●
Ventaja
●
Da un amplio rango de resoluciones en arquitecturas de 32 bit
–
●
Desde 1 ns hasta 68 años
Desventaja
●
Incómoda de operar
–
●
Solución: En sistemas modernos lo pasamos a enteros de 64 bits (long long)
–
5 Abr 2011
Todos acabamos definiéndonos macros
long long tiempo_64 = tiempo_tspec.tv_nsec + tiempo_tspec.tv_sec*1000000000L
Miguel Telleria de Esteban telleriam AT unican.es)
Página 17 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Usos de relojes POSIX
●
Pedir la hora
int clock_gettime(clockid_t clk_id, struct timespec *tp);
●
Pedir la resolución
int clock_getres(clockid_t clk_id, struct timespec *res);
●
Dormirse
int clock_nanosleep(clockid_t clock_id, int flags,
const struct timespec *request,
struct timespec *remain);
●
●
flags 0 (periodo relativo) o TIMER_ABSTIME (instante absoluto)
●
request: El periodo de espera o el instante de despertarse
●
remain: (sólo en timers relativos) tiempo que queda en caso de interrupción
Asociar un timer
int timer_create(clockid_t clockid, struct sigevent *evp,
timer_t *timerid);
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 18 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Interfaz JNI
●
Un buen recurso (a primer golpe de Google)
●
5 Abr 2011
http://macprogramadores.org/documentacion/jni.pdf
Miguel Telleria de Esteban telleriam AT unican.es)
Página 19 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Clase Java resultante
package cpuclock;
public class CpuClock {
// Constructor (llamarlo desde el thread)
public CpuClock();
// Tiempo de thread
public long get_thread_time_ms()
// Tiempo de proceso
public long get_process_time_ms()
}
public class PidTid {
// Constructor
public PidTid();
// PID y TID
public long gettid();
public long getpid();
}
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 20 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Instalación de la librería JNI
●
●
Compilación (como usuario normal)
●
Ir al directorio src del workspace
●
make
Instalación de la librería en /usr/lib/jni (como root)
●
●
●
make install
Limpieza de la librería
●
make clean
●
make distclean
Desintalación (como root)
●
5 Abr 2011
make uninstall
Miguel Telleria de Esteban telleriam AT unican.es)
Página 21 de 29
Eclipse TPTP Dynamic Probekits
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Dynamic Probekit de TPTP
●
●
●
5 Abr 2011
Permite insertar código de instrumentación en:
–
Entrada de método (desde el método llamado)
–
Salida de método (desde el método llamado)
–
Antes de llamar a un método (desde el método llamante)
–
Después de llamar a un método (desde el método llamante)
–
Secuencias catch o finalize de una excepción
–
Inicializadores estáticos de clase
En dicho código de instrumentación se puede:
–
Utilizar variables globales de la instrumentación
–
Acceder al this de la clase y a valores de retorno de funciones
–
Acceder a meta-data de la invocación (nombres de método, clase...)
–
Lo único que no se puede: acceder a variables locales del método
Se instrumenta el bytecode (.class)
–
Estáticamente (modificando los .class del disco) manualmente
–
Dinámicante (en memoria) automáticamente
Miguel Telleria de Esteban telleriam AT unican.es)
Página 23 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Creación de una sonda TPTP
●
La sonda se crea como un fichero en el proyecto eclipse
●
New → Other → Profiling and Logging → Probe source file
●
Se da un nombre a la sonda
–
Tiene que acabar en .probe
●
Se le asigna una carpeta en el workspace
●
Se elige el tipo de sonda
●
–
MethodProbe: Se inserta en el método o clase llamado
–
CallsiteProbe: Se inserta en el método o clase llamante
Opcional: Se especifica que metadata se quiere acceder
–
5 Abr 2011
Mejor hacerlo en el diseño de la sonda
Miguel Telleria de Esteban telleriam AT unican.es)
Página 24 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Diseño de la sonda TPTP
●
Una sonda consta de:
●
1 target: Filtro de clase y método
–
Lineas include
–
Líneas exclude
–
Igual que en el maletín de profiling. De hecho este filtro se añade a aquél
●
1 import: (Opcional) Una serie de paquetes que importamos
●
1 o más fragmentos de código java
–
De un tipo determinado: entry, exit, catch, beforeCall, afterCall....
–
Todos los fragmentos han de ser de la misma categoría
●
●
method Probe
· Callsite
–
Cada uno puede tener sus DataItems (metadata)
–
Propiedades: Fragment at Class scope: Contenido global compartido
Un proyecto eclipse puede tener muchas sondas
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 25 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Inserción de las sondas
●
Dinámicamente (en memoria)
●
●
●
●
Se hace con el “maletín de TPTP”
Hay que definir bien el filtro de clases si no se ha definido en los targets
de las probes
Ventajas:
–
No se modifican los .class
–
No hace falta re-aplicar las sondas manualmente cuando cambia el código o
las sondas
Estáticamente (en ficheros .class)
●
Se hace desde el proyecto eclipse en menu contextual de las sondas
●
Se han de especificar los ficheros .class uno por uno
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 26 de 29
Practica a realizar
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Práctica a realizar
●
Caracterizar estadísticamente el tiempo de servicio de un
Cliente o Servicio de la práctica.
●
●
●
Que cada uno elija un servicio distinto: cliente a, a1, a2, a3, b, b1, b2
,b3.
Se ha de instrumentar el método doWork() del Cliente o Servicio
Se ha de conseguir
●
Tiempo medio
●
Desviación típica
●
Histograma
●
5 Abr 2011
Miguel Telleria de Esteban telleriam AT unican.es)
Página 28 de 29
Computadores y Tiempo Real
Universidad de Cantabria
Diseño y Evaluación de Configuraciones
Instrumentacion de código
Procedimiento a seguir
●
Parra arrancar el sistema usar el script launch.pl
●
●
Luego quitar el componente que queráis medir y arrancarlo desde Eclipse
con los parámetros de arranque.
Crear una probe para el método doWork()
●
Codigo de ambito de clase (propiedades)
–
●
Sonda entry:
–
●
5 Abr 2011
Declara un ArrayList de tiempos de ejecución (long) y un cpuclock
Crea un objeto cpuclock (global) y mide el tiempo de CPU inicial en
milisegundos añadiéndolo al final del array
Sonda exit:
–
Lee el tiempo de ejecución y substrae el tiempo leído por entry. Pintándolo en
pantalla
–
Cuando el tamaño del array size llega a 100 escribe los tiempos en un fichero
y vacía el array
Miguel Telleria de Esteban telleriam AT unican.es)
Página 29 de 29