Instrua o Linux para armazenar arquivos em cache no swapfile

1

Background: O cache VFS do Linux armazenará em cache todos os arquivos lidos do disco na memória. Isso continua até que a RAM esteja cheia, quando os arquivos mais antigos são kickados do cache.

Estou executando o XenServer com armazenamento conectado à rede. Meus servidores possuem seu sistema de arquivos raiz no armazenamento conectado à rede. Eu também tenho um disco local em cada host XenServer. Meus servidores têm suas partições de swap neste armazenamento local. No meu caso específico, o armazenamento conectado à rede é carregado e o disco io pode ser bem lento. Eu tenho coisas configuradas assim porque os discos locais não estão usando RAID ou protegidos de alguma forma. Meu sistema pode tolerar uma falha no disco local, porque tudo o que vou perder são minhas partições de troca.

Eu estou querendo saber se alguém sabe como instruir o Linux para preencher a partição swap (além da RAM) com arquivos em cache? Com um servidor físico usando todos os discos locais, isso não traz nenhum benefício de velocidade, mas, para meus servidores, faz muito sentido.

    
por portforwardpodcast 24.08.2011 / 20:18

1 resposta

3

O problema com o que você está tentando fazer é que o cache do VFS é controlado inteiramente dentro do kernel, e o espaço do seu problema é muito simples - em geral, colocar o cache no swap derrota completamente o propósito do cache ( embora eu concorde que seu caso de uso seja válido). Meu ponto é simplesmente que é muito improvável que o que você queira fazer atualmente seja suportado no kernel (e eu certamente nunca ouvi qualquer tipo de rumores sobre o que você quer fazer sendo possível).

Se você estivesse executando uma tecnologia de virtualização mais "pseudo", como o qemu, seria possível "supercomprometer" a memória usada pelas VMs. Dessa forma, a memória usada pela VM seria mais visível para o host como memória de processo "regular" e você poderia usar o espaço de troca do host para paginar quando não fosse necessário. Isso corre o risco de trocar a máquina por morte se os processos nas VMs realmente precisassem de toda essa memória, ou se a pressão do cache nas VMs fosse strong, mas poderia funcionar com alguns ajustes cuidadosos.

É improvável que qualquer tentativa de gerenciar esse tipo de coisa no espaço do usuário funcione, porque o cache do VFS é todo o nível do kernel e (novamente) casos de uso para gerenciá-lo no espaço do usuário são muito específicos. Se fossem dados de aplicativos que você estava tentando armazenar em cache, você poderia fornecer um cache de espaço de usuário aos dados (se precisasse de um sistema de arquivos, você poderia usar o FUSE, mas um armazenamento de dados específico do aplicativo funcionaria melhor), mas isso é muito de trabalho (o cache não é simples de acertar), e não funciona quando é o sistema de arquivos raiz que você precisa armazenar em cache.

Se você decidir que isso vale a pena, acho que você gastará muito tempo escrevendo e depurando seu próprio código no nível do kernel para suportar esse caso de uso. Em vez de generalizar o problema para "armazenar cache em swap" (o que aumentará as defesas de várias pessoas), o que pode ser mais fácil é algum tipo de mecanismo "SAN caching de dispositivo" que usa espaço de swap em vez de VFS memória cache. Note que eu digo "mais fácil", e não "fácil" - ainda vai ser muito trabalho.

Eu estaria disposto a gastar muito esforço (e dinheiro) para melhorar o desempenho do meu NAS / SAN antes de analisar a modificação do kernel - porque, honestamente, ele fornecerá mais recursos buck do que o cache. Com o cache, seu acesso inicial é sempre tão lento quanto o mecanismo de acesso subjacente, e se você puder fazer isso com mais rapidez, provavelmente melhorará o desempenho percebido mais do que ter acesso inicial lento com rapidez ( infrequente) acesso repetido. Considere também o custo de apenas dar a todas as suas VMs um monte de RAM a mais - você pode comprar muita RAM pelo custo de um ou dois meses de pirataria do kernel.

    
por 25.08.2011 / 01:06