Número 7
13 de abril de 2022

Paradoxo temporal

Hai varios anos eu estaba nun equipo que facía unha aplicación web. A arquitectura era a habitual naquel tempo: tiñamos varias máquinas con cadanseu servidor web detrás dunha xerarquía de equilibradores de carga. Cando aumentaba o número de clientes, a carga e a latencia nos servidores tamén aumentaba; cando a latencia era demasiado elevada, só tiñamos que instalar un servidor nunha nova máquina e engadilo aos equilibradores para dividir a carga total entre máis servidores.

Un día notamos que a latencia media era alta así que, coma sempre, engadimos un servidor, pero non baixou a latencia. Estrañados, probamos a engadir aínda máis servidores, pero entón a latencia non só non baixou, senón que aumentou.

Dous homes cavando un burato.“Non entendo este burato: canto máis lle quito, máis grande é.”

Un histograma de latencias revelou que había dous picos de latencia: un bastante esfumado ao redor de 150 milisegundos (ms), e outro moi ben definido e moi “bicudo” en 3000 ms. Aínda máis: ao aumentar o número de servidores, tamén aumentaba a altura deste pico de 3000 ms.

Visto isto, probamos a reducir o número de servidores a ver se o pico baixaba… e iso é o que pasou. Dalgunha maneira, cantos máis servidores tiñamos, máis peticións tiñan 3000 ms de latencia. Non tiñamos idea de por que, pero polo menos podiamos reducir o número de servidores para reducir este segundo pico ata que puideramos dar coa causa.

Daquela, os servidores web usaban bancos de procesos para poderen servir varias peticións simultáneas. Se queremos servir 50 peticións simultáneas temos que ter 50 procesos porque cada proceso só pode servir unha petición de cada vez. Se chega unha petición número 51, ten que agardar a que un dos procesos remate a súa petición.

Como o tráfico web varía durante o día, eses bancos son dinámicos: cando hai moitas peticións, teñen moitos procesos; cando hai poucas, teñen poucos procesos e así aforran recursos.

É coma un restaurante en Sanxenxo: no inverno, con poucos clientes, teñen poucos camareiros, pero cando vén o bo tempo e chegan máis clientes, contratan máis. Isto non é instantáneo, claro: se un día chegan máis clientes do habitual, van agardar uns poucos días para ver se se mantén a tendencia antes de contratar máis camareiros.

O banco de procesos tamén agarda un pouco para non engadir procesos innecesariamente: tres segundos, ou 3000 ms, para ser exacto.

Supoño que a persoa que viu o dos tres segundos dixo: “ooooooooh!”

Como tiñamos moitos servidores, ás veces un servidor podía pasar varios minutos sen recibir unha petición, así que o seu banco de procesos pensaba que non había tráfico e reducía o seu tamaño ata o mínimo. No ficheiro de configuración non había un número mínimo de procesos definido, así que o banco de procesos acababa por eliminalos todos. Cando chegaba unha petición, o banco que estaba baleiro agardaba os seus tres segundos antes de crear o proceso, polo que esa petición acababa tendo 3000 ms de latencia.

Esa petición lenta tiña un efecto moi grande na latencia media, que era o que sempre mirabamos. Cando a viamos subir engadiamos máis servidores, así que cada servidor recibía menos peticións, o seu banco quedaba baleiro, a seguinte petición tiña 3000 ms de latencia, e a latencia media volvía subir.

Corriximos o problema establecendo un mínimo de 1 proceso nos bancos e reducindo o número de servidores para que cada un deles recibira un número razoable de peticións.

Tamén tivemos que corrixirnos a nós mesmos. A latencia media non serve para tomar decisións, xa que a afectan moito os valores atípicos. Con ese suceso aprendemos a usar a mediana, que representa mellor a experiencia típica dos usuarios, xunto cos percentís 90 e 99, que representan os valores atípicos.

Por outra banda, tivemos que facer algo de introspección. Segundo adquirimos experiencia, acumulamos unha base de datos mental de heurísticas e regras que nos axudan a traballar máis rápido e eficientemente. O malo é cando esquecemos que moitas delas son atallos, non verdades absolutas, e que non podemos ir sempre co piloto automático: temos que verificar que o que pensamos é certo.

A ilustración desta Folla está baseada nun gravado dunha edición de 1867 de “Les Misérables”.