Blocco sessione dopo aver usato Cm_RedisSession


9

Siamo passati a Redis come Session Storage con il modulo Cm_RedisSession predefinito da Magento 1.9.2.4. Dopo l'implementazione, molti clienti hanno riscontrato tempi di caricamento della pagina molto lunghi (> 20-30 sec.). Per Redis-Server stiamo usando AWS ElastiCache (m3.large)
In Tideways (simile a Newrelic) ho visto questo collo di bottiglia nella traccia:

Traccia da Tideways

Dopo aver letto di più su questo problema e aver esaminato il registro Cm_RedisSession, ho capito che la sessione del cliente era bloccata e dopo ulteriori ricerche ho deciso di aggiornare Cm_RedisSession alla versione 1.14, a causa dei miglioramenti apportati al blocco della sessione.

Con l'ultima versione il problema è ridotto al minimo, perché il blocco ora si interromperà correttamente dopo 5 secondi. Ma c'è ancora un tempo di caricamento di 5 secondi.

Ho avuto due teorie.

  1. Alcune richieste muoiono quindi non ci sono session_close()chiamate e per questo motivo il blocco non verrà rilasciato:

    Ho abilitato tutti i registri (php-fpm, nginx e magento) e li ho guardati fino a quando questo errore non appare in Tideways per un cliente, ma non si sono verificati errori in questo particolare intervallo di tempo

  2. Più script provano a leggere / scrivere la stessa sessione:

    Ho creato uno script che chiama in parallelo centinaia di volte la stessa pagina con lo stesso cookie frontend, ma non viene visualizzato alcun blocco.

A questo punto, non riesco a capire perché appaia questo lucchetto e, peggio ancora, non riesco a riprodurlo sul mio Maschine o sistema di stadiazione locale.

Qualcuno ha un suggerimento o una soluzione su come potrei risolvere questo problema?

Modifica : qualcuno ha provato a disabilitare il blocco in Cm_RedisSession?

Modifica : stesso problema con 1.15

Modifica : la maggior parte delle richieste con un blocco sono richieste Ajax. Ma non posso riprodurlo comunque.


$ php5-fpm -v

PHP 5.5.32-1+deb.sury.org~trusty+1 (fpm-fcgi) (built: Feb  5 2016 10:10:42)
  Copyright (c) 1997-2015 The PHP Group
  Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

$ nginx -v

nginx version: nginx/1.8.1

local.xml

<redis_session>                       
    <host>***************</host>            
    <port>****</port>
    <password></password>             
    <timeout>2.5</timeout>            
    <persistent></persistent>         
    <db>0</db>                        
    <compression_threshold>2048</compression_threshold>  
    <compression_lib>gzip</compression_lib>              
    <log_level>1</log_level>               
    <max_concurrency>6</max_concurrency>                 
    <break_after_frontend>5</break_after_frontend>       
    <break_after_adminhtml>30</break_after_adminhtml>
    <first_lifetime>600</first_lifetime>                 
    <bot_first_lifetime>60</bot_first_lifetime>          
    <bot_lifetime>7200</bot_lifetime>                    
    <disable_locking>0</disable_locking>                 
    <min_lifetime>60</min_lifetime>                      
    <max_lifetime>2592000</max_lifetime>                 
</redis_session>

INFOSchermata Redis :

$1939
# Server
redis_version:2.8.24
redis_git_sha1:0
redis_git_dirty:0
redis_build_id:0
redis_mode:standalone
os:Amazon ElastiCache
arch_bits:64
multiplexing_api:epoll
gcc_version:0.0.0
process_id:1
run_id:fbf620d695c006bdb570c05b104404eb8f2c12aa
tcp_port:6379
uptime_in_seconds:1140502
uptime_in_days:13
hz:10
lru_clock:12531431
config_file:/etc/redis.conf

# Clients
connected_clients:8
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:2586086144
used_memory_human:2.41G
used_memory_rss:2637590528
used_memory_peak:2586312888
used_memory_peak_human:2.41G
used_memory_lua:36864
mem_fragmentation_ratio:1.02
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:18525202
rdb_bgsave_in_progress:0
rdb_last_save_time:1471008721
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats
total_connections_received:1518441
total_commands_processed:28898066
instantaneous_ops_per_sec:14
total_net_input_bytes:7409376406
total_net_output_bytes:3059470870
instantaneous_input_kbps:3.10
instantaneous_output_kbps:0.78
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:420590
evicted_keys:0
keyspace_hits:8754547
keyspace_misses:18323
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0

# Replication
role:master
connected_slaves:0
master_repl_offset:322498
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2795
repl_backlog_histlen:319704

# CPU
used_cpu_sys:729.42
used_cpu_user:509.25
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Keyspace
db0:keys=1413298,expires=1413297,avg_ttl=1780138273

1
Cm_RedisSession è incluso nel codice core di Magento 1.9.x ma in realtà è sviluppato da Colin Mollenhour. Stai usando il codice del modulo Cm_RedisSession incluso con 1.9.2.4 o l'ultima versione di GitHub github.com/colinmollenhour/Cm_RedisSession ?
paj,

Come ho scritto, abbiamo eseguito l'aggiornamento all'ultima versione
Pawel,

Vedi lo stesso problema se esegui il server redis localmente
paj,

1
Sto rintracciando esattamente lo stesso problema. Abbiamo sperimentato per la prima volta questo MemCache e ci siamo trasferiti a Redis con la speranza di ottenere maggiore visibilità. Stiamo usando 1.14.2 con Apache 2.x. Usando il monitor redis-cli sono stato in grado di identificare che le richieste bloccano la sessione e non la sbloccano. Non abbiamo ancora stabilito perché una piccola percentuale delle nostre richieste lo faccia (circa 50-100 all'ora durante il picco del giorno).
Craig Harris,

1
magento.stackexchange.com/a/130691/69 Una domanda simile ma che potrebbe offrire alcune opzioni / strumenti da utilizzare durante il debug.
B00MER,

Risposte:


6

Sembra che per lo più abbia eliminato i nostri problemi. Tuttavia, in realtà non ho mai determinato la causa esatta.

Dopo aver aggiornato l'ultima versione di Cm_RedisSession, la registrazione indicava che il 95% delle richieste che contenevano la sessione doveva effettivamente essere apolide. Ho implementato FLAG_NO_START_SESSION nel preDispatch () per impedire a Magento di creare sessioni. Sono stato molto sorpreso di scoprire che in produzione le richieste ora "apolidi" contenevano ancora il 95% dei blocchi di sessione. Ulteriori indagini hanno rilevato che alcuni osservatori stavano sparando e stavano ancora cercando di iniziare la sessione. Una volta che questi sono stati aggiornati per onorare anche FLAG_NO_START_SESSION, il nostro problema di blocco della sessione è stato quasi completamente rimosso.

Non penso che questo risolva il problema, ma spero che altri siano in grado di utilizzare una tecnica simile.


Penso che la richiesta di richiesta senza stato non funzioni per noi, perché queste richieste richiedono la sessione.
Pawel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.