SlideShare una empresa de Scribd logo
Mis primeros pasos usando las
escaleras
Alejandro BM -@ae_bm
Mad Scalability 2018/4/4
Trigger Warning
● Puedo herir sensibilidades. Se recomienda discreción
● No hablare de nada esotérico o exótico
– No cloud
– No scheduler de containers
– No SDNs
– Etc
● Si esto parece relleno ^_^ don’t blame me
● Esta presentación no ha sido revisada por Relaciones
Públicas
● La siguiente es una historia inspirada en hechos reales
En un comienzo
● En un hardware que tiene varios sistemas
ejecutándose (Gente a la que le gusta ahorrar)
● Hay quejas sobre la lentitud del sistema
● Los recursos están saturados
● El contenedor con el proceso web está a tope
de CPU
● Se cambia la máquina por una más potente
● Aún con más recursos el sistema funciona de
pena ¯_(ツ)_/¯
En un comienzo
Diagrama del Sistema Inicial
En un comienzo
● Comenté que un sólo contenedor con un proceso
python no iba a utilizar más cores por arte de
magia
● Se decide poner otro contenedor con un proceso
python para aprovechar mejor los recursos de la
máquina. Ahora NGINX además de proxy funciona
como load balancer
● El sistema se pensó para no usar cookies o un
almacén externo de sesiones, lo cual maravilla a
los usuarios cuando peticiones relacionadas son
procesadas por backends distintos
En un comienzo
● Mientras tanto yo analizaba logs
● Vi que la mayoría de las peticiones venían de
la propia máquina originadas por un sistema
interno
● Así que configuré a NGINX para que las
peticiones del sistema interno usaran un
contenedor y el resto el otro contenedor
● Mi idea era que los usuarios externos no fueran
penalizados por el sistema interno
En un comienzo
Diagrama del Sistema
Unas semanas después
● Quejas porque el sistema está lento
● El backend para peticiones internas está casi
ocioso mientras su clon está comiéndose casi
toda la carga
● Esta vez pude revisar de nuevo los logs sin que
se tomaran decisiones apresuradas
● Omití todo el trafico originado desde localhost
Unas semanas después
● Existían 2 tipos de peticiones desde clientes
externos
– URLs con /html/
– URLs sin /html/
● Después de una comunicación OPS DEV
– Si la URL tiene /html/ se han hecho con un
navegador web – Posible humano
– Si no tienen /html/ son consultas al API – Posible
no humano
Unas semanas después
● Manteniendo la doctrina de no penalizar humanos*, se configura el
sistema para usar otro backend más
– 1 backend para peticiones desde localhost (siguen siendo un montón)
– 1 backend para peticiones sin /html/ (peticiones al API)
– 1 backend para peticiones con /html/ (peticiones de humanos)
● Cambio el formato de logs en NGINX para tener más datos
– Saber que backend procesó la petición $proxy_host
– Saber el tiempo que tardo la petición $request_time
* still a misanthrope ^_^
Unas semanas después
Diagrama del Sistema
Hace unas pocas semanas
● El cliente comenta que el sistema esta lento
● La página web funciona con las latencias
esperadas
● El cliente especifica que el problema es con el
API – Ahora son específicos
● La ventaja es que ahora hay datos y no sólo
sensaciones
Hace unas pocas semanas
● Aplicando estadísticas a los logs de un mes y
medio además de comparándolo con otro
cliente grande
Hace unas pocas semanas
● Peticiones procesadas por cada backend
● Respuestas HTTP retornadas por NGINX
local 0.98
html 0.01
api 0.0043
200 0.9989
404 0.0008
Hace unas pocas semanas
Histograma de la duración de las peticiones
Hace unas pocas semanas
Duración de las peticiones en base al tiempo
Hace unas pocas semanas
Histograma de las duraciones menores a 1 seg
Hace unas pocas semanas
● Estadísticas
● Nada llamativo
min 0.0 q1 0.003
max 63.287 q3 0.005
mean 0.04 IQR 0.002
median 0.004 p90 0.008
mad 0.07 p99 0.6
stdev 0.67
Hace unas pocas semanas
● Dos errores
– Revisar casi 2 meses de logs
– Revisar el agregado y no el API
● Viendo sólo los números parece que el sistema
no va tan mal (considerando que nadie ha
definido una latencia objetivo)
● El problema es la gran cantidad de peticiones
que hace el sistema local. Por lo que el resto
de peticiones son outliers
Hace unas pocas semanas
API - Histograma de la duración de las peticiones
Hace unas pocas semanas
API - Duración de las peticiones en base al tiempo
Hace unas pocas semanas
● Estadísticas - API
● FUUUUUUU…..
min 0.0 q1 4.76975
max 36.394 q3 7.9235
mean 5.97 IQR 3.15375
median 5.212 p90 11.4481
mad 3.41 p99 25.12393
stdev 4.98
Hace unas pocas semanas
● El backend que atiende las peticiones del API
sucks hard
● Me intrigaba que un proceso web usara
constantemente 100% una CPU
● No es una aplicación que mina criptomonedas
● Confirmo que es una aplicación asíncrona
Hace unas pocas semanas
● Decido formular una hipótesis:
– Estamos aceptando peticiones que no avanzan
porque están esperando por otras partes del
sistema. Es el proceso de aceptar peticiones de
forma continua lo que hace que se use el CPU al
100%
● Toca ver si existen recursos críticos
Hace unas pocas semanas
Buscando ideas
Hace unas pocas semanas
● Para validar la hipótesis decido usar sysdig
para ver cuales son las llamadas al sistema
que más tardan en responder
● Todo está lleno de epolls, así que descarto los
epolls – normal en un sistema asíncrono
● Cuando ignoro los epolls:
– La mayoría de las esperas son por MySQL
(ToySQL)
– Hay mucha comunicación de red con REDIS
Hace unas pocas semanas
La parte del sistema que nos interesa ahora
Hace unas pocas semanas
● Con MySQL ocurrían dos problemas:
– Una query que hacia un order by con limit en un
campo que no tenia índice – facepalm
– Una query de union que tenia índices pero el filtrado
se hacia en el having por lo que no usaba índices –
sin comentarios
● Soluciones:
– Crear un índice para la primera consulta
– Reescribir la query para que el filtrado se haga en los
where y no esperar hasta el final (el having) – Ahora
me llaman DBA por esto. FML
Hace unas pocas semanas
● Ahora las queries a la BD iban algo mejor -
mucho
● Pero persistía el alto uso de CPU
● Con sysdig veo que peticiones del tipo /algo?
user=id
– Se conectan a REDIS y piden una colección de
miles de elementos
– Reviso el código fuente y el filtrado lo está
haciendo python - LLORO
Hace unas pocas semanas
● Soluciones:
– Usar otra BD – No hay tiempo
– Se utiliza otra estructura en REDIS para soportar
este tipo de consultas
● Se dejo unos días para ver si había mejora y ...
Hace unas pocas semanas
API - Histograma de la duración de las peticiones
Hace unas pocas semanas
API - Duración de las peticiones en base al tiempo
Hace unas pocas semanas
● Estadísticas – API
● Parece que hemos mejorado un poco el
sistema
min 0.002 q1 0.004
max 3.037 q3 0.006
mean 0.03 IQR 0.002
median 0.005 p90 0.01
mad 0.04 p99 0.70078
stdev 0.13
Como conclusión
● Definir la latencia aceptable
● Medir / instrumentar
● Entender lo que se esta midiendo
● Hacer experimentos
● Hacer pruebas de carga de verdad
Como conclusión
● Ir de forma iterativa corrigiendo los bottlenecks
● Vale la pena diferenciar los tipos de carga de
trabajo
● Usar loadsheding, quotas o fallar es mejor a
crear un fallo en cascada
https://landing.google.com/sre/book/chapters/addressing-cascading-failures.html
Como conclusión
● Antes de escalar en máquinas o cambiar el HW
entender lo que esta limitando la escalabilidad
● Revisar los queries con explain y usar el f***
index
● Si la BD te puede dar el trabajo ya hecho es
mucho mejor hacerlo en la aplicación:
– Menos tráfico de red
– No malgastas CPU
¿Preguntas?
se supone que es una lighting talk
Things That Are Not Questions (by @QuinnyPig)
• Calling Bullshit
• Telling a pointless story
• A spoken word version of your resume

