คำสั่ง 'drush cc all` ใช้เวลานานเกินไปฉันต้องทำอย่างไร


12

บนเว็บไซต์ของฉันdrush cc allใช้เวลามากกว่า 4 นาทีในการทำงาน db ไซต์เป็นกี่ GB อย่างไรก็ตามฉันไม่เห็นเหตุผลที่ชัดเจนว่าทำไมใช้เวลานานเกินไป ฉันจะทำอย่างไรเพื่อค้นหาคอขวด


ตรวจสอบบันทึกการสืบค้น mysql แรก: drupal.stackexchange.com/questions/75629/…
AgA

คุณมี cron ที่ทำงานอยู่หรือไม่?
mpdonadio

ใช่ฉันมี cron ที่ทำงานอยู่ เว็บไซต์ช้าโดยทั่วไป รหัสดั้งเดิมจำนวนมากที่ไม่คุ้มค่าที่จะได้รับ
awm

ฉันเห็นด้วยกับ @MPD ที่นี่ฉันไม่คิดว่านี่เป็นความทรงจำที่เกี่ยวข้อง MySQL เป็นเพียงหนึ่งในเหตุผลที่เป็นไปได้ มีเพียงวิธีเดียวในการค้นหาและนั่นคือการสร้างโปรไฟล์ วิธีที่ง่ายที่สุดในการทำเช่นนั้นคือใช้ส่วนขยาย xhprof และ devel ซึ่งทำงานร่วมกับ drush (ใช้ -d เพื่อดูลิงก์ไปยังรายงาน) ฉันเดาว่ามีจำนวนของปัญหาปัญหาทั่วไปหากเว็บไซต์ที่ช้าสำหรับการร้องขอทั้งหมดจะหายไปโมดูลดูdrupal.stackexchange.com/questions/724/why-is-drupal-7-so-slow ชมนอกจากนี้ยังมีปัญหาประสิทธิภาพการทำงานบางอย่างที่สำคัญกับแคชดูdrupal.org/node/1944674
Berdir

ขอบคุณฉันคิดว่าฉันต้องทำโปรไฟล์ แต่ในกรณีของฐานรหัส drupal มันยากเสมอที่จะระบุคอขวด แม้ว่าฉันจะบอกว่าเว็บไซต์ช้า แต่ก็ไม่ช้าเกินไปและดื่มซีซีทั้งหมด แต่ช้าลงโดยไม่ได้สัดส่วน
awm

คำตอบ:


6

การล้างแคชด้วยตนเองนั้นใช้เวลาไม่นานเนื่องจากมันเป็นเพียงการตัดทอนตารางแคช สิ่งที่ต้องใช้เวลามากที่สุดคือการสร้างแคชรีจิสทรีใหม่หลังจากนั้น โดยปกติแล้วจะเป็นชุดรูปแบบรีจิสตรีซึ่งจะสแกนหา 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ที่จะมองหาสิ่งที่เฉพาะเจาะจงบางอย่างให้ลองเพิ่มเช่น:


5

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

หากเว็บไซต์ของคุณทำงานบนกล่อง Linux ให้เรียกใช้ 'top' (จากเชลล์ของคุณ) และกด Shift-M เพื่อเรียงลำดับรายการกระบวนการตามหน่วยความจำที่ใช้ จากนั้นรันการดำเนินการล้างแคชของคุณจากเทอร์มินัลอื่น คุณควรเห็น mysql และ apache ขึ้นไปด้านบนของรายการ คุณจะสามารถดูได้ว่าเปอร์เซ็นต์ของหน่วยความจำทั้งหมดในแต่ละกระบวนการเหล่านี้ใช้เท่าไรและใช้ RAM เท่าใด หากคุณมีพื้นที่เสมือนจำนวนมาก แต่ RAM ทางกายภาพทั้งหมดของคุณหมดลงการดำเนินการนี้อาจทำให้หน่วยความจำ VM กลายเป็น thrash ซึ่งสามารถลดเวลาในการดำเนินการลงจนเหลือเพียงเล็กน้อย

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


ขอบคุณฉันคิดว่าสาเหตุที่สำคัญคือไซต์ดังกล่าวได้รับมาระยะหนึ่งแล้วฐานข้อมูลมีขนาดใหญ่ขึ้นเล็กน้อยและโค้ดจำเป็นต้องได้รับสิทธิอีกมาก ตัวอย่างเช่นการดำเนินการ node_delete ใช้เวลาประมาณ 3 วินาที ฉันคิดว่าการให้หน่วยความจำมากเกินไปอาจซ้ำซ้อนคุณเห็นด้วยไหม
awm

