Fix latencia en GCP en Cloud Endpoint con Request body superior al buffer por defecto de Nginx .

 El síntoma es el siguiente:

1.- Existe mucha concurrencia en request en los endpoint de metadata, cuando se ejecutan acciones de reproceso de información el cuerpo del mensaje Body supera,
el tamaño por defecto del buffer en el Cloud Endpoint (request body size), la versión que estamos usando es la  1.32.0. 

2.- Al superar el tamaño del buffer el  nginx  es obligado a usar disco para respaldar la petición en la VM creada, para no perder el request antes de que llegue al Backend, en el Balanceador de Carga.
3.- Por efecto de usar disco en vez de memoria RAM disponible del Cluster, la latencia crece.

4.- Por este círculo vicioso estamos perdiendo peticiones sin llegar al Backend, el cliente pierde la conexión el balanceador limpia los request con código HTTP 499 al cumplirse el timeout del Backend Config , el cliente recibe como resultado un  HTTP 502.



Version actual del Docker Image de los endpoint:
image: gcr.io/endpoints-release/endpoints-runtime:1.32.0

Investigar si la nueva versión proporciona una mejora y si conviene una migración de ESP and ESPv2 Beta

Favor aplicar en el pipeline de los Endpoint modificando el Jenkins File el tamaño personalizado del buffer de los endpoints ya que por defecto es de solo 128k:

github.com/cloudendpoints

La documentación indica lo que {{client_body_buffer_size}}hace:

Establece el tamaño del búfer para leer el cuerpo de la solicitud del cliente. En caso de que el cuerpo de la solicitud sea más grande que el búfer, todo el cuerpo o solo una parte se escribe en un archivo temporal. De forma predeterminada, el tamaño del búfer es igual a dos páginas de memoria. Esto es 8K en x86, otras plataformas de 32 bits y x86-64. Suele ser de 16K en otras plataformas de 64 bits.


Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.

Here is a simple example where an Ingress sends all its traffic to one Service:





Esta memoria está en uso sólo mientras se carga una solicitud; una vez que se pasa al backend, la memoria se libera nuevamente. Si una solicitud es mayor que este valor, irá a un archivo temporal y aparecerá una advertencia en el registro de errores.

Esto significa que debe tener suficiente RAM para almacenar cualquier carga simultánea, o su servidor comenzará a intercambiarse.

El impacto en el rendimiento de esto probablemente no sea tan grande, a menos que tenga una gran limitación de memoria y obtenga muchas cargas al mismo tiempo

https://github.com/cloudendpoints/endpoints-tools/commit/5f4bfdcc26926eb1120b8b1cc282284db4334d48

Solución:

  1. Solución más barata, especificar una configuración en el Ingress, personalizada de Nginx cuando se haga deploy con la opción del tamaño del buffer en 10MB.:
    nginx.ingress.kubernetes.io/client-body-buffer-size: 5m
    nginx.ingress.kubernetes.io/proxy-body-size: 15m
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.org/client-max-body-size: 15m

  2. Solución más cara, habilitar la API https://apigee.google.com/edge y habilitar las configuraciones:


Errores de Cuotas en PubSub GCP caso Real






Detalle del error en el navegador:



Como explico en el tw hace poco Falabella llego al limite de la cuota para ingresar request al PubSub de GCP:
RESOURCE_EXHAUSTED429This error indicates that the quota for the cloud project has been exceeded, or that there are too many concurrent requests from the client.See the error message for details. Review the current quotas, and request additional quota if necessary. The client can retry with exponential backoff if this is a transient spike in traffic.
Finally, make sure that the quota is being counted against the intended project. For more discussion of this topic, see Project usage attribution.


Límites de recursos

RecursoLímites
Proyecto10.000 temas
10.000 suscripciones vinculadas o sin vincular
5000 capturas
Tema10.000 suscripciones vinculadas.
5000 capturas vinculadas.
SuscripciónRetiene mensajes no confirmados en el almacenamiento persistente durante 7 días desde el momento en que se publicaron. No hay límite en el número de mensajes que se pueden retener.
En el caso de que no se detecte la presencia de un cliente durante 31 días, las suscripciones pueden eliminarse automáticamente. Esta presencia se detecta a través de llamadas como Pull o Acknowledge, o bien de operaciones de inserción realizadas correctamente.
Solicitud de publicación10 MB (tamaño total).
1000 mensajes.
MensajeTamaño del mensaje (el campo data): 10 MB.
Atributos por mensaje: 100.
Tamaño de clave de atributo: 256 bytes.
Tamaño de valor de atributo: 1024 bytes.
Mensajes de inserción pendientes

3,000 * N de forma predeterminada.

30,000 * N para suscripciones que confirman más del 99 % de los mensajes y tienen una latencia media inferior a 1 s para las solicitudes de inserción. l10n-attrs-original-order="of,push,request">

N es el número de regiones de publicación. Para obtener más información, consulta esta página sobre cómo usar las suscripciones de inserción.

Transmisiones de StreamingPull10 MB por segundo por transmisión abierta
Mensajes Pull/StreamingPullEl servicio puede imponer límites al número total de mensajes StreamingPull pendientes por conexión. Si llegas a estos límites, incrementa la frecuencia con la que confirmas los mensajes y el número de conexiones que usas.


Para más detalles Documentación de las Cuotas de pubsub/quotas?hl=es

Problemas de activación WIFI6 en LG_OLED55CXPSA

  Mi experiencia con este TV  ah sido impecable hasta ahora, llevaba un uso normal y no tenia que usar la conexión por wifi ya que tengo una...