En esta página, se describe cómo verificar la tasa de aciertos de la caché y cómo investigar las fallas de caché en el contexto de la ejecución remota.
En esta página, se supone que tienes una compilación o una prueba que utiliza la ejecución remota de forma correcta y que deseas asegurarte de que estás utilizando la caché remota de manera eficaz.
Cómo verificar la tasa de aciertos de caché
En el resultado estándar de tu ejecución de Bazel, observa la línea INFO
que enumera los procesos, que corresponden aproximadamente a las acciones de Bazel. En esa línea, se detalla dónde se ejecutó la acción. Busca la etiqueta remote
, que indica una acción ejecutada de forma remota, linux-sandbox
para las acciones ejecutadas en un entorno de pruebas local y otros valores para otras estrategias de ejecución. Una acción cuyo resultado provino de una caché remota se muestra como remote cache hit
.
Por ejemplo:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
En este ejemplo, hubo 6 aciertos de caché remota y 2 acciones no tuvieron aciertos de caché y se ejecutaron de forma remota. La parte interna 3 se puede ignorar.
Por lo general, se trata de acciones internas pequeñas, como la creación de vínculos simbólicos. Los aciertos de caché local no se incluyen en este resumen. Si obtienes 0 procesos (o un número inferior al esperado), ejecuta bazel clean
seguido de tu comando de compilación o prueba.
Solución de problemas relacionados con los aciertos de caché
Si no obtienes la tasa de aciertos de caché que esperas, haz lo siguiente:
Asegúrate de que, si vuelves a ejecutar el mismo comando de compilación o prueba, se produzcan aciertos de caché.
Ejecuta las compilaciones o las pruebas que esperas que propaguen la caché. La primera vez que se ejecuta una compilación nueva en una pila en particular, no se esperan aciertos de caché remota. Como parte de la ejecución remota, los resultados de las acciones se almacenan en la caché y una ejecución posterior debería recuperarlos.
Ejecuta
bazel clean
. Este comando limpia tu caché local, lo que te permite investigar los aciertos de caché remota sin que los resultados se oculten por los aciertos de caché local.Vuelve a ejecutar las compilaciones y las pruebas que estés investigando (en la misma máquina).
Verifica la línea
INFO
para conocer la tasa de aciertos de caché. Si no ves ningún proceso, exceptoremote cache hit
yinternal
, significa que la caché se está propagando y accediendo correctamente. En ese caso, ve a la siguiente sección.Una posible fuente de discrepancia es algo no hermético en la compilación que hace que las acciones reciban diferentes claves de acción en las dos ejecuciones. Para encontrar esas acciones, haz lo siguiente:
a. Vuelve a ejecutar las compilaciones o las pruebas en cuestión para obtener registros de ejecución:
bazel clean
bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
b. Compara los registros de ejecución entre las dos ejecuciones. Asegúrate de que las acciones sean idénticas en los dos archivos de registro. Las discrepancias proporcionan una pista sobre los cambios que se produjeron entre las ejecuciones. Actualiza tu compilación para eliminar esas discrepancias.
Si puedes resolver los problemas de almacenamiento en caché y la ejecución repetida ahora produce todos los aciertos de caché, ve a la siguiente sección.
Si tus IDs de acción son idénticos, pero no hay aciertos de caché, significa que algo en tu configuración impide el almacenamiento en caché. Continúa con esta sección para verificar si hay problemas comunes.
Verifica que todas las acciones del registro de ejecución tengan el valor
cacheable
establecido como verdadero. Sicacheable
no aparece en el registro de ejecución de una acción determinada, significa que la regla correspondiente puede tener una etiquetano-cache
en su definición en el archivoBUILD
. Consulta los camposmnemonic
ytarget_label
en el registro de ejecución para determinar de dónde proviene la acción.Si las acciones son idénticas y
cacheable
, pero no hay aciertos de caché, es posible que tu línea de comandos incluya--noremote_accept_cached
, lo que inhabilitaría las búsquedas en la caché para una compilación.Si te resulta difícil determinar la línea de comandos real, usa la línea de comandos canónica del Protocolo de eventos de compilación de la siguiente manera:
a. Agrega
--build_event_text_file=/tmp/bep.txt
a tu comando de Bazel para obtener la versión de texto del registro.b. Abre la versión de texto del registro y busca el mensaje
structured_command_line
concommand_line_label: "canonical"
. Se enumerarán todas las opciones después de la expansión.c. Busca
remote_accept_cached
y verifica si está configurado comofalse
.d. Si
remote_accept_cached
esfalse
, determina dónde se establece enfalse
: en la línea de comandos o en un archivo bazelrc.
Asegúrate de que el almacenamiento en caché funcione en todas las máquinas
Después de que los aciertos de caché se produzcan según lo esperado en la misma máquina, ejecuta las mismas compilaciones o pruebas en otra máquina. Si sospechas que el almacenamiento en caché no se realiza en todas las máquinas, haz lo siguiente:
Realiza una pequeña modificación en tu compilación para evitar alcanzar las memorias caché existentes.
Ejecuta la compilación en la primera máquina:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
Ejecuta la compilación en la segunda máquina y asegúrate de que se incluya la modificación del paso 1:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
Compara los registros de ejecución de las dos ejecuciones. Si los registros no son idénticos, investiga las discrepancias en las configuraciones de compilación, así como las propiedades del entorno del host que se filtran en cualquiera de las compilaciones.
Cómo comparar los registros de ejecución
Los registros de ejecución contienen registros de todas las acciones que se ejecutaron durante la compilación. Para cada acción, hay un elemento SpawnExec que contiene toda la información de la clave de acción. Por lo tanto, si los registros son idénticos, también lo son las claves de la caché de acciones.
Para comparar los registros de dos compilaciones que no comparten aciertos de caché como se espera, haz lo siguiente:
Obtén los registros de ejecución de cada compilación y almacénalos como
/tmp/exec1.log
y/tmp/exec2.log
.Descarga el código fuente de Bazel y navega a la carpeta de Bazel con el siguiente comando. Necesitas el código fuente para analizar los registros de ejecución con el analizador de registros de ejecución.
git clone https://github.com/bazelbuild/bazel.git cd bazel
Usa el analizador de registros de ejecución para convertir los registros en texto. La siguiente invocación también ordena las acciones en el segundo registro para que coincidan con el orden de las acciones en el primer registro y facilitar la comparación.
bazel build src/tools/execlog:parser bazel-bin/src/tools/execlog/parser \ --log_path=/tmp/exec1.log \ --log_path=/tmp/exec2.log \ --output_path=/tmp/exec1.log.txt \ --output_path=/tmp/exec2.log.txt
Usa tu herramienta de comparación de texto favorita para comparar
/tmp/exec1.log.txt
y/tmp/exec2.log.txt
.