ล็อคเซสชันหลังจากใช้ Cm_RedisSession


9

เราเปลี่ยนเป็น Redis เป็นหน่วยเก็บข้อมูลเซสชันด้วยโมดูล Cm_RedisSession เริ่มต้นจาก Magento 1.9.2.4 หลังจากการปรับใช้ลูกค้าจำนวนมากประสบเวลาโหลดหน้านานมาก (> 20-30 วินาที) สำหรับ Redis-Server เราใช้ AWS ElastiCache (m3. large)
ใน Tideways (คล้ายกับ Newrelic) ฉันเห็นคอขวดนี้ในการติดตาม:

ติดตามจาก Tideways

หลังจากอ่านเพิ่มเติมเกี่ยวกับปัญหานี้และดูในบันทึก Cm_RedisSession ฉันพบว่าเซสชันจากลูกค้าถูกล็อคและหลังจากการวิจัยเพิ่มเติมฉันตัดสินใจอัพเกรด Cm_RedisSession เป็น 1.14 เนื่องจากการปรับปรุงสำหรับการล็อคเซสชัน

ด้วยเวอร์ชันล่าสุดปัญหาจะลดลงเนื่องจากการล็อกจะหยุดลงอย่างถูกต้องหลังจาก 5 วินาที แต่ยังมีเวลาโหลด 5 วินาที

ฉันมีสองทฤษฎี

  1. คำขอบางส่วนตายดังนั้นจึงไม่มีการsession_close()โทรและด้วยเหตุนี้การล็อกจะไม่ถูกนำออกใช้:

    ฉันเปิดใช้งานบันทึกทุกรายการ (php-fpm, nginx และ magento) และดูพวกเขาจนกว่าข้อผิดพลาดนี้จะปรากฏใน Tideways สำหรับลูกค้า แต่ไม่มีข้อผิดพลาดในกรอบเวลานี้โดยเฉพาะ

  2. สคริปต์หลายอันพยายามอ่าน / เขียนเซสชันเดียวกัน:

    ฉันสร้างสคริปต์ที่เรียกขนานเวลาร้อยหน้าเดียวกันกับคุกกี้ส่วนหน้าเดียวกัน แต่ไม่มีการล็อคปรากฏขึ้น

ณ จุดนี้ฉันไม่สามารถเข้าใจได้ว่าเหตุใดการล็อกนี้จึงปรากฏขึ้นและยิ่งแย่กว่านั้นฉันไม่สามารถจำลองมันบน Maschine หรือระบบการจัดเตรียม

ใครมีคำแนะนำหรือวิธีแก้ปัญหาที่ฉันสามารถแก้ไขปัญหานี้ได้หรือไม่?

แก้ไข : มีคนพยายามปิดใช้งานการล็อกใน Cm_RedisSession หรือไม่

แก้ไข : ปัญหาเดียวกันกับ 1.15

แก้ไข : คำขอส่วนใหญ่ที่มีการล็อคเป็นการร้องขออาแจ็กซ์ แต่ฉันไม่สามารถทำซ้ำได้


$ 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>

INFOหน้าจอ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 รวมอยู่ในโค้ดหลักของ Magento 1.9.x แต่ได้รับการพัฒนาโดย Colin Mollenhour คุณใช้รหัสโมดูล Cm_RedisSession ที่มาพร้อมกับ 1.9.2.4 หรือรุ่นล่าสุดจาก GitHub github.com/colinmollenhour/Cm_RedisSessionหรือไม่
ชุดนอน

ดังที่ฉันได้เขียนเราได้อัปเกรดเป็นเวอร์ชันล่าสุด
Pawel

คุณเห็นปัญหาเดียวกันหรือไม่ถ้าคุณเรียกใช้เซิร์ฟเวอร์ redis ในพื้นที่
วางขาย

1
ฉันกำลังติดตามปัญหาเดียวกันทั้งหมดอยู่ ก่อนอื่นเราได้สัมผัส MemCache นี้และย้ายไปที่ Redis ด้วยความหวังว่าจะได้ทัศนวิสัยที่ชัดเจนยิ่งขึ้น เราใช้ 1.14.2 กับ Apache 2.x การใช้การตรวจสอบ redis-cli ฉันสามารถระบุได้ว่าคำขอกำลังล็อคเซสชันและไม่ปลดล็อค เรายังไม่ได้ระบุว่าเพราะเหตุใดคำขอของเราจึงมีขนาดเล็ก (ประมาณ 50-100 ต่อชั่วโมงในช่วงที่มีคนจำนวนมาก)
Craig Harris

1
magento.stackexchange.com/a/130691/69 คำถามที่คล้ายกัน แต่อาจมีตัวเลือก / เครื่องมือที่จะใช้เมื่อทำการดีบัก
B00MER

คำตอบ:


6

ฉันดูเหมือนจะกำจัดปัญหาของเราได้เป็นส่วนใหญ่ อย่างไรก็ตามฉันไม่เคยระบุสาเหตุที่แท้จริง

หลังจากอัปเกรด Cm_RedisSession เวอร์ชันล่าสุดการบันทึกระบุว่า 95% ของการร้องขอที่ค้างเซสชันควรเป็นไร้สัญชาติ ฉันใช้ FLAG_NO_START_SESSION ใน preDispatch () เพื่อป้องกัน Magento การสร้างเซสชัน ฉันประหลาดใจมากที่พบว่าในการผลิตคำขอ "ไร้สัญชาติ" ในขณะนี้ยังคงล็อคเซสชันอยู่ 95% การตรวจสอบเพิ่มเติมพบว่าเรามีผู้สังเกตการณ์บางคนที่ถูกยิงที่ยังคงพยายามเริ่มเซสชั่น เมื่อสิ่งเหล่านี้ได้รับการอัปเดตเพื่อให้เกียรติ FLAG_NO_START_SESSION ปัญหาการล็อกเซสชันของเราถูกลบเกือบทั้งหมด

ฉันไม่คิดว่าวิธีนี้จะช่วยแก้ปัญหาได้ แต่ฉันหวังว่าผู้อื่นจะสามารถใช้เทคนิคที่คล้ายกันได้


ฉันคิดว่าคำขอคำขอไร้สัญชาติไม่ทำงานสำหรับเราเพราะคำขอนี้ต้องการเซสชัน
Pawel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.