Como desativar o cache de blocos para processos individuais?

Como desativar o cache de blocos para processos individuais?

Eu tenho um grande sistema com muitos serviços vinculados ao disco. Eles funcionam muito melhor com o uso do cache de bloco.

Além disso, também está em execução algum processo de backup.

Eu sei como eles deveriam usar o cache de bloco: eles absolutamente não deveriam.

O backup acontece copiando um dispositivo de bloco para outro com umbuffercomando. A probabilidade de que seja necessário qualquer armazenamento em cache é praticamente zero.

No entanto, se o backup for executado, os serviços comuns ficarão piores. Dando um baixinhoionicefazer isso não ajuda muito - o problema não é sua prioridade de IO, mas sobrescreve o cache do bloco com dados desnecessários.

Posso de alguma forma configurar este buffercomando para não usar o cache de blocos?

Ele copia volumes lvm para outro, se for importante.

Responder1

Eu encontrei onocacheferramenta para a tarefa.

Em geral, isso não é possível no Linux: não existe tal opção, ou flag, ou qualquer coisa, que possa ser configurada para umprocesso.

No entanto, oposix_fadvise(...)call pode ser usada para aconselhar o subsistema de cache de bloco/buffer, quando uma operação consecutiva de leitura/gravação é esperada. A POSIX_FADV_DONTNEEDfornece as "informações extras" ao kernel, de que ele não deve armazená-las em cache, porque não serão relidas em um futuro próximo.

nocacheintercepta todas as operações importantes do arquivo por posix_fadvise(...)meio de uma biblioteca compartilhada injetada pela LD_PRELOADvariável de ambiente.

Tal como o nome, é apenas um conselho; no entanto, meus experimentos mostram umaenormemelhoria de desempenho (efetivamente, outras tarefas importantes podem ser executadas, paralelamente aos backups em segundo plano, sem uma diminuição visível de desempenho para os usuários finais).

Responder2

Ferramentas como nocachesão na verdadenãoa solução apropriada. Citarnocachefonte:

O que é esta ferramentanãobom para:

  • Controlando como o cache da sua página é usado
    • Por que você acha que alguma ferramenta aleatória encontrada no GitHub pode funcionar melhor que o kernel do Linux?
  • Defesa contra destruição de cache
    • Use cgroups para limitar a quantidade de memória que um processo possui. Veja abaixo ou pesquise na internet, isso é amplamente conhecido, funciona de maneira confiável e não introduz penalidades de desempenho ou comportamento potencialmente perigoso como esta ferramenta faz.

Portanto, use cgroups (para ser mais preciso, em 2023 definitivamente cgroupsv2 sempre que possível) para limitar a quantidade de cache que seu processo pode usar (e, assim, limitar a quantidade de cache que ele pode despejar):

Como executar um processo e seus filhos em um cgroup limitado por memória

Faça isso se, por exemplo, você quiser executar um backup, mas não quiser que seu sistema fique lento devido ao esgotamento do cache da página.

Se você usa o systemd

Se sua distro usa systemd, isso é muito fácil. O Systemd permite executar um processo (e seus subprocessos) em um “escopo”, que é um cgroup, e você pode especificar parâmetros que são traduzidos para os limites do cgroup.

Quando executo meus backups, eu faço:

$ systemd-run --scope --property=MemoryLimit=500M -- backup command 

( MemoryMaxpara v2)

O efeito é que o espaço de cache permanece limitado por um máximo adicional de 500 MiB:

Antes:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.4G        1.3G        1.0G        3.7G        3.7G
Swap:          9.7G         23M        9.7G

Durante (observe como o buff/cache só aumenta ~300MiB):

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.5G        2.5G        1.0G        1.1G        4.0G        3.6G
Swap:          9.7G         23M        9.7G

Como é que isso funciona?

Use systemd-cglspara listar os cgroups criados pelo systemd. No meu sistema, o comando acima cria um grupo chamado run-u467.scopeno system.slicegrupo pai; você pode inspecionar suas configurações de memória assim:

$ mount | grep cgroup | grep memory cgroup on
/sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec
latime,memory)

$ cat /sys/fs/cgroup/memory/system.slice/run-u467.scope/memory.limit_in_bytes
524288000

informação relacionada