¿Por qué la invalidación de caché se considera difícil?

La invalidación de la memoria caché es una de las dos técnicas para mantener la coherencia de la memoria caché en un sistema en el que múltiples núcleos comparten una memoria caché de menor nivel. Esto permite que las condiciones de carrera entren al sistema, como se explica a continuación.

Cada vez que un cliente A (un nodo de caché) solicita acceso de escritura, todos los demás clientes que contienen la copia compartida de datos deben recibir invalidaciones. Esto tiene que suceder a través de una red de interconexiones. Ahora, durante esta fase transitoria (el tiempo entre el momento en que se envían las invalidaciones pero aún no se reciben), si otro cliente B solicita un acceso de lectura o escritura, los resultados dependen completamente de la solicitud que llegue primero al servidor (el directorio). El protocolo debe hacer lo correcto para cualquiera de estas posibilidades. Se espera que sea lo suficientemente inteligente como para desenredar todas esas condiciones de carrera . Ahí es donde la codificación de un protocolo de coherencia de caché con invalidación de caché se vuelve difícil. El desafío radica en manejar correctamente estos casos inusuales de condiciones de carrera, y hay una gran cantidad de ellos posibles. Si modela el protocolo utilizando una máquina de estado, un verificador de máquina de estado normalmente descubrirá miles de rutas en el diagrama de estado.

La otra alternativa para mantener la coherencia es la Actualización de caché, en la que el escritor envía una copia de los datos nuevos a cada cliente que tiene acceso de lectura. Pero esto sacrifica el desempeño de los casos comunes, para lograr la simplicidad del protocolo.

Supongo que está haciendo referencia a la cita que se repite a menudo sobre las “dos cosas difíciles en informática: invalidación de caché y nombrar cosas”.

Esto se aplica tanto en la programación como en el hardware: es fácil conservar una copia de algo. Es mucho más difícil saber cuándo dejar ir esa copia y, en su lugar, volver a buscar el elemento original. Debido a que es un problema general, lo responderé a un alto nivel.

En general, tiene dos razones para almacenar en caché un dato:

  1. Es relativamente costoso obtener los datos la primera vez.
  2. Espera leer los mismos datos varias veces, por lo que es beneficioso mantener los datos localmente para evitar incurrir en el gasto de obtener los datos más de una vez.

Esto se aplica a los cachés en todos los niveles, ya sea un caché de hardware que retiene una copia de la memoria externa cerca de la CPU, o un navegador web que retiene una copia de un documento recuperado de un servidor web.

El almacenamiento en caché es atractivo porque ahorra tiempo, ya que elimina el costo de leer el original cuando lo vuelve a leer más tarde. Pero, ¿qué pasa si el valor original puede cambiar? ¿Cómo se asegura de que cada copia en caché del sistema refleje los datos actualizados, sin incurrir en costos que excedan el beneficio del almacenamiento en caché? Y, si los múltiples actores del sistema pueden actualizar los datos, ¿cómo se asegura de que todos vean una serie consistente de actualizaciones?

Por ejemplo, supongamos que tiene una página web que podría ser almacenada en caché por miles o millones de navegadores web. Eso ahorra latencia y ancho de banda: los navegadores obtienen una copia una vez y no necesitan consultar el servidor web nuevamente. Pero, ¿qué pasa si cambia la página en el servidor? No va a enviar un mensaje a los miles o millones de navegadores para decirles que lo busquen nuevamente.

En este ejemplo, los navegadores necesitan una política para saber cuándo volver a consultar con el servidor para ver si la página ha cambiado. Y, la política correcta para cualquier URL dada será diferente dependiendo de las actualizaciones esperadas, como tener una fecha de vencimiento en la memoria caché, enviar una solicitud más liviana de “Hey, ¿esto ha cambiado?” Al servidor, y así sucesivamente. La respuesta correcta no siempre es obvia, y es fácil acertar “la mayoría de las veces” y pasar por alto un oscuro modo de falla.

Del mismo modo para los sistemas de archivos de red, los sistemas de archivos locales si los programas contienen cachés internos, bases de datos con múltiples procesos que leen la base de datos, etc.

Los cachés de memoria de hardware, aunque definitivamente son difíciles, quizás lo tengan más fácil que los sistemas informáticos distribuidos: si todos los accesos a una memoria física particular pasan por un controlador común, entonces al menos el controlador común tiene la posibilidad de poder informar a todos los cachés anteriores se trata de una escritura de manera algo oportuna. El sistema de memoria es al menos autónomo. Aun así, aún debe asegurarse de que los mensajes de invalidación se procesen de una manera que garantice que las actualizaciones de memoria se vean consistentes para todos los lectores, y hacerlo de manera eficiente sigue siendo complicado.