Más contenido relacionado

Similar a Mad scalability (perfomance debugging)

Drupal8 & Symfony2
Drupal8 & Symfony2Drupal8 & Symfony2
Drupal8 & Symfony2
Magd Kudama
 
Charla Evento TestingUY 2018 - 911: Automatización para emergencias
Charla Evento TestingUY 2018 - 911: Automatización para emergenciasCharla Evento TestingUY 2018 - 911: Automatización para emergencias
Charla Evento TestingUY 2018 - 911: Automatización para emergencias
TestingUy
 
Mantenimiento y mejora continua de la performance de las aplicaciones
Mantenimiento y mejora continua de la performance de las aplicacionesMantenimiento y mejora continua de la performance de las aplicaciones
Mantenimiento y mejora continua de la performance de las aplicaciones
Abstracta
 
24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...
24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...
24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...SpanishPASSVC
 
Adaptacion y mejora continua de la performance de las aplicaciones
Adaptacion y mejora continua de la performance de las aplicacionesAdaptacion y mejora continua de la performance de las aplicaciones
Adaptacion y mejora continua de la performance de las aplicaciones
GeneXus
 
Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupMartin Siniawski
 
Tuning Lamp
Tuning LampTuning Lamp
Tuning Lamp
Ian Monge Pérez
 
