บนเว็บไซต์ของฉันdrush cc all
ใช้เวลามากกว่า 4 นาทีในการทำงาน db ไซต์เป็นกี่ GB อย่างไรก็ตามฉันไม่เห็นเหตุผลที่ชัดเจนว่าทำไมใช้เวลานานเกินไป ฉันจะทำอย่างไรเพื่อค้นหาคอขวด
บนเว็บไซต์ของฉันdrush cc all
ใช้เวลามากกว่า 4 นาทีในการทำงาน db ไซต์เป็นกี่ GB อย่างไรก็ตามฉันไม่เห็นเหตุผลที่ชัดเจนว่าทำไมใช้เวลานานเกินไป ฉันจะทำอย่างไรเพื่อค้นหาคอขวด
คำตอบ:
การล้างแคชด้วยตนเองนั้นใช้เวลาไม่นานเนื่องจากมันเป็นเพียงการตัดทอนตารางแคช สิ่งที่ต้องใช้เวลามากที่สุดคือการสร้างแคชรีจิสทรีใหม่หลังจากนั้น โดยปกติแล้วจะเป็นชุดรูปแบบรีจิสตรีซึ่งจะสแกนหา hooks ใหม่ทั้งหมดและโฟลเดอร์ Drupal ทั้งหมดของคุณเพื่อหาไฟล์เทมเพลตใหม่ระบบที่สแกนไฟล์สำหรับโมดูลและไฟล์คลาสใหม่และที่คล้ายกัน
คุณสามารถล้างแคชเฉพาะได้ตลอดเวลาโดยการระบุdrush cc theme-registry
หรืออื่น ๆ
ขอแนะนำให้คุณใช้กลไกการแคช PHP (เช่น OPCache, XCache เป็นต้น) เพื่อเพิ่มความเร็วในการประมวลผล และแคชฐานหน่วยความจำเพื่อแทนที่การใช้งานหนักในตาราง SQL (เช่น memcached หรือ Redis) ดังนั้นการล้างแคชจะใช้เวลาไม่นานเพียงแค่ล้างแคช (เช่นecho flush_all > /dev/tcp/127.0.0.1/11211
ใน Bash)
หรือคุณสามารถล้างแคชด้วยตนเองเช่นโดย:
echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v
ในการตรวจสอบสิ่งที่ต้องใช้เวลามากที่สุดโดยเฉพาะคุณต้องดีบัก / ทำโปรไฟล์ (เช่น XDebug, XHProf, phpdbg, dtrace)
บน OS X / Unix สามารถทำได้โดยdtrace
(หลังจากทำงานdrush
):
sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'
บน Linux ให้ใช้strace
เช่น
strace -e trace=sendto,recvfrom -s1000 -p $(pgrep php)
strace ... 2>&1 | grep -C5 UPDATE
ที่จะมองหาสิ่งที่เฉพาะเจาะจงบางอย่างให้ลองเพิ่มเช่น:
หากคุณมีฐานข้อมูลขนาดใหญ่มากและระบบของคุณทำงานได้ดีเมื่อคุณไม่ล้างแคชอาจเป็นไปได้ว่าคุณมีหน่วยความจำไม่เพียงพอที่จะรองรับการตั้งค่าของคุณอย่างเต็มที่
หากเว็บไซต์ของคุณทำงานบนกล่อง Linux ให้เรียกใช้ 'top' (จากเชลล์ของคุณ) และกด Shift-M เพื่อเรียงลำดับรายการกระบวนการตามหน่วยความจำที่ใช้ จากนั้นรันการดำเนินการล้างแคชของคุณจากเทอร์มินัลอื่น คุณควรเห็น mysql และ apache ขึ้นไปด้านบนของรายการ คุณจะสามารถดูได้ว่าเปอร์เซ็นต์ของหน่วยความจำทั้งหมดในแต่ละกระบวนการเหล่านี้ใช้เท่าไรและใช้ RAM เท่าใด หากคุณมีพื้นที่เสมือนจำนวนมาก แต่ RAM ทางกายภาพทั้งหมดของคุณหมดลงการดำเนินการนี้อาจทำให้หน่วยความจำ VM กลายเป็น thrash ซึ่งสามารถลดเวลาในการดำเนินการลงจนเหลือเพียงเล็กน้อย
ครั้งหนึ่งฉันใช้งานเว็บไซต์ Drupal ที่มีปริมาณการใช้งานไม่มากในกล่องที่มีหน่วยความจำเพียงพอสำหรับรองรับการตั้งค่า เมื่อฉันรันแคชที่ชัดเจนบนไซต์ที่มีทราฟฟิกต่ำที่ไม่เกี่ยวข้องการสร้างแคชใหม่จะผลักระบบให้เกินขีด จำกัด และทุกอย่างยกเว้นล็อคไว้ ดังนั้นพฤติกรรมของระบบโดยรวมจึงเป็นสิ่งสำคัญ นี่คือเหตุผลที่เครื่องมือง่าย ๆ เช่น 'บนสุด' เป็นจุดเริ่มต้นที่สะดวก
ฉันจะไม่เห็นด้วย (บ้าง) กับ @ greg_1_anderson ที่นี่
หากระบบไม่หยุดทำงานโดยสิ้นเชิงในระหว่างการแสดงcc all
ว่าฉันไม่คิดว่าคุณมีปัญหาหน่วยความจำทั่วไป เมื่อเซิร์ฟเวอร์ LAMP หมดหน่วยความจำจะมีการสลับ การสลับเซิร์ฟเวอร์กดปุ่มที่ใช้งานอยู่จะทำให้เกิดความไม่ดี กระบวนการ httpd จะเริ่มซ้อนกันเนื่องจากระบบช้าลง (swap ทำให้ระบบทำงานช้ามาก) ซึ่งจะทำให้มีการใช้ swap มากขึ้น ฯลฯ ในเว็บไซต์ที่ฉันเห็นสิ่งนี้เกิดขึ้นฉันจะเห็นกระบวนการโหลดตี 100 และกระบวนการ httpd ที่ใช้งานอยู่มากมาย
หากในที่สุดระบบของคุณกลับมาฉันคิดว่าคุณได้รับการปรับคุณภาพต่ำ drush cc all
จะส่งผลให้มีการเข้าถึงฐานข้อมูลจำนวนมากดังนั้นฉันคิดว่ามันแสดงปัญหามากขึ้น ข้อเสนอแนะของฉันจะเรียกใช้mysqltunerบนเว็บไซต์ หากคุณมีฐานข้อมูลหลาย GB ฉันเดาว่าขนาดของคุณinnodb_buffer_pool_size
ไม่ได้อยู่ในระดับที่เหมาะสมจากระยะไกล ฉันจะตรวจสอบแบ็กเอนด์แคชทางเลือกเพื่อพยายามทำให้ฐานข้อมูลเล็กลง
อาจเป็นสภาพแวดล้อมเว็บโฮสติ้งของคุณ คุณหมายถึงการตั้งค่าท้องถิ่นหรือบางสิ่งบางอย่างที่โฮสต์บนพื้นที่สาธารณะหรือ VPS / เซิร์ฟเวอร์?
max_execution_time
จำกัด คุณสามารถทำได้drush php-eval "print ini_get('max_execution_time');"
เพื่อตรวจสอบอีกครั้ง
นี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์ แต่มีเครื่องมืออีกหนึ่งเครื่องมือที่ช่วยระบุแหล่งที่มาของความล่าช้าของคุณ
เช่นเดียวกับการใช้top
ในการตรวจสอบกระบวนการคุณอาจพบผลลัพธ์ของmytop
ข้อมูล (คำตอบอื่น ๆ ข้างต้นเข้าใจ MySQL แต่ถ้าคุณใช้แบ็กเอนด์ฐานข้อมูลอื่นคุณจะต้องสลับ mytop เป็นเครื่องมือที่เทียบเท่า)
mytop
เพียงแค่เรียกใช้งาน MySQL SHOW FULL PROCESSLIST
ในการวนและแสดงให้คุณเห็นว่าแบบสอบถามใดจะถูกดำเนินการ (ซึ่งใช้เวลามาก) หากการล้างแคชใช้เวลานานในการล้างข้อมูลนี้หรือตารางนั้นคุณจะเห็นสิ่งที่ถืออยู่ตรงนี้ หากคุณไม่สามารถเข้าถึงการติดตั้งmytop
เพียงทำรุ่นที่หยาบในเปลือกของคุณ -
while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done
หากความล่าช้าไม่ได้เกิดจากคำสั่ง MySQL ดังนั้นอย่างน้อยเครื่องมือนี้อาจยืนยันให้คุณ
ฉันพบโพสต์ในบล็อกชื่อSpeed Up Cache Clearing ใน Drupal 7จะมีประโยชน์มากในการ จำกัด ขอบเขตที่ชัดเจนของกระบวนการล้างแคชที่ทำให้การทำงานช้าลง ปัญหามัน pinpoints ในคุณสมบัติโมดูลและโมดูลนิติบุคคล APIถูกผลกระทบต่อเว็บไซต์ของฉัน แต่กระบวนการรายละเอียดในการโพสต์ยังช่วยให้ฉันติดตามปัญหาที่เรากำลังเผชิญหน้าในหลัก Drupalและจุดพักโมดูล
ใช้เวลาพอสมควรในการดำเนินการตามกระบวนการ แต่มันช่วยให้ฉันลดการล้างแคชจากหลายนาทีถึงไม่ถึงหนึ่งนาที