เลเยอร์ส่วนใดของโมเดลเลเยอร์สามารถถูกบายพาสเพื่อให้เกิดประโยชน์สูงสุดในการเพิ่มประสิทธิภาพ


28

ขณะนี้ฉันเห็นว่าสำหรับตารางฐานข้อมูลที่มีสคีมาง่าย ๆ (ประมาณ 5 ฟิลด์) มันเป็นการแทรกเร็กคอร์ดใหม่ด้วยอัตราที่ต่ำกว่า ~ 50 แทรก / วินาทีในสภาพแวดล้อมการพัฒนาท้องถิ่นของฉัน (ไดรฟ์ SSD) - ไม่มีผู้สังเกตการณ์ในรูปแบบการเติมตารางที่เกี่ยวข้อง

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

ฉันสงสัยว่ามีใครบางคนไปเส้นทางนี้มาก่อนหรือไม่และมีชัยชนะอย่างง่าย ๆ ในแง่ของส่วนประกอบของเลเยอร์โมเดลที่สามารถข้ามได้ค่อนข้างปลอดภัยซึ่งจะให้ประสิทธิภาพที่ดีขึ้นอย่างมาก

สิ่งที่ชอบ:

  • การจำแนกชื่อคลาส
  • ก่อนและหลังบันทึกเหตุการณ์
  • เหตุการณ์ยื้อ
  • การทำธุรกรรม
  • เป็นต้น

UPDATE: ฉันโกหกจริง ๆ แล้วมีข้อสงสัยเพิ่มเติมบางอย่างที่ทำให้ผู้สังเกตการณ์หรือ afterSave () ของที่ฉันเห็นเมื่อฉันตรวจสอบบันทึกการสืบค้นฐานข้อมูล การเปรียบเทียบกับเอนทิตี้เรียบง่ายจริง ๆ ให้ฉัน ~ 300 แถว / วินาทีกับรุ่น Magento - ค่าใช้จ่าย MySQL เท่านั้นที่ทำธุรกรรม


1
คุณได้ลองนำโมเดลวัตถุเพื่อเขียนข้อมูลกลับมาใช้ใหม่หรือไม่ เช่นล้างมัน setData แล้วบันทึก สิ่งนี้จะหลีกเลี่ยงการเรียกใช้ getModel และค่าอินสแตนซ์ของอินสแตนซ์ของ PHP
davidalger

นอกจากนี้ฉันจะเดาว่าคอขวดที่อยู่ใน CPU ของคุณไม่ใช่ไดรฟ์ ... เนื่องจากไฟล์รหัสที่จำเป็นทั้งหมดจะถูกโหลดเมื่อผ่านครั้งแรก
davidalger

