Veja Documentation / sysctl / vm.txt :
dirty_ratio
Contains, as a percentage of total available memory that contains free pages and reclaimable pages, the number of pages at which a process which is generating disk writes will itself start writing out dirty data.
The total available memory is not equal to total system memory.
A memória disponível é calculada em global_dirtyable_memory () . É igual à quantidade de memória livre mais o cache da página. Não inclui páginas permutáveis (ou seja, alocações de memória anônima, memória que não é apoiada por um arquivo).
Esse comportamento se aplica desde Linux 3.14 (2014) . Antes dessa alteração, as páginas permutáveis eram incluídas no total global_dirtyable_memory ().
Exemplo de estatísticas durante a execução do comando dd
:
$ while true; do grep -E '^(Dirty:|Writeback:|MemFree:|Cached:)' /proc/meminfo | tr '\n' ' '; echo; sleep 1; done
MemFree: 1793676 kB Cached: 1280812 kB Dirty: 4 kB Writeback: 0 kB
MemFree: 1240728 kB Cached: 1826644 kB Dirty: 386128 kB Writeback: 67608 kB
MemFree: 1079700 kB Cached: 1983696 kB Dirty: 319812 kB Writeback: 143536 kB
MemFree: 937772 kB Cached: 2121424 kB Dirty: 312048 kB Writeback: 112520 kB
MemFree: 755776 kB Cached: 2298276 kB Dirty: 389828 kB Writeback: 68408 kB
...
MemFree: 136376 kB Cached: 2984308 kB Dirty: 485332 kB Writeback: 51300 kB
MemFree: 101340 kB Cached: 3028996 kB Dirty: 450176 kB Writeback: 119348 kB
MemFree: 122304 kB Cached: 3021836 kB Dirty: 552620 kB Writeback: 8484 kB
MemFree: 101016 kB Cached: 3053628 kB Dirty: 501128 kB Writeback: 61028 kB
A última linha mostra cerca de 3.150.000 KB de memória "disponível" e um total de 562.000 KB de dados sendo gravados ou aguardando writeback. Isso faz com que seja de 17,8%. Embora parecesse que a proporção flutuava mais do que isso, e muitas vezes estava mais perto de 15%. EDITAR : embora esses números pareçam mais próximos, não confie neste método. Ainda não é o cálculo correto e pode dar resultados muito errados. Veja o acompanhamento aqui .
Eu encontrei isso da maneira mais difícil:
Percebi que há um ponto de rastreio em balance_dirty_pages () , que pode ser usado para " analisando a dinâmica dos algoritmos de estrangulamento ". Então usei perf
:
$ sudo perf list '*balance_dirty_pages'
List of pre-defined events (to be used in -e):
writeback:balance_dirty_pages [Tracepoint event]
...
$ sudo perf record -e writeback:balance_dirty_pages dd if=/dev/zero of=~/test bs=1M count=2000
$ sudo perf script
Ele mostrou que dirty
(medido em páginas de 4096 bytes) era menor do que eu esperava, porque setpoint
era baixo. Eu segui o código; isso significava que deve haver um valor similarmente baixo para freerun
na definição do ponto de rastreio, que é definido como (thresh + bg_thresh) / 2
... e retornou para global_dirtyable_memory()
.