คำขอหน้าผู้ดูแลระบบที่ใช้เวลานานการปิดกั้นคำขออื่น ๆ


17

ถ้าฉันเข้าสู่ระบบแบ็กเอนด์วีโอไอพีและการดำเนินการบางอย่างที่ต้องใช้เวลานาน (ค้นหาทั่วโลกในแคตตาล็อกขนาดใหญ่ยาวทำงาน dataflow ฯลฯ ) เว็บเบราว์เซอร์ของฉันจะปฏิเสธที่จะโหลดหน้าเว็บผู้ดูแลระบบอื่น ๆในเบราว์เซอร์ที่มีเพียง ทำไมสิ่งนี้ถึงเกิดขึ้นและมีวิทยาศาสตร์ที่รู้จักกันในการแก้ปัญหาหรือไม่?

นั่นคือถ้าฉัน

  1. เข้าสู่หน้าแดชบอร์ดของ Magento

  2. เปิดแท็บที่สองด้วยหน้าผู้ดูแลระบบของ Magento

  3. ทำการค้นหาทั่วโลกที่ใช้เวลานาน (จำลองด้วยการโทรไปsleep(30)ที่ตอนต้นของglobalSearchAction) ในแท็บแรก

  4. พยายามโหลดแท็บที่สองอีกครั้ง

พฤติกรรมที่คาดหวัง: แท็บที่สองโหลดเนื้อหาหน้าทันที

พฤติกรรมที่แท้จริง: แท็บที่สองจะโหลดเพียงครั้งเดียวเมื่อการค้นหาทั่วโลกที่ใช้เวลานานเสร็จสิ้น

ไม่มีใครรู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้นโดยเฉพาะ? (ฉันเดาว่าคำขอของคอนโซลผู้ดูแลระบบ Magento จะล็อกทรัพยากรบางอย่างที่วีโอไอพีจำเป็นต้องใช้ในการบูต แต่ฉันไม่รู้ว่ามันคืออะไร)

ไม่มีใครรู้ว่าการแก้ไข / วิธีแก้ปัญหา?


1
คุณครับเพิ่งส่งความท้าทายมาให้ฉัน! :)
davidalger

คำตอบ:


21

ปัญหาเกิดจากการล็อคที่วางโดยตัวจัดการเซสชัน PHP ดังนั้นวีโอไอพีจึงไม่ล็อคสิ่งใดไว้อย่างชัดเจนและพยายามบล็อกคำขอของผู้ดูแลระบบ แต่มีผลข้างเคียงต่อการจัดเก็บเซสชันตามไฟล์

ล็อคการเขียนจะถูกวางไว้ในไฟล์ข้อมูลเซสชั่นเมื่อมันถูกเปิดโดยการร้องขอเริ่มต้น (ทำงานนาน) ทำให้การร้องขอที่สองเพื่อบล็อกจนกว่าการล็อคจะถูกปล่อยออกเมื่อมีการโทรsession_startเข้าMage_Core_Model_Session_Abstract_Varien::start

สามารถทำซ้ำได้ 100% ฉันใช้วิธีการเดียวกับที่คุณทำโดยเพิ่ม a sleep(30)ไปด้านบนของMage_Adminhtml_IndexController::globalSearchAction

น่าสังเกตว่าสิ่งนี้ไม่สามารถทำซ้ำได้หากคุณใช้ที่เก็บข้อมูลเซสชัน db หลังจากฉันพบสาเหตุที่แท้จริงฉันตั้งค่า sandbox ให้เป็นที่เก็บข้อมูลเซสชัน db และไม่สามารถทำให้เกิดปัญหาอีกต่อไป ดังนั้นตัวจัดการเซสชัน db Magento ดูเหมือนจะไม่ใช้การล็อกระดับแถวเพื่อล็อคการเขียนเซสชัน ฉันพบว่าสิ่งนี้น่าสนใจเพราะมีโอกาสที่จะเกิดการสูญเสียข้อมูลเนื่องจากแอปพลิเคชันนั้นไม่ได้พิจารณาว่ามีหลายเธรดที่เขียนในเซสชันเดียวกัน หมายเหตุสำหรับผู้อ่าน: ฉันจะไม่ใช้ที่เก็บข้อมูลเซสชัน db ในการผลิตเพื่อลองและแก้ไขปัญหานี้เป็นการดีสำหรับการโหลดฐานข้อมูล MySql ของคุณมากเกินไป

