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 |