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.
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. |
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. |
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.
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 |