Esta página descreve como limitar e reduzir a memória usada pelo Bazel.
Como executar o Bazel com RAM limitada
Em determinadas situações, talvez você queira que o Bazel use a memória mínima. É possível definir a
pilha máxima usando a flag de inicialização
--host_jvm_args
,
como --host_jvm_args=-Xmx2g
.
Trocar a velocidade de build incremental por memória
Se os builds forem muito grandes, o Bazel poderá gerar uma OutOfMemoryError
(OOM) quando
não tiver memória suficiente. É possível fazer com que o Bazel use menos memória, em detrimento
de builds incrementais mais lentos, transmitindo as seguintes flags de comando:
--discard_analysis_cache
,
--nokeep_state_after_build
e
--notrack_incremental_state
.
Essas flags minimizam a memória que o Bazel usa em um build, tornando os builds futuros mais lentos do que um build incremental padrão.
Também é possível transmitir qualquer uma dessas flags individualmente:
--discard_analysis_cache
vai reduzir a memória usada durante a execução (não a análise). Os builds incrementais não precisam repetir o carregamento do pacote, mas precisam repetir a análise e a execução, embora o cache de ação no disco possa impedir a maioria das execuções repetidas.- O
--notrack_incremental_state
não armazenará nenhuma aresta no gráfico de dependências interno do Bazel, para que ele não possa ser usado para builds incrementais. O próximo build vai descartar esses dados, mas eles serão preservados até então, para depuração interna, a menos que--nokeep_state_after_build
seja especificado. - O
--nokeep_state_after_build
descarta todos os dados após o build, de modo que os builds incrementais precisam ser criados do zero (exceto o cache de ação no disco). Por si só, ele não afeta o limite máximo do build atual.
Troque a flexibilidade de build por memória com o Skyfocus (experimental)
Se você quiser que o Bazel use menos memória e mantenha as velocidades de build incrementais, informe ao Bazel o conjunto de trabalho de arquivos que você vai modificar. O Bazel vai manter apenas o estado necessário para recriar as mudanças incrementais corretamente nesses arquivos. Esse recurso é chamado de Skyfocus.
Para usar o Skyfocus, transmita a flag --experimental_enable_skyfocus
:
bazel build //pkg:target --experimental_enable_skyfocus
Por padrão, o conjunto de trabalho será o conjunto de arquivos ao lado do destino que está sendo
criado. No exemplo, todos os arquivos em //pkg
serão mantidos no conjunto de trabalho, e
as alterações em arquivos fora do conjunto de trabalho não serão permitidas até que você emita
bazel clean
ou reinicie o servidor do Bazel.
Se você quiser especificar um conjunto exato de arquivos ou diretórios, use a
flag --experimental_working_set
, desta forma:
bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir
Também é possível transmitir --experimental_skyfocus_dump_post_gc_stats
para mostrar o
valor de redução de memória:
Juntando tudo, o resultado vai ficar assim:
$ bazel test //pkg:target //tests/... --experimental_enable_skyfocus --experimental_working_set dir1,dir2,dir3/subdir --experimental_skyfocus_dump_post_gc_stats
INFO: --experimental_enable_skyfocus is enabled. Blaze will reclaim memory not needed to build the working set. Run 'blaze dump --skyframe=working_set' to show the working set, after this command.
WARNING: Changes outside of the working set will cause a build error.
INFO: Analyzed 149 targets (4533 packages loaded, 169438 targets configured).
INFO: Found 25 targets and 124 test targets...
INFO: Updated working set successfully.
INFO: Focusing on 334 roots, 3 leafs... (use --experimental_skyfocus_dump_keys to show them)
INFO: Heap: 1237MB -> 676MB (-45.31%)
INFO: Elapsed time: 192.670s ...
INFO: Build completed successfully, 62303 total actions
Para este exemplo, o uso do Skyfocus permitiu que o Bazel reduzisse 561 MB (45%) de memória,
e as versões incrementais para processar as alterações nos arquivos em dir1
, dir2
e
dir3/subdir
vão manter as velocidades rápidas, com a desvantagem de que o Bazel não pode
reconstruir arquivos alterados fora desses diretórios.
Criação de perfil de memória
O Bazel vem com um perfilador de memória integrado que pode ajudar a verificar o uso de memória da sua regra. Leia mais sobre esse processo na seção de criação de perfil de memória da nossa documentação sobre como melhorar o desempenho das regras personalizadas.