Com que frequência o valor do PSS é atualizado para um determinado processo em / proc / pid / smaps

2

Portanto, se n processos estão compartilhando uma biblioteca L com tamanho M, então a contribuição para o seu PSS é M / n.

Agora imagine que um dos processos termine. Então a contribuição seria M / (n-1).

Q1: A minha pergunta é em quanto tempo essa mudança é refletida nos valores do PSS de processos ainda em execução e usando a biblioteca compartilhada?

Q2: Como um caso trivial, suponha que apenas dois processos estejam usando um lib L compartilhado de tamanho 100K. A contribuição do PSS para cada processo é de 50K. Agora, quando P2 morre, é o único processo usando L. Assim, seu PSS deve aumentar e se tornar 100K. Em quanto tempo isso acontecerá, assim que P2 morrer, ou depois de algum tempo? Depois de quanto tempo?

    
por abc 15.03.2012 / 00:13

1 resposta

5

A alteração é refletida imediatamente. Não há cache ao longo do caminho. Quando você lê /proc/<pid>/smaps , você na verdade aciona uma passagem da tabela de páginas desse processo. Informações sobre os mapeamentos são acumuladas ao longo do caminho e exibidas, sem nenhum armazenamento em cache.

O código por trás do arquivo /proc/<pid>/smaps está em fs/proc/task_mmu.c , especificamente o show_smap função.
Essa função faz um walk_page_range com smaps_pte_range como o retorno de chamada de PTE. smaps_pte_range acumula as informações em struct mem_size_stats .

A parte desse código responsável por PSS faz:

mapcount = page_mapcount(page);
if (mapcount >= 2) {
    if (pte_dirty(ptent) || PageDirty(page))
        mss->shared_dirty += ptent_size;
    else
        mss->shared_clean += ptent_size;
    mss->pss += (ptent_size << PSS_SHIFT) / mapcount;
} else {
    if (pte_dirty(ptent) || PageDirty(page))
        mss->private_dirty += ptent_size;
    else
        mss->private_clean += ptent_size;
    mss->pss += (ptent_size << PSS_SHIFT);
}

(Você pode ver aqui que as páginas só podem ser contabilizadas na Shared parte se for realmente mapeada mais de uma vez - é contabilizada como particular caso contrário.)

page_mapcount é definido in-line em linux/mm.h e simplesmente acessa um struct page :

static inline int page_mapcount(struct page *page)
{
    return atomic_read(&(page)->_mapcount) + 1;
}

Portanto, o Atendimento Microsoft está "sempre atualizado".

    
por 15.03.2012 / 08:25