En esta página, se describe cómo limitar y reducir la memoria que usa Bazel.
Ejecuta Bazel con RAM limitada
En ciertas situaciones, es posible que quieras que Bazel use una memoria mínima. Puedes configurar el
montón máximo con la marca de inicio
--host_jvm_args,
como --host_jvm_args=-Xmx2g.
Intercambia velocidades de compilación incrementales por memoria
Si tus compilaciones son demasiado grandes, es posible que Bazel arroje un OutOfMemoryError (OOM) cuando
no tenga suficiente memoria. Para que Bazel use menos memoria, a costa
de compilaciones incrementales más lentas, pasa las siguientes marcas de comando:
--discard_analysis_cache,
--nokeep_state_after_build,
y
--notrack_incremental_state.
Estas marcas minimizarán la memoria que usa Bazel en una compilación, a costa de que las compilaciones futuras sean más lentas que una compilación incremental estándar.
También puedes pasar cualquiera de estas marcas de forma individual:
--discard_analysis_cachereducirá la memoria que se usa durante la ejecución (no el análisis). Las compilaciones incrementales no tendrán que volver a cargar el paquete, pero sí tendrán que volver a realizar el análisis y la ejecución (aunque la caché de acciones en el disco puede evitar la mayor parte de la nueva ejecución).--notrack_incremental_stateno almacenará ningún borde en el gráfico de dependencias interno de Bazel, por lo que no se podrá usar para compilaciones incrementales. La siguiente compilación descartará esos datos, pero se conservarán hasta entonces para la depuración interna, a menos que se especifique--nokeep_state_after_build.--nokeep_state_after_builddescartará todos los datos después de la compilación, de modo que las compilaciones incrementales tengan que compilarse desde cero (excepto la caché de acciones en el disco). Por sí sola, no afecta la marca de agua alta de la compilación actual.
Intercambia la flexibilidad de compilación por memoria con Skyfocus (experimental)
Si quieres que Bazel use menos memoria y conserve las velocidades de compilación incrementales, puedes indicarle a Bazel el conjunto de archivos de trabajo que modificarás, y Bazel solo conservará el estado necesario para volver a compilar de forma incremental y correcta los cambios en esos archivos. Esta función se llama Skyfocus.
Para usar Skyfocus, pasa la --experimental_enable_skyfocus marca:
bazel build //pkg:target --experimental_enable_skyfocus
De forma predeterminada, el conjunto de trabajo será el conjunto de archivos junto al destino que se está
compilando. En el ejemplo, todos los archivos de //pkg se conservarán en el conjunto de trabajo, y
no se permitirán los cambios en los archivos fuera del conjunto de trabajo hasta que emitas
bazel clean o reinicies el servidor de Bazel.
Si quieres especificar un conjunto exacto de archivos o directorios, usa la
--experimental_working_set marca, de la siguiente manera:
bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir
También puedes pasar --experimental_skyfocus_dump_post_gc_stats para mostrar la
cantidad de reducción de memoria:
En conjunto, deberías ver algo como esto:
$ 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
En este ejemplo, el uso de Skyfocus permitió que Bazel descartara 561 MB (45%) de memoria,
y las compilaciones incrementales para controlar los cambios en los archivos en dir1, dir2, y
dir3/subdir conservarán sus velocidades rápidas, con la desventaja de que Bazel no puede
volver a compilar los archivos modificados fuera de estos directorios.
Generación de perfiles de memoria
Bazel incluye un generador de perfiles de memoria integrado que puede ayudarte a verificar el uso de memoria de tu regla. Obtén más información sobre este proceso en la sección Generación de perfiles de memoria de nuestra documentación sobre cómo mejorar el rendimiento de las reglas personalizadas.