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.