Alternativas de hosting para WordPress
Alternativas de hosting para WordPressAlternativas de hosting para WordPress
Alternativas de hosting para WordPress
Francisco Javier Ros Muñoz
 
PostgreSQL el core de OpenERP
PostgreSQL el core de OpenERPPostgreSQL el core de OpenERP
PostgreSQL el core de OpenERPCristian Salamea
 
Performance en Drupal 7
Performance en Drupal 7Performance en Drupal 7
Performance en Drupal 7
Karim Boudjema Schombourg
 
DevOps+[Chef/Docker]
 DevOps+[Chef/Docker] DevOps+[Chef/Docker]
DevOps+[Chef/Docker]
Christian Rodriguez
 
Migrando Rails Apps entre Cloud y Bare Metal Servers
Migrando Rails Apps entre Cloud y Bare Metal ServersMigrando Rails Apps entre Cloud y Bare Metal Servers
Migrando Rails Apps entre Cloud y Bare Metal Servers
Edwin Cruz
 
Rendimiento y velocidad en WordPress
Rendimiento y velocidad en WordPress Rendimiento y velocidad en WordPress
Rendimiento y velocidad en WordPress
Dani Reguera Bakhache
 
Capacidades de programación de procesos Asíncronos
Capacidades de programación de procesos AsíncronosCapacidades de programación de procesos Asíncronos
Capacidades de programación de procesos Asíncronos
Esteve Graells
 
Docker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidadDocker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidad
Óscar De Arriba González
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativo
Aprende Git
 
Argentesting 2017 - Performance testing 101 con jmeter
Argentesting 2017 - Performance testing 101 con jmeterArgentesting 2017 - Performance testing 101 con jmeter
Argentesting 2017 - Performance testing 101 con jmeter
Argentesting
 
Softonic Labs - Web Escalable
Softonic Labs - Web EscalableSoftonic Labs - Web Escalable
Softonic Labs - Web Escalable
Alex Puig
 
¿Cómo implementar la analítica empresarial en tiempo real?
¿Cómo implementar la analítica empresarial en tiempo real?¿Cómo implementar la analítica empresarial en tiempo real?
¿Cómo implementar la analítica empresarial en tiempo real?
Denodo
 

