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 umbuffer
comando. 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 baixinhoionice
fazer 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 buffer
comando para não usar o cache de blocos?
Ele copia volumes lvm para outro, se for importante.
Responder1
Eu encontrei onocache
ferramenta 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_DONTNEED
fornece 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.
nocache
intercepta todas as operações importantes do arquivo por posix_fadvise(...)
meio de uma biblioteca compartilhada injetada pela LD_PRELOAD
variá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 nocache
sã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
( MemoryMax
para 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-cgls
para listar os cgroups criados pelo systemd. No meu sistema, o comando acima cria um grupo chamadorun-u467.scope
nosystem.slice
grupo 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