Una caché mal diseñada puede hacer más daño que bien. En el peor de los casos, una caché puede aumentar la carga del servidor de bases de datos en lugar de minimizarla. Una situación de sobrecarga puede ocurrir si una entrada de la caché altamente compartida expira (estampida de la caché).
Las entradas de la caché son compartidas y reutilizadas en diferentes grados, dependiendo del almacenamiento usado. El gestor de almacenamiento predeterminado almacena entradas en la memoria del proceso. Así, una entrada de la caché puede ser reutilzada durante el periodo de vida de un proceso. Otros procesos de PHP no puede acceder a ella. Si se usa Memcache, una entrada de la caché puede ser compartida entre múltiples procesos de PHP e incluso entre múltiples máquinas, dependiendo de la configuración que se use.
Si una entrada de la caché altamente compartida almacenada en, por ejemplo, Memcache expira, muchos clientes no obtendrán una coincidencia con la caché. Muchas peticiones de clientes ya no son servidas desde la caché, sino que se intenta ejecutar la consulta subyacente en el servidor de bases de datos. Hasta que la entrada de la caché sea refrescada, más y más clientes contactarán con el servidor de bases de datos. En el peor de los casos, el resultado será la pérdida total del servicio.
La sobrecarga se puede evitar usando un gestor de almacenamiento que limite la reutilización de entradas de la caché a unos pocos clientes. Entonces, como media, es probable que sólo un número limitado de clientes intenten refrescar una entrada de la caché de forma concurrente.
Adicionalmente, el mecanismo interno de defensa de cierre puede y debería usarse. Si
está activada la defensa de cierre, a una entrada expirada se le amplía el tiempo de vida.
El primer cliente que no obtenga una coincidencia con la caché para la entrada expirada intentará
refrescar dicha entrada dentro del tiempo de vida ampliado. Todos los demás clientes que soliciten
la entrada de la caché son servidos temporalmente desde la caché aunque el
TTL
original de dicha entrada haya expirado. Los demás clientes no
experimentarán una no coincidencia con la caché antes de que se agote el tiempo de vida.
Ejemplo #1 Habilitar el mecanismo de defensa de cierre
mysqlnd_qc.slam_defense=1 mysqlnd_qc.slam_defense_ttl=1
El mecanismo de defensa de cierre se habilita con la directiva de configuración
mysqlnd_qc.slam_defense
.
El tiempo de vida ampliado de una entrada de la caché se establece con
mysqlnd_qc.slam_defense_ttl
.
La función
mysqlnd_qc_get_core_stats() devuelve un array de
estadísticas. Las estadísticas slam_stale_refresh
y
slam_stale_hit
son incrementadas si la defensa de cierre tiene lugar.
No es posible establecer una recomendación universal en la configuración de la defensa de cierre. Se advierte a los usuarios que monitoricen y prueben sus configuraciones y que deduzcan los ajustes en consecuencia.