Similar a Mad scalability (perfomance debugging) (20)

Drupal8 & Symfony2
Drupal8 & Symfony2Drupal8 & Symfony2
Drupal8 & Symfony2
 
Charla Evento TestingUY 2018 - 911: Automatización para emergencias
Charla Evento TestingUY 2018 - 911: Automatización para emergenciasCharla Evento TestingUY 2018 - 911: Automatización para emergencias
Charla Evento TestingUY 2018 - 911: Automatización para emergencias
 
Mantenimiento y mejora continua de la performance de las aplicaciones
Mantenimiento y mejora continua de la performance de las aplicacionesMantenimiento y mejora continua de la performance de las aplicaciones
Mantenimiento y mejora continua de la performance de las aplicaciones
 
24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...
24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...
24 HOP edición Español - Optimizacion de motores sql server desde el codigo h...
 
Adaptacion y mejora continua de la performance de las aplicaciones
Adaptacion y mejora continua de la performance de las aplicacionesAdaptacion y mejora continua de la performance de las aplicaciones
Adaptacion y mejora continua de la performance de las aplicaciones
 
Ponele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu StartupPonele el TURBO al Dev Team de tu Startup
Ponele el TURBO al Dev Team de tu Startup
 
Tuning Lamp
Tuning LampTuning Lamp
Tuning Lamp
 
Alternativas de hosting para WordPress
Alternativas de hosting para WordPressAlternativas de hosting para WordPress
Alternativas de hosting para WordPress
 
PostgreSQL el core de OpenERP
PostgreSQL el core de OpenERPPostgreSQL el core de OpenERP
PostgreSQL el core de OpenERP
 
Performance en Drupal 7
Performance en Drupal 7Performance en Drupal 7
Performance en Drupal 7
 
DevOps+[Chef/Docker]
 DevOps+[Chef/Docker] DevOps+[Chef/Docker]
DevOps+[Chef/Docker]
 
Migrando Rails Apps entre Cloud y Bare Metal Servers
Migrando Rails Apps entre Cloud y Bare Metal ServersMigrando Rails Apps entre Cloud y Bare Metal Servers
Migrando Rails Apps entre Cloud y Bare Metal Servers
 
Rendimiento y velocidad en WordPress
Rendimiento y velocidad en WordPress Rendimiento y velocidad en WordPress
Rendimiento y velocidad en WordPress
 
Capacidades de programación de procesos Asíncronos
Capacidades de programación de procesos AsíncronosCapacidades de programación de procesos Asíncronos
Capacidades de programación de procesos Asíncronos
 
Docker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidadDocker y Kubernetes, en busca de la alta disponibilidad
Docker y Kubernetes, en busca de la alta disponibilidad
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativo
 
Rendimiento extremo en php
Rendimiento extremo en phpRendimiento extremo en php
Rendimiento extremo en php
 
Argentesting 2017 - Performance testing 101 con jmeter
Argentesting 2017 - Performance testing 101 con jmeterArgentesting 2017 - Performance testing 101 con jmeter
Argentesting 2017 - Performance testing 101 con jmeter
 
Softonic Labs - Web Escalable
Softonic Labs - Web EscalableSoftonic Labs - Web Escalable
Softonic Labs - Web Escalable
 
¿Cómo implementar la analítica empresarial en tiempo real?
¿Cómo implementar la analítica empresarial en tiempo real?¿Cómo implementar la analítica empresarial en tiempo real?
¿Cómo implementar la analítica empresarial en tiempo real?
 

Más de Alejandro E Brito Monedero

Tres historias
Tres historiasTres historias
AMQP vs GRAPHITE
AMQP vs GRAPHITEAMQP vs GRAPHITE
AMQP vs GRAPHITE
Alejandro E Brito Monedero
 
Sysdig
SysdigSysdig
Sysdig SRECon 16 Europe
Sysdig SRECon 16 EuropeSysdig SRECon 16 Europe
Sysdig SRECon 16 Europe
Alejandro E Brito Monedero
 