ฉันมีมันในเครื่องของฉันและมันก็ช้า ฉันเพิ่มหน่วยความจำเป็นสองเท่าสูงถึง 1GB และตั้งเวลาเป็น `เวลาดื่มซีซีทั้งหมด ' ไม่ดีกว่ามากเร็วแค่ 4s เท่านั้น
awm

1
ใช่ถ้าทั้งเว็บไซต์ช้าตลอดเวลาแม้จะมีหน่วยความจำจำนวนมาก cc ก็ไม่ใช่ปัญหา คุณจะต้องทำโปรไฟล์ทั่วไปเพิ่มเติม
greg_1_anderson

นอกจากนี้หากไซต์นั้นเก่าและต้องการรีเฟรชลองสร้างใหม่ด้วยศูนย์ใหม่และใช้การย้ายข้อมูล drupal-to-drupal ( drupal.org/project/migrate_d2d ) เพื่อย้ายเนื้อหาของคุณ
greg_1_anderson

2

ฉันจะไม่เห็นด้วย (บ้าง) กับ @ greg_1_anderson ที่นี่

หากระบบไม่หยุดทำงานโดยสิ้นเชิงในระหว่างการแสดงcc allว่าฉันไม่คิดว่าคุณมีปัญหาหน่วยความจำทั่วไป เมื่อเซิร์ฟเวอร์ LAMP หมดหน่วยความจำจะมีการสลับ การสลับเซิร์ฟเวอร์กดปุ่มที่ใช้งานอยู่จะทำให้เกิดความไม่ดี กระบวนการ httpd จะเริ่มซ้อนกันเนื่องจากระบบช้าลง (swap ทำให้ระบบทำงานช้ามาก) ซึ่งจะทำให้มีการใช้ swap มากขึ้น ฯลฯ ในเว็บไซต์ที่ฉันเห็นสิ่งนี้เกิดขึ้นฉันจะเห็นกระบวนการโหลดตี 100 และกระบวนการ httpd ที่ใช้งานอยู่มากมาย

หากในที่สุดระบบของคุณกลับมาฉันคิดว่าคุณได้รับการปรับคุณภาพต่ำ drush cc allจะส่งผลให้มีการเข้าถึงฐานข้อมูลจำนวนมากดังนั้นฉันคิดว่ามันแสดงปัญหามากขึ้น ข้อเสนอแนะของฉันจะเรียกใช้mysqltunerบนเว็บไซต์ หากคุณมีฐานข้อมูลหลาย GB ฉันเดาว่าขนาดของคุณinnodb_buffer_pool_sizeไม่ได้อยู่ในระดับที่เหมาะสมจากระยะไกล ฉันจะตรวจสอบแบ็กเอนด์แคชทางเลือกเพื่อพยายามทำให้ฐานข้อมูลเล็กลง


ขอบคุณ drupal ใช้สำหรับการใช้งานบทบรรณาธิการที่มีเลเยอร์ servie ซึ่งมีการเคลือบเงามัน ผู้ใช้จะได้รับ drupal ฉันแค่ต้องการตรวจสอบสิ่งที่เกิดขึ้นเพราะฉันคิดว่ามีคอขวด ฉันคิดว่าทางออกที่ดีที่สุดของฉันคือการเปิดบันทึกช้า mysql และตรวจสอบฐานข้อมูล และทำโปรไฟล์ด้วย xdebug
awm

SHOW FULL PROCESSLIST จะบอกคุณว่าเกิดอะไรขึ้นโดยไม่จำเป็นต้องใช้บันทึกคิวรีช้า (และไม่ต้องรีสตาร์ทเซิร์ฟเวอร์) ดูคำตอบอื่น ๆ สำหรับ mytop ด้วย
Chris Burgess

1

อาจเป็นสภาพแวดล้อมเว็บโฮสติ้งของคุณ คุณหมายถึงการตั้งค่าท้องถิ่นหรือบางสิ่งบางอย่างที่โฮสต์บนพื้นที่สาธารณะหรือ VPS / เซิร์ฟเวอร์?

  • สภาพแวดล้อมการโฮสต์ - ถ้าคุณอยู่บนเว็บโฮสติ้งที่ใช้ร่วมกันจำนวนหน่วยความจำ Drupal / drush สามารถใช้ได้จะถูก จำกัด ดู: https://drupal.org/node/207036
  • เวลาดำเนินการสูงสุด - ต้องเพิ่มขึ้น

drush ปกติไม่ max_execution_timeจำกัด คุณสามารถทำได้drush php-eval "print ini_get('max_execution_time');"เพื่อตรวจสอบอีกครั้ง
mpdonadio

1

นี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์ แต่มีเครื่องมืออีกหนึ่งเครื่องมือที่ช่วยระบุแหล่งที่มาของความล่าช้าของคุณ

เช่นเดียวกับการใช้topในการตรวจสอบกระบวนการคุณอาจพบผลลัพธ์ของmytopข้อมูล (คำตอบอื่น ๆ ข้างต้นเข้าใจ MySQL แต่ถ้าคุณใช้แบ็กเอนด์ฐานข้อมูลอื่นคุณจะต้องสลับ mytop เป็นเครื่องมือที่เทียบเท่า)

mytopเพียงแค่เรียกใช้งาน MySQL SHOW FULL PROCESSLISTในการวนและแสดงให้คุณเห็นว่าแบบสอบถามใดจะถูกดำเนินการ (ซึ่งใช้เวลามาก) หากการล้างแคชใช้เวลานานในการล้างข้อมูลนี้หรือตารางนั้นคุณจะเห็นสิ่งที่ถืออยู่ตรงนี้ หากคุณไม่สามารถเข้าถึงการติดตั้งmytopเพียงทำรุ่นที่หยาบในเปลือกของคุณ -

while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done

หากความล่าช้าไม่ได้เกิดจากคำสั่ง MySQL ดังนั้นอย่างน้อยเครื่องมือนี้อาจยืนยันให้คุณ


1

ฉันพบโพสต์ในบล็อกชื่อSpeed ​​Up Cache Clearing ใน Drupal 7จะมีประโยชน์มากในการ จำกัด ขอบเขตที่ชัดเจนของกระบวนการล้างแคชที่ทำให้การทำงานช้าลง ปัญหามัน pinpoints ในคุณสมบัติโมดูลและโมดูลนิติบุคคล APIถูกผลกระทบต่อเว็บไซต์ของฉัน แต่กระบวนการรายละเอียดในการโพสต์ยังช่วยให้ฉันติดตามปัญหาที่เรากำลังเผชิญหน้าในหลัก Drupalและจุดพักโมดูล

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

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