Como instruir o Linux para não trocar páginas quentes de arquivos mmapedados?

1

Eu tenho um servidor onde eu executo processos de trabalho que mmap serveral bastante grandes arquivos de "dicionário" somente leitura (~ 8GB no total). Os testes mostraram que eles acessam ativamente apenas cerca de ~ 1 GB das páginas nesses arquivos. No mesmo servidor, executo outro processo que lê sequencialmente um arquivo enorme, mescla algumas atualizações nele e grava o resultado em uma nova versão desse arquivo enorme. Não há outra atividade importante no servidor além desse processo de "fusão" e processos de "trabalho". Portanto, normalmente os trabalhadores devem estar ligados à CPU e a fusão deve estar vinculada ao disco. Mas o que eu vejo é que os trabalhadores estão constantemente se engasgando com grandes falhas de página. A fusão usa cerca de 20 GB de RSS e a máquina tem 48 GB. Existem 4 trabalhadores. Eles têm 2GB RSS cada e apenas 600MB compartilhados (em vez de 1GB esperado de hot pages). De alguma forma, o resto da memória é usado principalmente pelo cache do fs. Existe uma maneira de "priorizar" as páginas quentes dos meus arquivos mmaped na memória? Eu tentei o mal (MADV_WILLNEED), mas não parece ajudar. Talvez haja uma solução com cgroups ou sysctls?

$ free
             total       used       free     shared    buffers     cached
Mem:      49324064   48863392     460672          0      22520   25409896
-/+ buffers/cache:   23430976   25893088
Swap:            0          0          0

$ uname -a
Linux dev-kiwi02 3.2.0-25-server #40-Ubuntu SMP Fri May 25 13:12:35 UTC 2012 x86_64 GNU/Linux

P.S. Perguntou isso no StackOverflow já, mas parece que ServerFault é mais apropriado.

    
por Alexander Gololobov 03.12.2012 / 10:55

1 resposta

0

O que você provavelmente precisa é de mlock (), não de madvise (). Madvise é muito "fraco"; mlock bloqueia a memória no kernel. Supondo que você tenha RAM suficiente e bloqueie apenas as páginas "quentes" (não as 8GB inteiras), isso não deve ser um problema para sua configuração.

Outra solução que pode parecer contraintuitiva: desative a troca. Sua máquina tem 48GB; subtrair 4 trabalhadores, dados compartilhados e seu sistema operacional e você ainda > Restam 35 GB. Você escreve que sua fusão lê um arquivo sequencialmente e insere algumas entradas; por isso, eu suponho que você não precisa manter o arquivo grande na memória, mas pode escrevê-lo sequencialmente também; você só precisa carregar todas as suas atualizações na memória, o que não deve ser um problema.

    
por 03.12.2012 / 21:49