Funcional para trollear
Funcional para trollearFuncional para trollear
Funcional para trollear
Alejandro E Brito Monedero
 
Top Bug
Top BugTop Bug
Fabric más allá de lo básico
Fabric más allá de lo básicoFabric más allá de lo básico
Fabric más allá de lo básico
Alejandro E Brito Monedero
 
Experiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWSExperiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWS
Alejandro E Brito Monedero
 
Fabric Fast & Furious edition
Fabric Fast & Furious editionFabric Fast & Furious edition
Fabric Fast & Furious edition
Alejandro E Brito Monedero
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Alejandro E Brito Monedero
 
AWS Baby steps circa 2008
AWS Baby steps circa 2008AWS Baby steps circa 2008
AWS Baby steps circa 2008
Alejandro E Brito Monedero
 
Using Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibanaUsing Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibana
Alejandro E Brito Monedero
 
Wireshark tips
Wireshark tipsWireshark tips
Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3
Alejandro E Brito Monedero
 

Más de Alejandro E Brito Monedero (14)

Tres historias
Tres historiasTres historias
Tres historias
 
AMQP vs GRAPHITE
AMQP vs GRAPHITEAMQP vs GRAPHITE
AMQP vs GRAPHITE
 
Sysdig
SysdigSysdig
Sysdig
 
Sysdig SRECon 16 Europe
Sysdig SRECon 16 EuropeSysdig SRECon 16 Europe
Sysdig SRECon 16 Europe
 
Funcional para trollear
Funcional para trollearFuncional para trollear
Funcional para trollear
 
Top Bug
Top BugTop Bug
Top Bug
 
Fabric más allá de lo básico
Fabric más allá de lo básicoFabric más allá de lo básico
Fabric más allá de lo básico
 
Experiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWSExperiencias con PostgreSQL en AWS
Experiencias con PostgreSQL en AWS
 
Fabric Fast & Furious edition
Fabric Fast & Furious editionFabric Fast & Furious edition
Fabric Fast & Furious edition
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?
 
AWS Baby steps circa 2008
AWS Baby steps circa 2008AWS Baby steps circa 2008
AWS Baby steps circa 2008
 
Using Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibanaUsing Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibana
 
Wireshark tips
Wireshark tipsWireshark tips
Wireshark tips
 
Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3Mi experiencia con Amazon AWS EC2 y S3
Mi experiencia con Amazon AWS EC2 y S3
 

Último

Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
Emilio Casbas
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
Luis Enrique Zafra Haro
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
DanielErazoMedina
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
IsabellaRubio6
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
ManuelCampos464987
 
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
sarasofiamontezuma
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
Fernando Villares
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
samuelvideos
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
CrystalRomero18
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
DiegoCampos433849
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Telefónica
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
thomasdcroz38
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
PABLOCESARGARZONBENI
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
Leidyfuentes19
 
Diagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestreDiagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestre
rafaelsalazar0615
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
cristianrb0324
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
ItsSofi
 
Ventajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloroVentajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloro
durangense277
 

Último (20)

Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
biogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectosbiogas industrial para guiarse en proyectos
biogas industrial para guiarse en proyectos
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
 
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
 
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
 
Diagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestreDiagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestre
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
 
Ventajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloroVentajas y desventajas de la desinfección con cloro
Ventajas y desventajas de la desinfección con cloro
 