ฉันไม่ได้ลองทำซ้ำพฤติกรรมโดยใช้ระบบจัดเก็บข้อมูลเซสชันที่ใช้หน่วยความจำเช่น Redis แต่ฉันเดาว่าการล็อกระเบียนในที่เก็บเซสชันอาจถูกมองข้ามในสิ่งเหล่านี้เช่นกัน

มีเทคนิคที่สามารถใช้เพื่อหลีกเลี่ยงปัญหานี้เช่นการใช้session_write_closeเพื่อปลดล็อคก่อนที่คุณจะเริ่มงานที่ยาวนาน แต่สิ่งนี้จะป้องกันคุณจากการเขียนไปยังเซสชันตั้งแต่คุณเพิ่งปิดไป ดังนั้นจึงไม่น่าจะมีการนำไปใช้อย่างง่ายดายทั่วทั้งกระดานใน Magento แต่สามารถนำไปใช้กับเส้นทาง / คอนโทรลเลอร์ที่เฉพาะเจาะจงได้

เทคนิคของฉันในการตรึงสิ่งนี้เป็นสาเหตุหลักคือการเปิดใช้งานตัวสร้างโปรไฟล์ Xdebug และตรวจสอบไฟล์ "cachegrind" เมื่อคำขอที่สองเสร็จสมบูรณ์ฉันโหลดไฟล์เอาต์พุต (~ 25 MB บันทึก) ลงในMacCallGrindและเจาะลึกลงไปในการติดตามตามเส้นทางการโทรที่เวลารวมเป็น 28 วินาทีหรือมากกว่า ในที่สุดสิ่งนี้ทำให้ฉันsession_startโทรออกซึ่งใช้เวลาประมาณ 28 วินาทีในการวิ่งซึ่งเป็นจุดที่ดีในการวิจัยจากฉัน

แก้ไข:สำหรับความสนใจฉันโพสต์ภาพหน้าจอของไฟล์ "cachegrind" ที่ดูใน MacCallGrind บน Twitter


โมดูล uRapidFlow ของ Unirgy ปิดเซสชันเพื่อหลีกเลี่ยงปัญหานี้ซึ่งเป็นวิธีที่ดี แต่ก็น่าผิดหวังมากพอ ๆ กับที่ทำให้ยากที่จะให้คำติชมแก่ผู้ใช้ในภายหลัง
Peter O'Callaghan

@davidalger - โดยปกติคุณใช้พื้นที่เก็บข้อมูลเซสชันกับไซต์ลูกค้าอย่างไร
Alan Storm

3
เรื่องการล็อคไฟล์เซสชัน PHP นี้จะมีไว้สำหรับความสมบูรณ์ของข้อมูลน้อยกว่าสำหรับความสมบูรณ์ของไฟล์บนดิสก์ตัวเอง การมีหลายขั้นตอนในการเปิดและเขียนลงในบิตบนดิสก์ (ซึ่งเป็นไฟล์) จะนำไปสู่ความเสียหายของข้อมูลได้อย่างรวดเร็ว MySQL, redis และฐานข้อมูลส่วนใหญ่ได้รับการออกแบบมาโดยเฉพาะเพื่อให้สอดคล้องกันแม้ว่าจะมีหลายการเขียนในเวลาเดียวกัน นั่นคือไม่ใช่ว่าล็อคถูกมองข้ามก็คือว่ามันไม่จำเป็นต้องเป็นช่วงวิกฤต
Alan Storm

@AlanStorm - อินสแตนซ์ Memcached โดยเฉพาะสำหรับการติดตั้งที่สมดุลภาระระบบไฟล์สำหรับคลัสเตอร์แอปพลิเคชันโหนดเดียว ระบบไฟล์ทำงานได้ดีที่สุดโดยที่คุณไม่มีโหนดหลายโหนดเนื่องจากคุณไม่มีเวลาแฝง IP
davidalger

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