Guia de rastreamento dinâmico Solaris

Capítulo 24 Provedor vminfo

O provedor vminfo disponibiliza os teste que correspondem às estatísticas do kernel vm. Como estas estatísticas fornecem a entrada dos utilitários de monitoramento do sistema como o vmstat(1M), o provedor vminfo ativa a rápida exploração do comportamento anormal observado.

Testes

O provedor vminfo disponibiliza os testes que correspondem aos campos na estatística do kernel chamada vm: um teste fornecido por vmsinfo é acionado imediatamente antes que o valor vm correspondente seja incrementado. Para exibir ambos os nomes e os valores atuais da estatística do kernel chamada vm, use o comando kstat(1M), conforme mostrado no exemplo seguinte:


$ kstat -n vm
module: cpu                             instance: 0
name:   vm                              class:    misc
        anonfree                        13
        anonpgin                        2620
        anonpgout                       13
        as_fault                        12528831
        cow_fault                       2278711
        crtime                          202.10625712
        dfree                           1328740
        execfree                        0
        execpgin                        5541
        ...

Os testes do sysinfo estão descritos na Tabela 24–1.

Tabela 24–1 Testes do vminfo

anonfree

Teste que é acionado sempre que uma página anônima não modificada é liberada como parte da atividade de paginação. As páginas anônimas são aquelas que não estão associadas a um arquivo. A memória que contém tais páginas inclui a memória de pilha, a memória de empilhamento ou a memória obtida pelo mapeamento explícito de zero(7D).

anonpgin

Teste que é acionado sempre que uma página anônima é paginada a partir de um dispositivo de troca. 

anonpgout

Teste que é acionado sempre que uma página anônima modificada é paginada para um dispositivo de troca. 

as_fault

Teste que é acionado sempre que uma falha é detectada em uma página, sendo que a falha pode ser de proteção ou de copiar ao gravar. 

cow_fault

Teste que é acionado sempre que uma falha de copiar ao gravar é detectada em uma página. arg0 contém o número de páginas que são criadas como um resultado de copiar ao gravar.

dfree

Teste que é acionado sempre que uma página é liberada como um resultado da atividade de paginação. Sempre que dfree é acionado, exatamente um entre anonfree, execfree ou fsfree também será acionado subseqüentemente.

execfree

Teste que é acionado sempre que uma página executável não modificada é liberada como resultado de uma atividade de paginação. 

execpgin

Teste que é acionado sempre que uma página executável é paginada a partir do armazenamento de apoio. 

execpgout

Teste que é acionado sempre que uma página executável modificada é paginada para o armazenamento de apoio. A maior parte da paginação de páginas executáveis ocorre em termos de execfree. execpgout só poderá ser acionada, se uma página executável for modificada na memória, uma ocorrência incomum na maioria dos sistemas.

fsfree

Teste que é acionado sempre que uma página de dados do sistema de arquivos não modificada é liberada como parte da atividade de paginação. 

fspgin

Teste que é acionado sempre que uma página do sistema de arquivos é paginada a partir do armazenamento de apoio. 

fspgout

Teste que é acionado sempre que uma página do sistema de arquivos modificada é paginada para o armazenamento de apoio. 

kernel_asflt

Teste que é acionado sempre que uma falha de página é detectada pelo kernel em uma página em seu próprio espaço de endereço. Sempre que kernel_asflt for acionado, ele será imediatamente precedido por um acionamento do teste as_fault.

maj_fault

Teste que é acionado sempre que é detectada uma falha de página que resulta na E/S de um armazenamento de apoio ou dispositivo de troca. Sempre que maj_fault for acionado, ele será imediatamente precedido de um acionamento do teste pgin.

pgfrec

Teste que é acionado sempre que uma página é reclamada da lista de páginas livres. 

pgin

Teste que é acionado sempre que uma página é paginada a partir do armazenamento de apoio ou de um dispositivo de troca. Este teste é diferente de maj_fault no sentido de que maj_fault só é acionado quando uma página é paginada como resultado de uma falha de página. pgin é acionado toda vez que uma página é paginada, independentemente do motivo.

pgout

Teste que é acionado sempre que uma página é paginada para o armazenamento de apoio ou para um dispositivo de troca. 

pgpgin

Teste que é acionado sempre que uma página é paginada a partir do armazenamento de apoio ou de um dispositivo de troca. A única diferença entre pgpgin e pgin é que pgpgin contém um número de páginas paginadas como arg0. pgin sempre contém 1 em arg0.

pgpgout

Teste que é acionado sempre que uma página é paginada para o armazenamento de apoio ou para um dispositivo de troca. A única diferença entre pgpgout e pgout é que pgpgout contém o número de páginas paginadas como arg0. (pgout sempre contém 1 em arg0.)