Sin profundizar en todos los protocolos posibles de invalidación, esa es la esencia del problema.

Me gustan las respuestas que ya se dieron, pero creo que ambos podrían usar una explicación general aún más de alto nivel.

La invalidación de caché es difícil porque:

  1. Todo en la vida que queremos saber, cambia.
  2. Esos cambios no son deterministas.

El no determinismo es la razón por la que la invalidación de caché, y ese otro problema difícil, nombrar cosas, son problemas únicos e intratablemente difíciles en informática. Las computadoras pueden resolver perfectamente problemas deterministas. Pero no pueden predecir cuándo invalidar un caché porque, en última instancia, nosotros, los humanos que diseñamos y construimos procesos computacionales, no podemos acordar cuándo un caché necesita ser invalidado.

Es por eso que creo que se puede argumentar que los 2 problemas más difíciles en informática son esencialmente los 2 problemas más difíciles de la vida en general, en lo que respecta a los humanos y la información. Piense en los viejos tiempos de cómo invitó a alguien a salir. Si prefieres una relación monógama, primero comenzaste a descubrir si tu enamorado ya estaba en una relación. Si es así, hizo lo que pudo a su alcance para tener la información más actualizada sobre el estado de su relación.

La desventaja de los datos desactualizados es evidente: desea mudarse a la primera señal de disolución de la relación actual.

Entonces, el problema difícil e irresoluble se vuelve: ¿qué tan actualizado necesita realmente estar ? Porque si vives a 30 minutos o más de tu enamoramiento, conducir todos los días para controlar los chismes relevantes es muy costoso, y ser el primero en saber sobre una ruptura puede ser irrelevante si no lo haces tiene el dinero o el trabajo para mantener una relación, porque lo gastó todo en dinero de gasolina y tiempo de viaje.

E incluso si el dinero no fuera un problema en lo que respecta al amor verdadero, existe el problema de que su monitoreo constante se interprete como acoso. Entonces, incluso vivir cerca de su objetivo de afecto no hace que la invalidación de caché sea un problema fácil o determinista.

Después de considerar el valor que le damos y las compensaciones que hacemos, cuando se trata de saber algo importante, creo que es mucho más fácil entender por qué la invalidación de caché es uno de los problemas más difíciles en la informática y apreciar mejor por qué una empresa como Facebook invierte mucha investigación e ingeniería en el rendimiento de la red de cosas tan aparentemente triviales como las notificaciones.

¿Por qué se considera difícil? Se considera difícil porque es parte de una cita famosa: “Solo hay dos cosas difíciles en informática: invalidación de caché y nombrar cosas”. Phil Karlton. Esta es una cita bastante famosa, y muchos programadores la han escuchado, y por lo tanto consideran que la invalidación de caché es difícil.

¿Por qué es realmente difícil? Porque es difícil lograr un equilibrio deseable entre los objetos obsoletos que apestan su caché y las frecuentes actualizaciones innecesarias de objetos sin cambios.

More Interesting

¿Quiénes son los mejores profesores que trabajan en Computación Cuántica?

¿Cómo puede un estudiante de doctorado en un programa de aprendizaje automático no superior (con la mayoría de los estudiantes y profesores haciendo investigación aplicada) intentar entrar en una carrera de investigación teórica?

¿Cómo se realiza la investigación en informática?

¿Qué habilidades prácticas debe aprender un aspirante a investigador de aprendizaje automático (Linux, computación paralela, GPU, etc.)?

¿Hay algún algoritmo en línea para la reducción de dimensionalidad no lineal?

¿Cuáles son algunos requisitos previos para un investigador en ciencias de la computación en IIT, IISc, etc.?

¿Cuáles son algunas de las cosas que un estudiante de maestría debe hacer regularmente que le ayudarán cuando finalmente se ponga a escribir su tesis?

¿El aprendizaje profundo realmente funciona? ¿Es solo promocionado por los investigadores que es impulsado por los fabricantes de GPU?

¿Qué debería hacer uno si es un estudiante de doctorado en CS y no está nada satisfecho con su escuela y supervisor?

¿Cuáles son los temas candentes en informática para escribir un trabajo de investigación?

¿Cuáles son algunos posibles temas de investigación en Computational Social Choice?

¿Qué significa en informática?

¿Cuánto trabajo se ha hecho para identificar acentos algorítmicamente?

Investigación: ¿Cuáles son los temas en los que se está llevando a cabo una investigación innovadora actualmente?

¿Cuáles son algunos de los resultados de investigación más inútiles en informática?