php session cakephp memcached amazon-elasticache

php - CakeSession::_startSession-Lento en Elasticache



cakephp memcached (2)

Este problema parece haber sido causado por el bloqueo de sesión, algo que ni siquiera sabía que existía.

Este artículo explica cómo y por qué existe el bloqueo de sesión: https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/

Lo importante es que memcached tiene el bloqueo de sesión activado de forma predeterminada .

En nuestro caso, no usamos Sesiones para otra cosa que no sea Autenticación, nuestra aplicación no usa la información de la sesión para almacenar el Estado del Usuario (como lo haría un carrito de compras), así que simplemente deshabilitamos el bloqueo de sesión con la configuración php.ini :

memcached.sess_locking = 0

Desde que hicimos este cambio, hemos visto una gran mejora en los tiempos de respuesta (~ 200 ms promedio a ~ 160). Esto es especialmente notable en las páginas pesadas de AJAX que cargan muchos datos al mismo tiempo. Anteriormente, parece que estas solicitudes se estaban cargando de forma secuencial, sin embargo, ahora todas se atienden de forma simultánea, la diferencia en la velocidad es increíble.

Si bien es probable que haya algunos casos de vanguardia que descubriremos en las próximas semanas / meses como resultado de desactivar el bloqueo de sesión, esta parece ser la causa del problema, y ​​este cambio parece haber evitado que se produzca el problema.

Estamos ejecutando CakePHP 2.9 y usando un Cluster de Elasticache para almacenamiento de sesión (que se almacena a través de Memcached).

Hemos deshabilitado la recolección de basura de sesión incorporada de PHP como se recomienda aquí: https://tideways.io/profiler/blog/php-session-garbage-collection-the-unknown-performance-bottleneck

session.gc_probability = 0

También hemos establecido la configuración de probability en 0 dentro de la configuración de caché de CakePHP.

Sin embargo; aún tenemos problemas por los que ocasionalmente experimentamos desaceleraciones importantes en CakeSession :: _ startSession, según lo informado por New Relic:

El Elasticache Cluster no muestra ninguna métrica que sugiera que hay un problema (a menos que haya alguna métrica que no entiendo correctamente).

¿Alguna sugerencia sobre cómo diagnosticar esta causa?


Necesitas depurar de manera desacoplada para descubrir qué capa está causando problemas.

Puede ser Cake, infraestructura AWS, latencia de red ...

Ejecute este pequeño script PHP y díganos el tiempo que tomó.

// memcache $m = microtime( true ); $memcache_obj = new Memcache; $memcache_obj->connect(''myhost.cache.amazonaws.com'', 11211); printf(''%.5f'', microtime( true ) - $m) ; // memcached. $time = microtime( true ); $m = new Memcached(); $m->addServer(''<elasticache node endpoint>'', 11211); $m->set(''foo'', 100); var_dump($m->get(''foo'')); printf(''%.5f'', microtime( true ) - $time) ;

Si el tiempo está bien, el problema será Cake.

Sin embargo, siendo honesto aquí, estoy bastante seguro de que el problema es ElastiCache Cluster.

Trate de señalar el punto final de un nodo y no el punto final de ElastiCache Cluster y avíseme cómo va.