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.

Muchos errores de “Señal no capturada: 6” en Cloud Run.

Tengo un servicio web Python (3.x) implementado en GCP. Cada vez que Cloud Run está cerrando las instancias, especialmente después de un gran pico de carga, obtengo muchos registros como estos Señal no capturada: 6, pid=6, tid=6, fault_addr=0. junto con [CRITICAL] WORKER TIMEOUT (pid:6). Siempre son señales 6.

El servicio utiliza FastAPI y Gunicorn en ejecución en un contenedor Docker con este comando de inicio:

CMD gunicorn -w 2 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8080 app.__main__:app

El servicio se implementa utilizando Terraform con 1 gigabyte de RAM, 2 CPU y el tiempo de espera configurado en 2 minutos.

resource "google_cloud_run_service" "" {
  name     = ""
  location = ""

  template {
    spec {
      service_account_name = ""
      timeout_seconds = 120
      containers {
        image = var.image
        env {
          name = "GCP_PROJECT"
          value = var.project
        }
        env {
          name = "BRANCH_NAME"
          value = var.branch
        }
        resources {
          limits = {
            cpu = "2000m"
            memory = "1Gi"
          }
        }
      }
    }
  }
  autogenerate_revision_name = true
}

Ya he intentado ajustar los recursos y el tiempo de espera en Cloud Run, utilizando las banderas –timeout y –preload para gunicorn, ya que eso es lo que la gente siempre recomienda al buscar el problema, pero todo sin éxito. También desconozco exactamente por qué los trabajadores están agotando el tiempo de espera.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Los registros indican que los trabajadores de su servicio web Python (3.x) implementado en GCP utilizando FastAPI y Gunicorn se ejecutan en Docker con el comando de inicio gunicorn -w 2 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8080 app.__main__:app están agotando el tiempo después de un pico de carga importante o cuando Cloud Run está cerrando instancias.

    Según el código de Terraform proporcionado, su servicio se implementa con 1 GB de RAM, 2 CPU y un tiempo de espera de 2 minutos (bandera –timeout para Gunicorn). Ya ha intentado ajustar los recursos y la configuración del tiempo de espera, así como utilizar la bandera –preload para Gunicorn, pero el problema persiste.

    El mensaje [CRITICAL] WORKER TIMEOUT indica que un trabajador está tardando demasiado tiempo en completar una solicitud y está siendo terminado forzosamente por Gunicorn. El mensaje Uncaught signal: 6, pid=6, tid=6, fault_addr=0 indica que el proceso fue terminado debido a una señal SIGABRT, que generalmente es causada por fallas en la asignación de memoria o fallas de segmentación.

    Para solucionar este problema, puede intentar seguir los siguientes pasos:

    • Verifique que su código maneje adecuadamente las excepciones y errores, y que no haya fugas de memoria ni bucles infinitos. Puede utilizar herramientas como perfiles de memoria, monitoreo de rendimiento o registro para identificar posibles problemas.
    • Aumente los recursos asignados a su servicio, como RAM o CPU, y observe si el problema persiste. También puede intentar utilizar un nivel de concurrencia más alto para manejar más solicitudes simultáneas.
    • Verifique si su servicio está manejando correctamente las solicitudes entrantes y devolviendo respuestas de manera oportuna. Puede utilizar herramientas de prueba de carga para simular diferentes escenarios e identificar cuellos de botella.
    • Intente reemplazar Gunicorn con un servidor o marco diferente, como Uvicorn o ASGI, que pueden proporcionar un mejor rendimiento o confiabilidad.

    En general, la solución dependerá de los requisitos y limitaciones específicos de su aplicación, y puede requerir una investigación adicional o cambios en el código.

Comments are closed.