Reserva la fecha: BazelCon 2023 se celebrará el 24 y 25 de octubre en Google Múnich. Más información

Depura los aciertos de caché remota para la ejecución remota

Informa un problema Ver código fuente

En esta página, se describe cómo verificar la tasa de aciertos de caché y cómo investigar los errores de caché en el contexto de la ejecución remota.

En esta página, se da por sentado que tienes una compilación o prueba que usa la ejecución remota de forma correcta y quieres asegurarte de usar la caché remota de forma efectiva.

Cómo comprobar la tasa de aciertos de caché

En el resultado estándar de la 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 que se ejecuta de forma remota, linux-sandbox para acciones que se ejecutan en una zona de pruebas local y otros valores para otras estrategias de ejecución. Una acción cuyo resultado proviene 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 tenían aciertos de caché y se ejecutaron de forma remota. Se pueden ignorar las 3 partes internas. Por lo general, son acciones internas muy pequeñas, como crear vínculos simbólicos. Los aciertos de caché local no se incluyen en este resumen. Si obtienes 0 procesos (o un número menor que el esperado), ejecuta bazel clean seguido de tu comando de compilación o prueba.

Soluciona problemas de aciertos de caché

Si no obtienes la tasa de aciertos de caché que esperas, haz lo siguiente:

Asegúrate de que volver a ejecutar el mismo comando de compilación o prueba produzca aciertos de caché

  1. 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 puedes esperar aciertos de caché remota. Como parte de la ejecución remota, los resultados de la acción se almacenan en la caché y una ejecución posterior los debe recoger.

  2. Ejecuta bazel clean. Este comando limpia tu caché local, lo que te permite investigar los aciertos de caché remota sin que los resultados estén enmascarados por cachés locales.

  3. Ejecuta las compilaciones y las pruebas que estás investigando de nuevo (en la misma máquina).

  4. Revisa la línea INFO para ver la tasa de aciertos de caché. Si no ves ningún proceso, excepto remote cache hit y internal, significa que la caché se propagó y accedió correctamente. En ese caso, continúa con la siguiente sección.

  5. Una fuente probable de discrepancias es algo que no es hermético en la compilación y que las acciones reciben diferentes claves de acción en las dos ejecuciones. Para encontrar esas acciones, haz lo siguiente:

    a. Vuelve a ejecutar las compilaciones o pruebas para obtener los 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 ahora la ejecución repetida produce todos los aciertos de caché, pasa a la siguiente sección.

    Si los IDs de acción son idénticos, pero no hay aciertos de caché, entonces algo de tu configuración impide el almacenamiento en caché. Continúa con esta sección para verificar si hay problemas comunes.

    Si no necesitas establecer diferencias en los registros de ejecución, puedes usar la marca --execution_log_json_file legible. No se puede usar para el diffing estable, ya que contiene tiempo de ejecución y no garantiza el orden.

  6. Comprueba que todas las acciones en el registro de ejecución tengan cacheable configurado como verdadero. Si cacheable no aparece en el registro de ejecución de una acción determinada, significa que la regla correspondiente puede tener una etiqueta no-cache en su definición en el archivo BUILD. Observa el campo progress_message legible en el registro de ejecución para ayudar a determinar de dónde proviene la acción.

  7. Si las acciones son idénticas y cacheable, pero no hay aciertos de caché, es posible que la línea de comandos incluya --noremote_accept_cached, que inhabilitaría las búsquedas en caché de una compilación.

    Si es 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 con command_line_label: "canonical". Se mostrarán todas las opciones después de la expansión.

    c. Busca remote_accept_cached y verifica si está configurado como false.

    d. Si remote_accept_cached es false, determina dónde se configura como false: en la línea de comandos o en un archivo bazelrc.

Garantiza el almacenamiento en caché en todas las máquinas

Después de que los aciertos de caché ocurran de la manera esperada en la misma máquina, ejecuta las mismas compilaciones/pruebas en otra máquina. Si sospechas que el almacenamiento en caché no se realiza en las máquinas, haz lo siguiente:

  1. Realiza una pequeña modificación en tu compilación para evitar recibir cachés existentes.

  2. Ejecuta la compilación en la primera máquina:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. 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
    
  4. Compara los registros de ejecución para las dos ejecuciones. Si los registros no son idénticos, investiga las configuraciones de compilación para ver las discrepancias y las propiedades del entorno de host que se filtran en cualquiera de las compilaciones.

Compara los registros de ejecución

Los registros de ejecución contienen registros de todas las acciones ejecutadas durante la compilación. Para cada acción, hay un elemento SpawnExec que contiene toda la información de la tecla de acción. Por lo tanto, si los registros son idénticos, también lo están las claves de caché de acciones.

Para comparar los registros de dos compilaciones que no comparten aciertos de caché como se esperaba, haz lo siguiente:

  1. Obtén los registros de ejecución de cada compilación y almacénalos como /tmp/exec1.log y /tmp/exec2.log.

  2. 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 execlog.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. 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 la acción en el primer registro a fin de 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
    
  4. Usa tu texto favorito diferente para diferenciar /tmp/exec1.log.txt y /tmp/exec2.log.txt.