ขอบคุณเดวิด! ฉันจะลองเช่นกัน ที่จริงฉันคิดว่าเรายังคงฉัน / O ผูกพันกับจำนวนการค้นหาที่กำลังดำเนินการ เรามีแบบสอบถามประมาณ 20 รายการที่ใช้สำหรับการบันทึกรุ่นที่กำหนด - บางรายการที่เราจำเป็นต้องเก็บไว้ (เติมข้อมูลตารางที่เกี่ยวข้องเลือกการตรวจสอบการมีอยู่ก่อนบันทึก) และอื่น ๆ ที่เราสามารถลบได้ (บันทึกเซสชันภายนอก, โหลดเพิ่มเติมเพิ่มเติม () 's ที่สามารถหลีกเลี่ยงในตรรกะที่ใช้งาน)
kalenjordan

คุณสามารถหาได้ง่าย ใส่ dir รูททั้งหมดและฐานข้อมูล MySQL บนดิสก์ RAM แต่ฉันสงสัยอย่างยิ่งว่า I / O เป็นปัญหาในอุปกรณ์ระดับเซิร์ฟเวอร์ คุณอาจเห็นประโยชน์มากขึ้นเพียงปิดการใช้งาน "ดัชนีเมื่อบันทึก"
Ben Lessani - Sonassi

คำตอบ:


17

สิ่งหนึ่งที่สามารถเพิ่มความเร็วของไซต์ได้ทั้งหมดคือการลบการอ้างอิงทั้งหมดไปยังVarien_Profilerไซต์การผลิตของคุณ แม้ว่า profiler ถูกปิดใช้งานมันจะตรวจสอบเสมอว่าจะเปิดใช้งานหรือไม่ดังนั้นการเรียกทุกครั้งVarien_Profiler::จะส่งผลให้มีifคำสั่งเพิ่มเติม แน่นอนว่าการลบการเรียกทั้งหมดเหล่านี้มาด้วยค่าใช้จ่ายที่ไม่สามารถใช้ profiler ได้อีกต่อไป อย่างไรก็ตามสิ่งนี้สามารถเพิ่มความเร็วของไซต์ทั้งหมดได้ประมาณ 5% หรือมากกว่านั้น (นี่เป็นประสบการณ์แบบอัตนัย แต่มีหลายสายที่สามารถส่งไปVarien_Profilerทั่ว Magento ได้) ที่จริงฉันเขียน shell shell เล็กน้อยเพื่อคอมเม้นท์การโทรเหล่านี้ในไฟล์ทั้งหมดโดยอัตโนมัติและฉันจะเพิ่มมันในการโพสต์ของฉันในวันพรุ่งนี้เมื่อฉันทำงานและมีรหัสของฉันพร้อม

ตามที่สัญญาไว้ในตอนนี้รหัสที่จะแสดงความคิดเห็นสายเหล่านี้

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

ควรรันในคอนโซล linux ทั้งในแอพ / รวมถึงใน lib / โฟลเดอร์ คุณอาจต้องปรับไฟล์ /lib/Varien/Profiler.php ด้วยตนเองหลังจากนั้น โปรดทราบว่าคุณควรทดสอบสิ่งนี้อย่างละเอียดในสภาพแวดล้อมที่ปลอดภัยก่อนนำมาใช้จริง - แต่ฉันคิดว่าสิ่งนี้ควรชัดเจน;)


ว้าว! ฉันไม่เคยนึกภาพอะไรเลยแม้แต่ใกล้ถึง 5% สำหรับการโทร Varien_Profiler เมื่อปิดการใช้งาน ฉันจะตรวจสอบว่าขอบคุณ!
kalenjordan

@sparcksoft ตามที่สัญญาไว้ฉันเพิ่มรหัสตอนนี้
mpaepper

1
นั่นคือสิ่งที่เงื่อนไข precompiler Cเป็นสิ่งที่ดีจริงๆ มันแย่มากที่ PHP ไม่มี แต่แน่นอนว่านั่นหมายความว่าจะต้องมีวิธีการรวบรวมและแคชล่วงหน้าด้วยตัวเอง :)
davidalger

2
นอกจากนี้คุณยังสามารถเขียนมันได้find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;ถ้าคุณชอบการแสดงผลเร็ว
kojiro

14

เมื่อดำเนินการบันทึกจำนวนมากใน Magento รุ่นจะเป็นการดีที่สุดที่จะปิดการใช้งานตัวทำดัชนี Magento ซึ่งทำให้กระบวนการช้าลง:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

และเปิดใช้งานเมื่อคุณทำเสร็จ:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

อ่า gotcha ดี นั่นจะเป็นเช่นไรถ้าคุณบันทึกเร็กคอร์ด customer_entity จำนวนมากและต้องการหลีกเลี่ยงการจัดทำดัชนีลูกค้าที่เกิดขึ้นสำหรับการบันทึกแต่ละครั้ง? ในกรณีของฉันฉันกำลังทำสิ่งนี้กับเอนทิตีแบบกำหนดเองที่ไม่มีการจัดทำดัชนี - อย่างน้อยก็สำหรับมาตรฐานที่ฉันทำ เรามีดัชนีที่กำหนดเองเช่นกันซึ่งฉันอาจจะใช้เคล็ดลับนี้กับ!
kalenjordan

ฉันไม่คิดว่าจะมีการจัดทำดัชนีลูกค้า แต่จะช่วยคุณได้เมื่อแก้ไขผลิตภัณฑ์จำนวนมากและเช่นนั้น วิธีใดก็คุ้มค่าลอง!
Rick Kuipers

ขออภัยมีข้อมูลผลิตภัณฑ์ EAV และตัวอย่างเช่น ขอบคุณ
kalenjordan

เฮ้! คุณอาจจะต้องทำดัชนีย้อนหลัง (บางส่วน) หลังจากนั้น?
Alex

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