Problema relacionado ao disco ou à memória

Assim como uma grande fração de memória real está disponível para arquivos de buffering, o espaço de página do sistema está disponível como armazenamento temporário para dados de trabalho do programa que foi forçado a sair de RAM.

Suponhamos que você tenha um programa que leia pouco ou nenhum dado e que ainda mostre os sintomas de ser dependente de I/O. Pior, a proporção de tempo real para o usuário + tempo do sistema não melhora com execuções sucessivas. O programa é provavelmente memória-limitado, e sua E/S é para, e possivelmente do espaço de paginação. Uma maneira de verificar essa possibilidade é mostrada no seguinte script de shell vmstatit :
vmstat -s >temp.file   # cumulative counts before the command
time $1                # command under test
vmstat -s >>temp.file  # cumulative counts after execution
grep "pagi.*ins" temp.file >>results   # extract only the data
grep "pagi.*outs" temp.file >>results  # of interest

O script vmstatit resume o relatório volumoso vmstat -s , que dá contagens cumulativas para várias atividades do sistema desde que o sistema foi iniciado.

Se o script shell for executado da seguinte forma:
# vmstatit "cp file1 file2"  2>results
o resultado é o seguinte:
real    0m0.03s
user    0m0.01s
sys     0m0.02s
     2323 paging space page ins
     2323 paging space page ins
     4850 paging space page outs
     4850 paging space page outs
As estatísticas de paginação de betão-e-depois de paginação são idênticas, o que confirma nossa crença de que o comando cp não é ligado em paginação. Uma variante estendida do script shell vmstatit pode ser usada para mostrar a situação verdadeira, da seguinte forma:
vmstat -s >temp.file
time $1
vmstat -s >>temp.file
echo "Ordinary Input:"               >>results
grep "^[ 0-9]*page ins"    temp.file >>results
echo "Ordinary Output:"              >>results
grep "^[ 0-9]*page outs"   temp.file >>results
echo "True Paging Output:"           >>results
grep "pagi.*outs"          temp.file >>results
echo "True Paging Input:"            >>results
grep "pagi.*ins"           temp.file >>results
Como o arquivo E/S no sistema operacional é processado por meio do VMM, o comando vmstat -s relata E/S de programa ordinário como página e outs de página. Quando a versão anterior do script shell vmstatit foi executada contra o comando cp de um arquivo grande que não tinha sido lido recentemente, o resultado foi o seguinte:
real    0m2.09s
user    0m0.03s
sys     0m0.74s
Ordinary Input:
    46416 page ins
    47132 page ins
Ordinary Output:
   146483 page outs
   147012 page outs
True Paging Output:
     4854 paging space page outs
     4854 paging space page outs
True Paging Input:
     2527 paging space page ins
     2527 paging space page ins

A saída de comando time confirma a existência de uma dependência de E/S. O aumento de página ins mostra a E/S necessária para satisfazer o comando cp . O aumento de outs de página indica que o arquivo é grande o suficiente para forçar a escrita de páginas sujas (não necessariamente as suas) da memória. O fato de não haver alteração nas contagens de paginação acumulativa-espaço-E/S confirma que o comando cp não constrói estruturas de dados grandes o suficiente para sobrecarregar a memória da máquina de teste.

A ordem em que esta versão do script vmstatit relata E/S é intencional. Programas típicos lêem entrada de arquivo e depois gravam saída de arquivo. A atividade de paginação, por outro lado, geralmente começa com a escrita para fora de uma página do segmento de trabalho que não cabe. A página é lida novamente em apenas se o programa tentar acessá-lo. O fato de o sistema de teste ter experimentado quase o dobro depaging space page outscomopaging space page insdesde que foi bootado indica que pelo menos alguns dos programas executados neste sistema armazenaram dados em memória que não foi acessada novamente antes do término do programa. Os programas de memória limitada fornecem mais informações. Veja também Desempenho de memória.

Para mostrar os efeitos da limitação de memória nessas estatísticas, o exemplo a seguir observa um determinado comando em um ambiente de memória adequada (32 MB) e, em seguida, encolhe artificialmente o sistema usando o comando rmss (veja Avaliação de requisitos de Memória com o comando rmss). A sequência de comandos a seguir
# cc -c ed.c
# vmstatit "cc -c ed.c" 2>results
primeira memória primes com o arquivo de origem de 7944 linhas e o arquivo executável do compilador C, então mede a atividade de E/S da segunda execução:
real    0m7.76s
user    0m7.44s
sys     0m0.15s
Ordinary Input:
    57192 page ins
    57192 page ins
Ordinary Output:
   165516 page outs
   165553 page outs
True Paging Output:
    10846 paging space page outs
    10846 paging space page outs
True Paging Input:
     6409 paging space page ins
     6409 paging space page ins
Claramente, isso não é E/S limitado. Não há nem mesmo nenhuma E/S necessária para ler o código-fonte. Se então emitimos o seguinte comando:
# rmss -c 8
para alterar o tamanho efetivo da máquina para 8 MB, e executar a mesma sequência de comandos, obtemos a seguinte saída:
real    0m9.87s
user    0m7.70s
sys     0m0.18s
Ordinary Input:
    57625 page ins
    57809 page ins
Ordinary Output:
   165811 page outs
   165882 page outs
True Paging Output:
    11010 paging space page outs
    11061 paging space page outs
True Paging Input:
     6623 paging space page ins
     6701 paging space page ins

Os seguintes sintomas de dependência de E/S estão presentes:

  • O tempo decorrido é mais longo que o tempo total da CPU
  • Quantidades significativas de E/S ordinárias no nth execução do comando
O fato de que o tempo decorrido é mais longo do que na memória-situação não restrita, e a existência de quantidades significativas de E/S de espaço de paginação-, deixa claro que o compilador está sendo prejudicado pela memória insuficiente.
Nota: Este exemplo ilustra os efeitos da restrição de memória. Nenhum esforço foi feito para minimizar o uso da memória por outros processos, portanto, o tamanho absoluto no qual o compilador foi forçado a página neste ambiente não constitui uma medição significativa.
Para evitar trabalhar com uma máquina encolhida artificialmente até o próximo reinício, execute
# rmss -r

para liberar de volta para o sistema operacional a memória que o comando rmss teve sequestesado, restaurando assim o sistema para sua capacidade normal.