pgrec

Teste que é acionado sempre que uma página é reclamada. 

pgrrun

Teste que é acionado sempre que o paginador é agendado. 

pgswapin

Teste que é acionado sempre que as páginas de um processo trocado externamente são trocadas internamente. O número de páginas trocadas internamente está em arg0.

pgswapout

Teste que é acionado sempre que as páginas são trocadas externamente como parte de um processo de troca externa. O número de páginas trocadas externamente está em arg0.

prot_fault

Teste que é acionado sempre que uma falha de página é detectada devido a uma violação de proteção. 

rev

Teste que é acionado sempre que o deamon da página começa uma nova revolução através de todas as páginas. 

scan

Teste que é acionado sempre que o deamon da página examina uma página. 

softlock

Teste que é acionado sempre que ocorre uma falha da página como parte da colocação de um bloqueio de software na página. 

swapin

Teste que é acionado sempre que um processo trocado externamente é trocado internamente. 

swapout

Teste que é acionado sempre que um processo é trocado externamente. 

zfod

Teste que é acionado sempre que uma página preenchida com zeros é criada por demanda. 

Argumentos

arg0

O valor pelo qual as estatísticas devem ser incrementadas. Para a maioria dos testes, este argumento é sempre 1, mas para alguns ele pode ter outros valores; estes testes são comentados na Tabela 24–1.

arg1

Um ponteiro para o valor atual da estatística a ser incrementada. Este valor é uma quantidade de 64 bits que será incrementada pelo valor de arg0. Cancelar a referência deste ponteiro permitirá que os consumidores determinem a contagem atual das estatísticas correspondentes ao teste.

Exemplo

Examine a seguinte saída de vmstat(1M):


kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr cd s0 — —   in   sy   cs us sy id
 0 1 0 1341844 836720 26 311 1644 0 0 0  0 216 0  0  0  797  817  697  9 10 81
 0 1 0 1341344 835300 238 934 1576 0 0 0 0 194 0  0  0  750 2795  791  7 14 79
 0 1 0 1340764 833668 24 165 1149 0 0 0  0 133 0  0  0  637  813  547  5  4 91
 0 1 0 1340420 833024 24 394 1002 0 0 0  0 130 0  0  0  621 2284  653 14  7 79
 0 1 0 1340068 831520 14 202 380 0 0  0  0 59  0  0  0  482 5688 1434 25  7 68

A coluna pi na saída acima indica o número de páginas paginadas. O provedor vminfo permite que você aprenda mais sobre a origem destas paginações, conforme mostrado no exemplo seguinte:


dtrace -n pgin'{@[execname] = count()}'
dtrace: description 'pgin' matched 1 probe
^C
  xterm                                                             1
  ksh                                                               1
  ls                                                                2
  lpstat                                                            7
  sh                                                               17
  soffice                                                          39
  javaldx                                                         103
  soffice.bin                                                    3065

A saída mostra que um processo associado ao software StarOffice TM, soffice.bin, é responsável pela maioria das paginações. Para ter uma melhor idéia do soffice.bin em termos do comportamento da memória virtual, você poderia ativar todos os testes vminfo . O exemplo seguinte executa o dtrace(1M) enquanto inicia o software StarOffice:


dtrace -P vminfo'/execname == "soffice.bin"/{@[probename] = count()}'
dtrace: description 'vminfo' matched 42 probes
^C

  kernel_asflt                                                      1
  fspgin                                                           10
  pgout                                                            16
  execfree                                                         16
  execpgout                                                        16
  fsfree                                                           16
  fspgout                                                          16
  anonfree                                                         16
  anonpgout                                                        16
  pgpgout                                                          16
  dfree                                                            16
  execpgin                                                         80
  prot_fault                                                       85
  maj_fault                                                        88
  pgin                                                             90
  pgpgin                                                           90
  cow_fault                                                       859
  zfod                                                           1619
  pgfrec                                                         8811
  pgrec                                                          8827
  as_fault                                                       9495

O script de exemplo seguinte fornece mais informações sobre o comportamento da memória virtual do software StarOffice durante a sua inicialização:

vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin" && start == 0/
{
	/*
	 * This is the first time that a vminfo probe has been hit; record
	 * our initial timestamp.
	 */
	start = timestamp;
}

vminfo:::maj_fault,
vminfo:::zfod,
vminfo:::as_fault
/execname == "soffice.bin"/
{
	/*
	 * Aggregate on the probename, and lquantize() the number of seconds
	 * since our initial timestamp.  (There are 1,000,000,000 nanoseconds
	 * in a second.)  We assume that the script will be terminated before
	 * 60 seconds elapses.
	 */
	@[probename] =
	    lquantize((timestamp - start) / 1000000000, 0, 60);
}

