Por qué Cloudflare almacena en caché en memoria incluso los elementos poco populares
(blog.cloudflare.com)Cloudflare publicó en su blog su experiencia al cambiar su estrategia de caché y reducir hasta en un 25% la carga de escritura sobre los SSD. (En inglés) A diferencia de lo que dicta la intuición, Cloudflare logró este objetivo almacenando deliberadamente en memoria incluso elementos a los que no se accede con mucha frecuencia.
Los SSD son un medio de almacenamiento vulnerable a las escrituras. Las celdas de memoria flash donde se guardan los datos en un SSD tienen un número limitado de reescrituras, y borrar lo ya escrito para volver a grabarlo no solo toma relativamente más tiempo, sino que además también ralentiza las operaciones de lectura. Por eso, en los SSD es especialmente importante optimizar para reducir las escrituras.
Como Cloudflare usa muchos SSD NVMe de alto rendimiento en sus servidores, naturalmente se planteó este problema. Cloudflare es una empresa de CDN, y una CDN puede verse, en esencia, como una gran caché de red. Al final, lo que se guarda en los SSD de los servidores de Cloudflare también son elementos cacheados, y al observarlos descubrieron que entre ellos había muchísimos contenidos a los que no se volvía a acceder nunca después de haber sido cacheados una sola vez (los llamados “one-hit wonders”). Por lo tanto, conviene no escribir esos elementos en el SSD. Al probar un método para no escribir en el SSD los elementos a los que solo se accede una vez, obtuvieron un resultado alentador: la latencia del SSD se redujo casi un 5%.
El problema era cómo aplicar esta idea a escala real de servicio. No almacenar en caché en el primer acceso y empezar a cachear a partir del segundo significa que la cantidad de accesos al origen de los datos se duplica. Naturalmente, eso genera varios costos adicionales, y sería contraproducente. Por eso, Cloudflare estructuró la escritura en caché en dos niveles. Primero cachea todos los elementos en memoria como una “caché de corto plazo”, y luego solo los elementos con varios accesos son “promovidos” y escritos en el SSD como “caché permanente”. Así, los elementos de baja frecuencia de acceso terminan siendo expulsados de forma natural de la caché. En cuanto a las lecturas, no hizo falta prestarles atención especial, porque el sistema operativo ya se encarga de cachear bien las lecturas desde el SSD.
Por supuesto, la aplicación de esta idea en un servicio real se está haciendo con mucho cuidado y de forma conservadora. Este enfoque consume bastante memoria por naturaleza, lo que puede competir con la caché existente del sistema operativo, o incluso provocar una falta temporal de memoria durante actualizaciones del proceso del servidor con despliegue sin interrupciones, lo que terminaría degradando la calidad del servicio. Por eso, la idea se está introduciendo gradualmente y solo en servidores recién incorporados que cuentan con suficiente memoria.
Los resultados han sido positivos. Ajustando la capacidad de la caché durante la implementación, las escrituras al SSD se redujeron entre un 20% y hasta un 25%, lo que se tradujo en menor latencia. A futuro, Cloudflare planea ampliar esta técnica a más servidores, mejorar el algoritmo de promoción e introducir también la “degradación”, además de construir una jerarquía que considere no solo SSD sino también HDD.
Lo primero que me vino a la mente al ver esta idea fue la técnica de recolección de basura de Java. Después de todo, la premisa básica de la mayoría de las técnicas de garbage collection es justamente la llamada [hipótesis generacional débil], según la cual la mayoría de los objetos se usan solo durante un tiempo muy corto. Da la impresión de que el principio descrito arriba es una especie de aplicación adaptada de esa misma idea.
3 comentarios
Gracias por el buen artículo.
Parece que en el blog de Cloudflare suelen publicar bastantes artículos que vale la pena leer.
Cómo se gestiona un buen blog técnico de una empresa: https://es.news.hada.io/topic?id=1698
Parece que en Cloudflare el blogging ya se ha consolidado como parte de la cultura interna.
Fue muy interesante, gracias.
Vaya... hasta la traducción de una sola vez jaja. Gracias por compartir un buen contenido.