es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Construcción del contenedor Go (ARM) con tiempo de espera CGO, con error de tiempo de espera de handshake TLS en net/http.

Tengo un proyecto que utiliza go mod y CGO que tiene un árbol de dependencias relativamente grande.

La construcción en forma nativa (GOOS=linux, GOARCH=amd64) funciona bien.
La construcción en un entorno de integración continua (en mi propio runner) utilizando mi contenedor de compilación personalizado (varias arquitecturas, incluyendo arm) funciona en su mayoría bien, aunque a veces se producen “colgadas” mientras se obtienen dependencias con go get.

Usar la misma imagen de compilación para construir localmente para arm (necesito usar un contenedor debido a CGO y a las herramientas de C dependientes de la arquitectura correspondiente) ahora me da los siguientes errores (un ejemplo de muchos):


go: descargando github.com/go-co-op/gocron v1.9.0
scheduler/scheduler.go:7:2: github.com/go-co-op/gocron@v1.9.0: Obtener "https://goproxy.io/github.com/go-co-op/gocron/@v/v1.9.0.zip": net/http: tiempo de espera del handshake TLS

Sin embargo, puedo ver (con btop) que justo antes de este error, qemu-arm estaba muy ocupado (800% de CPU) ejecutando tareas de construcción relacionadas con go (en realidad un proceso go mod tidy).

Mi suposición es que esto se debe a que no se encontró un binario adecuado para arm para los módulos específicos, por lo que simplemente los construye sobre la marcha.

Así que sospecho que el tiempo para las construcciones de módulos respectivos desde el origen se cuenta por go get como un “go get normal desde http”, lo que lleva al tiempo de espera observado.

En consecuencia, esto significaría que podría resolver el problema si pudiera aumentar el valor de tiempo de espera para go get, pero no he encontrado ninguna información al respecto.

¿Alguna idea?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    El problema parece estar relacionado con el hecho de que la arquitectura ARM no puede encontrar binarios adecuados para ciertos módulos, lo que lleva a la construcción sobre la marcha de estos módulos desde el código fuente. Este proceso es considerado por go get como una solicitud HTTP normal, lo que hace que se agote el tiempo de espera.

    Para resolver este problema, una opción sería aumentar el valor de tiempo de espera para go get. Sin embargo, no parece haber información disponible sobre cómo hacerlo.

    Otra opción podría ser intentar preconstruir las dependencias y empaquetarlas con la aplicación. Este enfoque requeriría un esfuerzo y mantenimiento adicionales, pero aseguraría que la aplicación sea autosuficiente y se pueda construir sin acceso a Internet o dependencias externas.

    Alternativamente, podría valer la pena investigar si hay paquetes o repositorios preconstruidos disponibles para la arquitectura ARM que se puedan usar en lugar de la construcción sobre la marcha desde el código fuente.

    En general, es importante asegurarse de que el contenedor de compilación y las dependencias sean adecuados para la arquitectura objetivo, y que el proceso de compilación sea lo más eficiente posible para evitar retrasos y tiempos de espera innecesarios.

Comments are closed.