Execute o script ao iniciar novamente o software StarOffice. Em seguida, crie um novo desenho, crie uma nova apresentação e feche todos os arquivos e saia do aplicativo. Pressione Control-C no shell que está executando o script de D. Os resultados fornecem uma visão do comportamento da memória virtual ao longo do tempo:


# dtrace -s ./soffice.d
dtrace: script './soffice.d' matched 10 probes
^C

 maj_fault                                         
           value  ------------- Distribution ------------- count    
               7 |                                         0        
               8 |@@@@@@@@@                                88       
               9 |@@@@@@@@@@@@@@@@@@@@                     194      
              10 |@                                        18       
              11 |                                         0        
              12 |                                         0        
              13 |                                         2        
              14 |                                         0        
              15 |                                         1        
              16 |@@@@@@@@                                 82       
              17 |                                         0        
              18 |                                         0        
              19 |                                         2        
              20 |                                         0        

  zfod                                              
           value  ------------- Distribution ------------- count    
             < 0 |                                         0        
               0 |@@@@@@@                                  525      
               1 |@@@@@@@@                                 605      
               2 |@@                                       208      
               3 |@@@                                      280      
               4 |                                         4        
               5 |                                         0        
               6 |                                         0        
               7 |                                         0        
               8 |                                         44       
               9 |@@                                       161      
              10 |                                         2        
              11 |                                         0        
              12 |                                         0        
              13 |                                         4        
              14 |                                         0        
              15 |                                         29       
              16 |@@@@@@@@@@@@@@                           1048     
              17 |                                         24       
              18 |                                         0        
              19 |                                         0        
              20 |                                         1        
              21 |                                         0        
              22 |                                         3        
              23 |                                         0        

  as_fault                                          
           value  ------------- Distribution ------------- count    
             < 0 |                                         0        
               0 |@@@@@@@@@@@@@                            4139     
               1 |@@@@@@@                                  2249     
               2 |@@@@@@@                                  2402     
               3 |@                                        594      
               4 |                                         56       
               5 |                                         0        
               6 |                                         0        
               7 |                                         0        
               8 |                                         189      
               9 |@@                                       929      
              10 |                                         39       
              11 |                                         0        
              12 |                                         0        
              13 |                                         6        
              14 |                                         0        
              15 |                                         297      
              16 |@@@@                                     1349     
              17 |                                         24       
              18 |                                         0        
              19 |                                         21       
              20 |                                         1        
              21 |                                         0        
              22 |                                         92       
              23 |                                         0

A saída mostra o comportamento do StarOffice com relação ao sistema de memória virtual. Por exemplo, o teste maj_fault não foi acionado até que uma nova instância do aplicativo fosse iniciada. Como você poderia esperar, um “início quente” do StarOffice não resultou em novas falhas graves. A saída as_fault mostra uma seqüência ininterrupta inicial de atividades, latência quando o usuário localizou o menu para criar um novo desenho, outro período de inatividade, e uma seqüência ininterrupta de atividades finais quando o usuário clicou em uma nova apresentação. A saída zfod mostra que a criação de uma nova apresentação induziu uma pressão significativa por páginas preenchidas com zero, mas somente por um curto período de tempo.

A próxima iteração da investigação do DTrace neste exemplo dependeria da direção em que você deseja explorar. Se quiser entender a origem das páginas preenchidas com zero, você poderia agregar ustack () em uma ativação de zfod. Talvez você queira estabelecer um limite para páginas preenchidas com zero e usar a ação destrutiva stop() para parar o processo incorreto quando o limite for excedido. Esta abordagem permitiria que você usasse mais ferramentas de depuração como truss(1) ou mdb(1). O provedor vminfo permite que você associe as estatísticas vistas na saída das ferramentas convencionais como vmstat(1M) aos aplicativos que estão induzindo o comportamento do sistema.

Estabilidade

O provedor vminfo usa o mecanismo de estabilidade do DTrace para descrever suas estabilidades, conforme mostrado na tabela seguinte. Para obter mais informações sobre o mecanismo de estabilidade, consulte o Capítulo 39Estabilidade.

Elemento 

Estabilidade de nome 

Estabilidade de dados 

Classe de dependência 

Provedor 

Desenvolvendo 

Desenvolvendo 

ISA

Módulo 

Privada 

Privada 

Desconhecida 

Função 

Privada 

Privada 

Desconhecida 

Nome 

Desenvolvendo 

Desenvolvendo 

ISA

Argumentos 

Privada 

Privada 

ISA