Monitoramento de System Calls com DTrace

2.269 visualizações

Publicada em

Relatório em PDF: http://tinyurl.com/mf6agk
Apresentação de comparação de eficiência de chamadas de sistema de linguagens de programação utilizando uma plataforma de benchmarking escrita em DTrace feita para a disciplina de Sistemas Operacionais da Escola Politécnica da USP.

Publicada em: Tecnologia
1 comentário
2 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
2.269
No SlideShare
0
A partir de incorporações
0
Número de incorporações
19
Ações
Compartilhamentos
0
Downloads
13
Comentários
1
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Monitoramento de System Calls com DTrace

  1. 1. Monitoramento de System Calls no OpenSolaris PCS2042 – Sistemas Operacionais Paulo Shindi Kuniyoshi Pedro Victor Losada Cavalcante Rafael Barbolo Lopes Professor Jorge Kinoshita
  2. 2. Introdução Objetivo: Monitorar System Calls no OpenSolaris através do DTrace
  3. 3. DTrace O que é: Ferramenta de instrumentação dinâmica de sistemas de produção Quem desenvolveu: Sun Microsystems Plataformas: OpenSolaris Mac OS X Linux
  4. 4. Arquitetura DTrace
  5. 5. Metodologia Ambiente: Sistema Operacional: OpenSolaris 10 Máquina: VirtualBox 2.2.2 Documentação: SUN Docs, Blogs Scripts básicos: Contagem de system calls chamadas Exemplo de aplicação: Benchmarking de processamento de texto
  6. 6. Scripts
  7. 7. 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]
  8. 8. Exemplo 1 #include <stdio.h> #include <stdlib.h> int main() { int num; printf ("PID=%dn", getpid()); sleep(10); printf ("Digite um numero: "); scanf("%d", &num); printf(“O numero e = %d”, num); }
  9. 9. Terminal 1: Execução
  10. 10. Terminal 2: Monitoramento
  11. 11. Exemplo 2 #include <stdio.h> #include <stdlib.h> main() { int n,result; printf ("Processo Pai Criado PID=%dn", getpid()); n = fork(); printf("O valor de n= %dn", n); sleep(5); if(n==0) { execl("/bin/ls","ls",NULL,NULL); } else { wait(NULL); printf("Fim do programan"); }
  12. 12. Terminal 1: Execução
  13. 13. Terminal 2: Monitoramento PID Pai
  14. 14. Terminal 3: Monitoramento PID Filho
  15. 15. Exemplo 3 1) Abrir o gedit. 2) Rodar o Dtrace usando o script 1. 3) Digitar e salvar no Gedit. 4) Fechar o gedit.
  16. 16. Script 2: Monitoramento Novo Processo #!/usr/sbin/dtrace -s syscall::: /pid == $target/ { @count_table[probefunc]=count(); }
  17. 17. 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
  18. 18. Aplicação dos Scripts
  19. 19. Benchmarking com DTrace “processo de comparação entre dois ou mais sistemas”
  20. 20. Benchmarking com DTrace “processo de comparação entre dois ou mais sistemas programas de processamento de texto” Algoritmo Ler arquivos de texto e contar ocorrências do caractere “a” Ser o mais simples possível (não otimizado) Metodologia Utilizar diferentes linguagens de programação (C, Java, Perl, Python e Ruby) Aplicar o algoritmo a arquivos de 1KB a 400MB
  21. 21. Plataforma de Testes Host (Windows XP): Core 2 Duo – 2GHz Memória principal: 2GB Disco rígido: 120GB Guest (OpenSolaris10 no VirtualBox): Memória principal: 873MB Disco rígido: 7,04GB
  22. 22. Script DTrace #!/usr/sbin/dtrace -s dtrace:::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 segundosn”,(timestamp - self->start)/1000000000); }
  23. 23. C #include <stdio.h> 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': %dn", count); return 0; } 17 linhas
  24. 24. Java 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); } } 17 linhas
  25. 25. Perl open(FILE,"arquivos/arq"); $count=0; while(<FILE>) { $count += ($_ =~ tr/a//); } close(FILE); print("Total de letras 'a': ",$count,"n"); 7 linhas
  26. 26. Python print "Total de letras 'a': %d " % (open("arquivos/arq").read().count("a")) 1 linha
  27. 27. Ruby print "Total de letras 'a': ",File.read("arquivos/arq").scan("a").size 1 linha
  28. 28. Resultados
  29. 29. Tempo de Execução
  30. 30. Tempo de Execução Tempo de execução 500 450 400 350 Tempo (s) 300 C 250 Java 200 150 Perl 100 Python 50 Ruby 0 1KB 10KB 100KB 1MB 10MB 100MB 200MB 300MB 400MB Tamanho do Arquivo
  31. 31. Tempo de Execução Tempo de execução (sem java e ruby) 18 16 14 12 Tempo(s) 10 C 8 Perl Python 6 4 2 0 1KB 10KB 100KB 1MB 10MB 100MB 200MB 300MB 400MB Tamanho do Arquivo
  32. 32. Chamadas de Sistema
  33. 33. Quantidade de Chamadas (entry Chamadas de Sistema Chamadas de Sistema 900000 800000 700000 600000 500000 C 400000 Java 300000 Perl 200000 Python 100000 Ruby 0 1KB 10KB 100KB 1MB 10MB 100MB 200MB 300MB 400MB Tamanho do Arquivo
  34. 34. Quantidade de Chamadas (entr Chamadas de Sistema Chamadas de Sistema (sem java e rub 8000 7000 6000 5000 4000 C 3000 Perl 2000 Python 1000 0 1KB 10KB 100KB 1MB 10MB 100MB 200MB 300MB 400MB Tamanho do Arquivo
  35. 35. Conclusão do Teste ...quanto mais System Calls, maior o tempo de execução! Alto desempenho para processar texto C Perl Python
  36. 36. Obrigado

×