Mad scalability (perfomance debugging)

  • 1. Mis primeros pasos usando las escaleras Alejandro BM -@ae_bm Mad Scalability 2018/4/4
  • 2. Trigger Warning ● Puedo herir sensibilidades. Se recomienda discreción ● No hablare de nada esotérico o exótico – No cloud – No scheduler de containers – No SDNs – Etc ● Si esto parece relleno ^_^ don’t blame me ● Esta presentación no ha sido revisada por Relaciones Públicas ● La siguiente es una historia inspirada en hechos reales
  • 3. En un comienzo ● En un hardware que tiene varios sistemas ejecutándose (Gente a la que le gusta ahorrar) ● Hay quejas sobre la lentitud del sistema ● Los recursos están saturados ● El contenedor con el proceso web está a tope de CPU ● Se cambia la máquina por una más potente ● Aún con más recursos el sistema funciona de pena ¯_(ツ)_/¯
  • 4. En un comienzo Diagrama del Sistema Inicial
  • 5. En un comienzo ● Comenté que un sólo contenedor con un proceso python no iba a utilizar más cores por arte de magia ● Se decide poner otro contenedor con un proceso python para aprovechar mejor los recursos de la máquina. Ahora NGINX además de proxy funciona como load balancer ● El sistema se pensó para no usar cookies o un almacén externo de sesiones, lo cual maravilla a los usuarios cuando peticiones relacionadas son procesadas por backends distintos
  • 6.
  • 7. En un comienzo ● Mientras tanto yo analizaba logs ● Vi que la mayoría de las peticiones venían de la propia máquina originadas por un sistema interno ● Así que configuré a NGINX para que las peticiones del sistema interno usaran un contenedor y el resto el otro contenedor ● Mi idea era que los usuarios externos no fueran penalizados por el sistema interno
  • 9. Unas semanas después ● Quejas porque el sistema está lento ● El backend para peticiones internas está casi ocioso mientras su clon está comiéndose casi toda la carga ● Esta vez pude revisar de nuevo los logs sin que se tomaran decisiones apresuradas ● Omití todo el trafico originado desde localhost
  • 10. Unas semanas después ● Existían 2 tipos de peticiones desde clientes externos – URLs con /html/ – URLs sin /html/ ● Después de una comunicación OPS DEV – Si la URL tiene /html/ se han hecho con un navegador web – Posible humano – Si no tienen /html/ son consultas al API – Posible no humano
  • 11. Unas semanas después ● Manteniendo la doctrina de no penalizar humanos*, se configura el sistema para usar otro backend más – 1 backend para peticiones desde localhost (siguen siendo un montón) – 1 backend para peticiones sin /html/ (peticiones al API) – 1 backend para peticiones con /html/ (peticiones de humanos) ● Cambio el formato de logs en NGINX para tener más datos – Saber que backend procesó la petición $proxy_host – Saber el tiempo que tardo la petición $request_time * still a misanthrope ^_^
  • 13. Hace unas pocas semanas ● El cliente comenta que el sistema esta lento ● La página web funciona con las latencias esperadas ● El cliente especifica que el problema es con el API – Ahora son específicos ● La ventaja es que ahora hay datos y no sólo sensaciones
  • 14.
  • 15. Hace unas pocas semanas ● Aplicando estadísticas a los logs de un mes y medio además de comparándolo con otro cliente grande
  • 16. Hace unas pocas semanas ● Peticiones procesadas por cada backend ● Respuestas HTTP retornadas por NGINX local 0.98 html 0.01 api 0.0043 200 0.9989 404 0.0008
  • 17. Hace unas pocas semanas Histograma de la duración de las peticiones
  • 18. Hace unas pocas semanas Duración de las peticiones en base al tiempo
  • 19. Hace unas pocas semanas Histograma de las duraciones menores a 1 seg
  • 20. Hace unas pocas semanas ● Estadísticas ● Nada llamativo min 0.0 q1 0.003 max 63.287 q3 0.005 mean 0.04 IQR 0.002 median 0.004 p90 0.008 mad 0.07 p99 0.6 stdev 0.67
  • 21. Hace unas pocas semanas ● Dos errores – Revisar casi 2 meses de logs – Revisar el agregado y no el API ● Viendo sólo los números parece que el sistema no va tan mal (considerando que nadie ha definido una latencia objetivo) ● El problema es la gran cantidad de peticiones que hace el sistema local. Por lo que el resto de peticiones son outliers
  • 22.
  • 23. Hace unas pocas semanas API - Histograma de la duración de las peticiones
  • 24. Hace unas pocas semanas API - Duración de las peticiones en base al tiempo
  • 25. Hace unas pocas semanas ● Estadísticas - API ● FUUUUUUU….. min 0.0 q1 4.76975 max 36.394 q3 7.9235 mean 5.97 IQR 3.15375 median 5.212 p90 11.4481 mad 3.41 p99 25.12393 stdev 4.98
  • 26.
  • 27. Hace unas pocas semanas ● El backend que atiende las peticiones del API sucks hard ● Me intrigaba que un proceso web usara constantemente 100% una CPU ● No es una aplicación que mina criptomonedas ● Confirmo que es una aplicación asíncrona
  • 28. Hace unas pocas semanas ● Decido formular una hipótesis: – Estamos aceptando peticiones que no avanzan porque están esperando por otras partes del sistema. Es el proceso de aceptar peticiones de forma continua lo que hace que se use el CPU al 100% ● Toca ver si existen recursos críticos
  • 29. Hace unas pocas semanas Buscando ideas
  • 30. Hace unas pocas semanas ● Para validar la hipótesis decido usar sysdig para ver cuales son las llamadas al sistema que más tardan en responder ● Todo está lleno de epolls, así que descarto los epolls – normal en un sistema asíncrono ● Cuando ignoro los epolls: – La mayoría de las esperas son por MySQL (ToySQL) – Hay mucha comunicación de red con REDIS
  • 31. Hace unas pocas semanas La parte del sistema que nos interesa ahora
  • 32. Hace unas pocas semanas ● Con MySQL ocurrían dos problemas: – Una query que hacia un order by con limit en un campo que no tenia índice – facepalm – Una query de union que tenia índices pero el filtrado se hacia en el having por lo que no usaba índices – sin comentarios ● Soluciones: – Crear un índice para la primera consulta – Reescribir la query para que el filtrado se haga en los where y no esperar hasta el final (el having) – Ahora me llaman DBA por esto. FML
  • 33. Hace unas pocas semanas ● Ahora las queries a la BD iban algo mejor - mucho ● Pero persistía el alto uso de CPU ● Con sysdig veo que peticiones del tipo /algo? user=id – Se conectan a REDIS y piden una colección de miles de elementos – Reviso el código fuente y el filtrado lo está haciendo python - LLORO
  • 34.
  • 35. Hace unas pocas semanas ● Soluciones: – Usar otra BD – No hay tiempo – Se utiliza otra estructura en REDIS para soportar este tipo de consultas ● Se dejo unos días para ver si había mejora y ...
  • 36. Hace unas pocas semanas API - Histograma de la duración de las peticiones
  • 37. Hace unas pocas semanas API - Duración de las peticiones en base al tiempo
  • 38. Hace unas pocas semanas ● Estadísticas – API ● Parece que hemos mejorado un poco el sistema min 0.002 q1 0.004 max 3.037 q3 0.006 mean 0.03 IQR 0.002 median 0.005 p90 0.01 mad 0.04 p99 0.70078 stdev 0.13
  • 39.
  • 40. Como conclusión ● Definir la latencia aceptable ● Medir / instrumentar ● Entender lo que se esta midiendo ● Hacer experimentos ● Hacer pruebas de carga de verdad
  • 41. Como conclusión ● Ir de forma iterativa corrigiendo los bottlenecks ● Vale la pena diferenciar los tipos de carga de trabajo ● Usar loadsheding, quotas o fallar es mejor a crear un fallo en cascada https://landing.google.com/sre/book/chapters/addressing-cascading-failures.html
  • 42. Como conclusión ● Antes de escalar en máquinas o cambiar el HW entender lo que esta limitando la escalabilidad ● Revisar los queries con explain y usar el f*** index ● Si la BD te puede dar el trabajo ya hecho es mucho mejor hacerlo en la aplicación: – Menos tráfico de red – No malgastas CPU
  • 43. ¿Preguntas? se supone que es una lighting talk Things That Are Not Questions (by @QuinnyPig) • Calling Bullshit • Telling a pointless story • A spoken word version of your resume