Monitoramento de System Calls com DTrace

Embed Size (px)

Citation preview

Slide 1

Monitoramento de System Calls no OpenSolaris

PCS2042 Sistemas Operacionais

Professor Jorge Kinoshita

Paulo Shindi KuniyoshiPedro Victor Losada CavalcanteRafael Barbolo Lopes

Introduo

Objetivo:Monitorar System Calls no OpenSolaris atravs do DTrace

DTrace

O que :Ferramenta de instrumentao dinmica de sistemas de produo

Quem desenvolveu:Sun Microsystems

Plataformas:OpenSolaris

Mac OS X

Linux

Arquitetura DTrace

Metodologia

Ambiente:

Sistema Operacional: OpenSolaris 10

Mquina: VirtualBox 2.2.2

Documentao:

SUN Docs, Blogs

Scripts bsicos:

Contagem de system calls chamadas

Exemplo de aplicao:

Benchmarking de processamento de texto

Scripts

O paulo mostrou vrios scripts que fizemos.Ns pudemos rod-los e ver vrias system calls sendo chamadas.Mas qual aplicao poderamos fazer disso?

Script 1: Monitoramento de processo existente

#!/usr/sbin/dtrace s
syscall:::
/pid == $1/
{
@count_table[execname,probefunc]=count();
}

Comando:# dtrace s [nome_script].d c [numero do id do processo]

Exemplo 1

#include
#include
int main() {
int num;
printf ("PID=%d\n", getpid());

sleep(10);

printf ("Digite um numero: ");
scanf("%d", &num);printf(O numero e = %d, num);
}

Terminal 1: Execuo

Terminal 2: Monitoramento

Exemplo 2

#include
#include
main() {
int n,result;
printf ("Processo Pai Criado PID=%d\n", getpid());
n = fork();
printf("O valor de n= %d\n", n);
sleep(5);
if(n==0) {
execl("/bin/ls","ls",NULL,NULL);
}
else {
wait(NULL);
printf("Fim do programa\n");
}

Terminal 1: Execuo

Terminal 2: Monitoramento PID Pai

Terminal 3: Monitoramento PID Filho

Exemplo 3

1) Abrir o gedit.2) Rodar o Dtrace usando o script 1.3) Digitar e salvar no Gedit.4) Fechar o gedit.

Script 2: Monitoramento Novo Processo

#!/usr/sbin/dtrace -s
syscall:::
/pid == $target/
{
@count_table[probefunc]=count();
}

Exemplo 4

Monitoramento de system calls a partir de uma linha de comando.

# dtrace s dtrace.c c [comando]

Neste Exemplo 4 usamos:

[comando] = ls

Aplicao dos Scripts

O paulo mostrou vrios scripts que fizemos.Ns pudemos rod-los e ver vrias system calls sendo chamadas.Mas qual aplicao poderamos fazer disso?

Benchmarking com DTrace

processo de comparao entre dois ou mais sistemas

Benchmarking com DTrace

Algoritmo

Ler arquivos de texto e contar ocorrncias do caractere a

Ser o mais simples possvel (no otimizado)

processo de comparao entre dois ou mais sistemas programas de processamento de texto

Metodologia

Utilizar diferentes linguagens de programao (C, Java, Perl, Python e Ruby)

Aplicar o algoritmo a arquivos de 1KB a 400MB

Plataforma de Testes

Host (Windows XP):Core 2 Duo 2GHz

Memria principal: 2GB

Disco rgido: 120GB

Guest (OpenSolaris10 no VirtualBox):Memria principal: 873MB

Disco rgido: 7,04GB

Script DTrace

#!/usr/sbin/dtrace -sdtrace:::BEGIN{printf("Iniciando Dtrace...\n");self->start = timestamp;}syscall:::/pid == $target/{@count_table[probefunc]=count();@total[Total de chamadas vindas de System Calls]=sum(1);}dtrace:::END{printf(Tempo: %d segundos\n,(timestamp - self->start)/1000000000);}

C

17 linhas

#include int main() {int count = 0;FILE *fp;char ch;fp=fopen("arquivos/arq","r");while(1) {ch = fgetc(fp);if (ch == 'a')count++;else if (ch == EOF)break;}fclose(fp);printf("Total de letras 'a': %d\n", count);return 0;}

Java

17 linhas

package leitor;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;public class Leitor {public static void main(String[] args) throws IOException {int c;int count = 0;char a = 'a';InputStreamReader isr = new InputStreamReader(new FileInputStream("arquivos/arq"));while ((c = isr.read()) != -1)if (a == ((char)c))count++;System.out.println("Total de letras 'a': " + count);}}

Perl

7 linhas

open(FILE,"arquivos/arq");$count=0;while() {$count += ($_ =~ tr/a//);}close(FILE);print("Total de letras 'a': ",$count,"\n");

Python

1 linha

print "Total de letras 'a': %d " % (open("arquivos/arq").read().count("a"))

Ruby

1 linha

print "Total de letras 'a': ",File.read("arquivos/arq").scan("a").size

Resultados

O paulo mostrou vrios scripts que fizemos.Ns pudemos rod-los e ver vrias system calls sendo chamadas.Mas qual aplicao poderamos fazer disso?

Tempo de Execuo

O paulo mostrou vrios scripts que fizemos.Ns pudemos rod-los e ver vrias system calls sendo chamadas.Mas qual aplicao poderamos fazer disso?

Tempo de Execuo

Tempo de Execuo

Chamadas de Sistema

O paulo mostrou vrios scripts que fizemos.Ns pudemos rod-los e ver vrias system calls sendo chamadas.Mas qual aplicao poderamos fazer disso?

Chamadas de Sistema

Chamadas de Sistema

Concluso do Teste

Alto desempenho para processar textoCPerlPython...quanto mais System Calls, maior o tempo de execuo!

Obrigado

O paulo mostrou vrios scripts que fizemos.Ns pudemos rod-los e ver vrias system calls sendo chamadas.Mas qual aplicao poderamos fazer disso?

Tempo de execuoTamanho do ArquivoTempo (s)CJavaPerlPythonRuby

1KB02000

10KB02010

100KB12001

1MB02000

10MB05012

100MB4304527

200MB6448885

300MB10671413247

400MB14911715447

Tempo de execuo (sem java e ruby)Tamanho do ArquivoTempo(s)CPerlPython

1KB000

10KB001

100KB100

1MB000

10MB001

100MB445

200MB688

300MB101413

400MB141715

Chamadas de SistemaTamanho do ArquivoQuantidade de Chamadas (entry+return)CJavaPerlPythonRuby

1KB4143961791195239

10KB4144721871199265

100KB4145061871203469

1MB55567820112172433

10MB19914139345136121777

100MB16399955117852801214865

200MB323919662633854401426693

300MB483929105049856001639837

400MB643938005365857601856159

Chamadas de Sistema (sem java e ruby)Tamanho do ArquivoQuantidade de Chamadas (entry + return)CPerlPython

1KB411791195

10KB411871199

100KB411871203

1MB552011217

10MB1993451361

100MB163917852801

200MB323933854401

300MB483949856001

400MB643965857601