O que está sendo armazenado em cache?

3

Eu tenho um sistema embarcado com pouca memória. O sistema tem problemas de alocação. Talvez devido à fragmentação: Questão de alocação de memória no NOMMU? A plataforma é uma plataforma NOMMU e, portanto, suspeito que o cache do Linux seja a causa dessa fragmentação. Talvez seja, talvez não seja. O problema é que não consigo ver o que meu sistema ganharia com o cache. O sistema é construído a partir das seguintes partições:

  1. partição RAM. (Kernel, espaço do usuário fs, etc.)
  2. SPI Flash. (Alguns dados de configuração. Talvez alguns kb.)
  3. Cartão SD. (Dados registrados. Nunca serão lidos.)

Aqui está a saída do meu comando principal:

Mem: 23376K used, 5912K free, 0K shrd, 1624K buff, 8404K cached
CPU:  10% usr  42% sys   0% nic   0% idle  47% io   0% irq   0% sirq
Load average: 1.07 1.00 0.96 2/68 4299
...

Meu sistema tem 15M de RAM livre quando inicializado. Dentro de alguns minutos, mais de 60% é usado para cache. Normalmente, isso não importa, exceto se causar problemas de fragmentação devido a dificuldades do NOMMU. Agora, o que o kernel quer armazenar de qualquer maneira? A partição RAM? (Um pouco tolo.) O SPI Flash? (Boa idéia. Mas há apenas alguns kb lá.) O cartão SD? (Não precisa de armazenamento em cache neste cenário específico.)

Como você vê o que está sendo armazenado em cache? E como faço para reduzir o esquema de cache? (Eu realmente não preciso de muito cache. Não há ganho.)

Eu tentei montar o cartão SD e o flash spi com -o sync. Mas isso não faz diferença.

    
por Illishar 25.08.2014 / 14:41

1 resposta

2

Este é um bom utilitário, parte de linux-ftools . Você precisa fornecer o nome do arquivo como entrada e as estatísticas dos arquivos que estão no cache agora.

# fincore --pages=false --summarize --only-cached <file_name>

fincore [options] files...

  --pages=false      Do not print pages
  --summarize        When comparing multiple files, print a summary report
  --only-cached      Only print stats for files that are actually in cache.

root@xxxxxx:/var/lib/mysql/blogindex# fincore --pages=false --summarize --only-cached * 
stats for CLUSTER_LOG_2010_05_21.MYI: file size=93840384 , total pages=22910 , cached pages=1 , cached size=4096, cached perc=0.004365 
stats for CLUSTER_LOG_2010_05_22.MYI: file size=417792 , total pages=102 , cached pages=1 , cached size=4096, cached perc=0.980392 
stats for CLUSTER_LOG_2010_05_23.MYI: file size=826368 , total pages=201 , cached 
---
total cached size: xxx

Além disso, o sistema de arquivos tmpfs ou ramfs é parte do cache.

Como observado na documentação do tmpfs

Since tmpfs lives completely in the page cache and on swap, all tmpfs
pages currently in memory will show up as cached. It will not show up
as shared or something like that

tmpfs has three mount options for sizing:

size:      The limit of allocated bytes for this tmpfs instance. The 
           default is half of your physical RAM without swap. 

           **If you oversize your tmpfs instances the machine will deadlock
           since the OOM handler will not be able to free that memory.**

nr_blocks: The same as size, but in blocks of PAGE_CACHE_SIZE.
nr_inodes: The maximum number of inodes for this instance. The default
           is half of the number of your physical RAM pages, or (on a
           machine with highmem) the number of lowmem RAM pages,
           whichever is the lower.

Você pode limitar o sistema de arquivos tmpfs

# mount -t tmpfs -o size=60M tmpfs /tmp -> Size limited to 60M

Você também pode ajustar suas entradas / proc / sys / vm / * para melhorar o mecanismo de armazenamento em cache.

Eu escrevi uma postagem aqui sobre o cache do Linux . Provavelmente isso pode ajudá-lo.

    
por 16.11.2014 / 19:24