Desempenho de Linux / Perl Mmap

Estou tentando otimizar o manuseio de grandes conjuntos de dados usando o mmap. Um conjunto de dados está no intervalo de gigabytes. A idéia era mapear todo o arquivo na memória, permitindo que vários processos trabalhassem no conjunto de dados simultaneamente (somente leitura). Não está funcionando como esperado.

Como um teste simples eu simplesmente mapeio o arquivo (usando o módulo Sys :: Mmap do perl, usando o submempo "mmap" que eu acredito que mapeia diretamente para a função C subjacente) e tenho o processo de suspensão. Ao fazer isso, o código gasta mais de um minuto antes de retornar da chamada mmap, apesar desse teste não fazer nada - nem mesmo uma leitura - do arquivo mmap'ed.

Adivinhando, eu pensei que talvez o Linux exigisse que todo o arquivo fosse lido no primeiro mapeamento, então depois que o arquivo foi mapeado no primeiro processo (enquanto ele estava dormindo), invoquei um teste simples em outro processo que tentou ler o arquivo. primeiros poucos megabytes do arquivo.

Surpreendentemente, parece que o segundo processo também gasta muito tempo antes de retornar da chamada mmap, quase ao mesmo tempo que mapear o arquivo pela primeira vez.

Eu tenho certeza que MAP_SHARED está sendo usado e que o processo que mapeou o arquivo na primeira vez ainda está ativo (que não terminou e que o mmap não foi desmapeado).

Eu esperava que um arquivo mmapped me permitisse dar a vários processos de trabalho acesso aleatório efetivo ao arquivo grande, mas se toda chamada mmap exigir a leitura do arquivo inteiro primeiro, será um pouco mais difícil. Eu não testei usando processos de execução longa para ver se o acesso é rápido após o primeiro atraso, mas esperava usar MAP_SHARED e outro processo separado seria suficiente.

Minha teoria era que o mmap retornaria mais ou menos imediatamente, e que o linux carregaria os blocos mais ou menos sob demanda, mas o comportamento que estou vendo é o oposto, indicando que requer a leitura de todo o arquivo em cada chamada para o mmap.

Alguma idéia do que estou fazendo errado, ou se eu entendi completamente errado como o mmap deve funcionar?

questionAnswers(9)

yourAnswerToTheQuestion