En esta página, se describe cómo limitar y reducir la memoria que usa Bazel.
Cómo ejecutar Bazel con RAM limitada
En algunas situaciones, es posible que quieras que Bazel use la memoria mínima. Puedes configurar el montón máximo a través de la marca de inicio --host_jvm_args
, como --host_jvm_args=-Xmx2g
.
Cambia las velocidades de compilación incrementales por memoria
Si tus compilaciones son demasiado grandes, es posible que Bazel arroje una OutOfMemoryError
(OOM) cuando
no tiene suficiente memoria. Puedes hacer que Bazel use menos memoria al mismo costo.
de compilaciones incrementales más lentas, si pasas 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 lo que hace 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_cache
reducirá la memoria usada durante la ejecución (no análisis). Las compilaciones incrementales no tendrán que volver a cargar el paquete, pero sí deberán volver a realizar el análisis y la ejecución (aunque la caché de acciones en el disco puede evitar la mayoría de las reejecuciones).--notrack_incremental_state
no almacenará ningún borde en la memoria interna de Bazel. gráfico de dependencias, de modo que no se pueda usar para compilaciones incrementales. La siguiente compilación descartará esos datos, pero se conservarán hasta ese momento para la depuración interna, a menos que se especifique--nokeep_state_after_build
.--nokeep_state_after_build
descartará todos los datos después de la compilación, de modo que las compilaciones incrementales se tengan que compilar desde cero (excepto la caché de acciones en el disco). Por sí solo, no afecta la marca de agua de la construcción actual.
Cambia la flexibilidad de la compilación por memoria con Skyfocus (experimental)
Si quieres que Bazel use menos memoria y retenga las velocidades de compilación incrementales puedes indicarle a Bazel el conjunto de trabajo de archivos que modificarás Bazel solo mantendrá el estado necesario para recompilar los cambios de forma incremental y correcta a esos archivos. Esta función se llama Enfoque en el cielo.
Para usar Skyfocus, pasa la marca --experimental_enable_skyfocus
:
bazel build //pkg:target --experimental_enable_skyfocus
Por defecto, el conjunto de trabajo
será el conjunto de archivos junto al destino
construyen. En el ejemplo, todos los archivos de //pkg
se conservarán en el conjunto de trabajo.
no se permitirán los cambios
en los archivos que no sean del conjunto de trabajo
bazel clean
o reinicia el servidor de Bazel.
Si deseas especificar un conjunto exacto de archivos o directorios, usa el
--experimental_working_set
, 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 el
cantidad de reducción de memoria:
En resumen, 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 quitara 561 MB (45%) de memoria.
y compilaciones incrementales para manejar cambios en archivos en dir1
, dir2
y
dir3/subdir
conservará 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 comprobar el estado el uso de la memoria. Obtén más información sobre este proceso en la sección de creación de perfiles de memoria de nuestra documentación sobre cómo mejorar el rendimiento de las reglas personalizadas.