กลยุทธ์การล้างแคชหน่วยความจำสำหรับไซต์ขนาดใหญ่?


30

หนึ่งในเว็บไซต์ Drupal 7 ของฉันมีฟิลด์เป็นพันประเภทเนื้อหาหลากหลายมีการดูมากกว่า 25 ครั้งและประเภทโปรไฟล์นับร้อย (ในไม่ช้าจะนับเป็นพัน) ด้วยเหตุนี้ฉันใช้ core patch ที่ดีกว่าแคชข้อมูลฟิลด์เอนทิตี (http://drupal.org/node/1040790) และ -dev เวอร์ชันของ Views ที่ดีกว่าแคชวิวโดยแสดง (แทนที่จะมีขนาดใหญ่หนึ่งอัน ดูแถวแคชด้วยข้อมูลมุมมองทั้งหมดในนั้น)

สิ่งนี้ช่วยให้หน้าเว็บส่วนใหญ่ในไซต์โหลดด้วย RAM ขนาด 20-30MB มากกว่า 160MB + (แทนที่จะดึง cache_ * แถวของตารางสำหรับเขตข้อมูลและมุมมองที่มีขนาด 10MB + โปรแกรมปรับปรุงช่วยรักษาข้อมูลแคช _ * ให้มีประสิทธิภาพมากขึ้น)

สิ่งนี้นำเสนอปัญหาอย่างไรก็ตามการสร้างแคชใหม่นั้นใช้เวลานานมาก มักจะมากกว่าหนึ่งหรือสองนาที และในช่วงเวลานี้ Drupal จะไม่โหลดหน้าใด ๆ (เนื่องจากแคชที่พยายามอ่านไม่ได้สร้างขึ้นคำขออื่น ๆ จึงต้องรอ)

ในระหว่างรอบการจราจรต่ำนี่ไม่ใช่เรื่องใหญ่ ผู้ใช้หนึ่งร้อยหรือมากกว่านั้นจะต้องรอหนึ่งนาทีก่อนที่จะโหลดหน้าเว็บ แต่ในระหว่างรอบการรับส่งข้อมูลสูงเซิร์ฟเวอร์ Apache เริ่มคลั่งไคล้โหลดซีพียู 40+ และหน่วยความจำจะเต็มเร็วขึ้นเนื่องจากเธรดผู้ทำงานทั้งหมดรอและหน่วยความจำสูงสุดทำให้เกิดการแลกเปลี่ยน มันเป็นเกลียวมรณะ การรีสตาร์ท httpd จะทำให้สิ่งต่าง ๆ หมดไป แต่ใช้เวลา 5-10 นาทีเพื่อให้สิ่งต่าง ๆ กลับสู่ปกติ

เป้าหมายของฉันคือการทำให้มันชัดเจนว่าแคชจะไม่นำเว็บไซต์ไปที่หัวเข่า สำหรับหนึ่งถ้าฉันใช้ฟังก์ชั่นการล้างแคชส่วนตัวของ admin_menu (เช่น "CSS และ JS" จากนั้น "เมนู" จากนั้น "ธีมรีจิสตรี" ฯลฯ ) สิ่งต่าง ๆ จะราบรื่นจนกว่าฉันจะกดตัวเลือก "หน้าและอื่น ๆ " นั่นคือเวลาที่แคชของมุมมองถูกรีเซ็ต (การทำงานของ CPU และฐานข้อมูลจำนวนมากที่มีจำนวนการดูที่ต้องแคช) และเมื่อแคชข้อมูลฟิลด์ถูกรีเซ็ต (ซึ่งก็คือ CPU และฐานข้อมูลบนเว็บไซต์นี้)

ดังนั้น ... คำถาม / ความคิดของฉัน:

  • การใช้ drush และ / หรือเชลล์สคริปต์อื่น ๆ เป็นไปได้ไหมที่ฉันจะล้างแคชด้วยวิธีที่ชาญฉลาดกว่า "ระเบิดแคชทั้งหมดในคราวเดียวและหวังว่าจะสร้างใหม่ทั้งหมด"
  • ฉันสามารถปิดกั้นการร้องขอ HTTP ในขณะที่การล้างแคชเกิดขึ้นดังนั้น apache จะไม่ถูกปิดกั้นด้วยคำขอการประทับตราแคชจำนวนมาก?
  • หากฉันสามารถล้างแคชนอกคำขอ httpd ของ Drupal / ปกติฉันสามารถตั้งค่า memory_limit PHP ที่สูงขึ้นสำหรับการดำเนินการล้างแคชและถอยกลับ memory_limit สากลของฉัน (ตั้งค่าตอนนี้เป็น 256MB ในกรณีที่เธรด httpd แต่ละรายการต้องการล้างแคช ... )

โดยทั่วไป: มีวิธีที่ชาญฉลาดและสง่างามในการล้างแคชทั้งหมดด้วย Drupal นอกเหนือจากการคลิกปุ่มใน UI หรือใช้งานdrush cc allหรือไม่?

[ แก้ไขเพื่อความกระจ่าง : ปัญหาหลักที่ฉันมีคือการสร้างแคชใหม่ซึ่ง (a) ใช้เวลาสักครู่และ (b) บล็อกคำขออื่น ๆ ทั้งหมดจนกว่าการสร้างใหม่จะเสร็จสมบูรณ์ ฉันต้องการหาวิธีในการสร้างมันขึ้นมาใหม่เพื่อให้การสร้างใหม่ไม่เป็นอันตรายถึงตายในช่วงเวลาที่มีการจราจรหนาแน่น]


2
คำถามที่น่าสนใจ หากคุณปิดใช้งานการแคชเว็บไซต์ของคุณมีประสิทธิภาพเพียงพอหรือไม่ IOW, คุณได้เพิ่มประสิทธิภาพ Apache / PHP / MySQL เพื่อให้ทำงานได้ดีเท่าที่จะสามารถเปิดใช้งานแคชได้หรือไม่? เห็นได้ชัดว่าฉันไม่ได้เห็นระบบของคุณ แต่การตั้งค่า apc.stat = 0 และทำให้แน่ใจว่าคุณมีหน่วยความจำเพียงพอสำหรับ APC จะช่วยลดการใช้งานดิสก์ ใช้ mysqltuner.pl จะให้ข้อบ่งชี้ว่า MySQL เป็นคอขวดหรือไม่ จากนั้นคุณสามารถเปิดใช้งานแคชและปรับแต่ง (มันจะเพิ่มการใช้งานฐานข้อมูลบางส่วนดังนั้นคุณอาจต้องปรับพารามิเตอร์ MySQL)
mpdonadio

ฉันใช้ Redis (คล้ายกับ memcache) เพื่อเก็บตารางแคชมุมมองในหน่วยความจำ ซึ่งช่วยเพิ่มความเร็วในการโหลดอย่างมาก รอคอยที่จะมีคุณสมบัติ "ดูแคชตามการแสดงผล" ในรีลีสที่เสถียรซึ่งมีเหตุผลมากมาย
2012

@MPD - การปิดใช้งานการแคชจะเป็นการฆ่าทั้งไซต์อย่างรวดเร็ว โดยทั่วไปแล้วจะมีผู้ใช้ที่ผ่านการตรวจสอบแล้ว 100-500 คนและบางส่วนของเว็บไซต์ค่อนข้างหนัก ปัญหาที่ใหญ่ที่สุดสำหรับฉันไม่ใช่การอ่านแคช (ฉันได้ทดลองกับ Memcached, Redis และ APC สำหรับผู้ใช้แคช) แต่ด้วยการสร้างแคชใหม่ซึ่งเป็น CPU ที่รุนแรงมาก
geerlingguy

เป็นการดีที่คุณต้องการใช้ข้อมูลแคชเก่าในขณะที่สร้างแคชใหม่ ถูกต้องหรือไม่
mikeytown2

@ mikeytown2 - ถูกต้อง - นั่นจะเป็นอุดมคติ
geerlingguy

คำตอบ:


9

มีวิธีที่ชาญฉลาดและสง่างามในการล้างแคชทั้งหมดด้วย Drupal นอกเหนือจากการคลิกปุ่มใน UI หรือใช้งาน drush cc ทั้งหมดหรือไม่

กระทำแคชโมดูลไม่ว่า มันขึ้นอยู่กับกฎ สำหรับผู้ตรวจสอบคุณสามารถตั้งค่ากฎเพื่อล้างมุมมองเฉพาะเมื่อโหนดประเภท "x" ถูกเพิ่มหรืออัปเดต ชำระเงินที่เอกสารสำหรับรายละเอียดเพิ่มเติม

ยังดูที่โมดูลที่สง่างามแคช - ยังไม่ได้ลอง แต่ดูน่าสนใจ


ฉันใช้drush cc [type]การล้างแคชที่เฉพาะเจาะจงแล้ว (คล้ายกับการกระทำแคช) แต่ฉันสนใจที่จะหาวิธีการล้างแคชได้อย่างสง่างามยิ่งขึ้นและตรวจสอบให้แน่ใจว่าเธรด httpd อื่น ๆ ไม่ได้ฆ่าเซิร์ฟเวอร์ Apache
geerlingguy

1
ดูเหมือนว่า drush cc จะล้างแคชมุมมองทั้งหมด ด้วยการกระทำของแคชคุณสามารถล้างมุมมองหรือการแสดงผลที่เฉพาะเจาะจงได้ อาจมีข้อผิดพลาดในเวอร์ชัน dev ของการดูมิฉะนั้นจะใช้เวลาหนึ่งหรือสองนาทีในการสร้างแคชใหม่ คุณมีปัญหาเดียวกันกับการใช้มุมมอง 7.x-3.5 หรือไม่? นอกจากนี้ยังจะดูที่drupal.org/project/cache_graceful - ไม่ได้พยายามมันยัง แต่ดูน่าสนใจ
Uwe

มุมมอง dev แบ่งมุมมองที่แสดงในแถวแคชของตัวเองเพื่อช่วยในการอ่านแคช ซึ่งหมายความว่ามุมมองใช้เวลาในการสร้างแคชเพิ่มขึ้น 5 เท่า (แต่นั่นจะช่วยลดการใช้หน่วยความจำเมื่ออ่านแคชมาก!)
geerlingguy

คุณสามารถเพิ่มข้อมูลเกี่ยวกับ Cache Graceful ในคำตอบเดิมของคุณได้หรือไม่? ฉันจะยอมรับมันเนื่องจากโมดูลนั้นช่วยได้เล็กน้อย (แต่ไม่ได้แก้ปัญหาทั้งหมดสำหรับฉัน) ฉันคิดว่าฉันจะต้องปรับเปลี่ยนเล็กน้อยของไซต์เพื่อใช้ฟิลด์น้อยลงและประเภทเอนทิตีเพื่อแก้ไขปัญหาของฉันอย่างแท้จริง
geerlingguy

ตกลง. ฉันสนใจที่จะรับฟังเกี่ยวกับประสบการณ์ของคุณเกี่ยวกับ cache_graceful ส่วนไหนที่ไม่แก้ไข
Uwe

2

ปัญหาหลักคือคุณใช้ MySQL เพื่อเก็บข้อมูลแคช - สำหรับเว็บไซต์ที่มีภาระสูงนี่เป็นวิธีการแก้ปัญหาที่ไม่มีประสิทธิภาพมาก

ฉันแนะนำให้ใช้Memcacheแทน สิ่งนี้จะเพิ่มประสิทธิภาพของระบบแคชอย่างมากและให้คุณประโยชน์ 2 อย่าง:

  1. Memcache เร็วกว่ามากสำหรับการอ่านและเขียนที่ MySQL - การดำเนินการแคชทั้งหมด (และการสร้างแคชใหม่) จะทำงานได้เร็วขึ้น
  2. เนื่องจากข้อมูลแคชไม่ได้เก็บไว้ในฐานข้อมูลอีกต่อไปการล้างแคชจะไม่บล็อกการสืบค้น MySQL อื่น ๆ

นี่คือตัวอย่างของการกำหนดค่า Memcacheสำหรับ Drupal 7


ฉันใช้ memcached และ APC ทั้งสองวิธีต่าง ๆ และในขณะที่พวกเขาให้ความช่วยเหลืออย่างมากกับการอ่านแคชปัญหาหลักที่ฉันมีคือการสร้างใหม่จริง ฐานข้อมูลไม่ได้ทำอะไรเลยในขณะที่เว็บเซิร์ฟเวอร์กำลังประทับตราแคชระหว่างกระบวนการสร้างใหม่ (ช้ามาก / ยาว)
geerlingguy

APC และ Memcached ทำสิ่งที่แตกต่าง ฉันคิดว่าการกำหนดค่า Memcached ที่ถูกต้องจะช่วยคุณได้ BTW หากไซต์ของคุณมีผู้เยี่ยมชมเป็นส่วนใหญ่โดยผู้ใช้ที่ไม่ระบุชื่อคุณสามารถใช้วานิช ในกรณีนี้วานิชจะใช้ระบบแคชของตัวเองและ Apache จะไม่ถูกดำเนินการสำหรับคำขอที่ไม่ระบุชื่อ
Eugene Fidelin

ไซต์มีปริมาณการใช้งานรับรองความถูกต้องเกือบ 100% มิฉะนั้นฉันจะลองใช้ Varnish ฉันอาจมองเข้าไปที่โมดูล Cache Graceful ณ จุดนี้
geerlingguy

0

การใช้ drush และ / หรือเชลล์สคริปต์อื่น ๆ เป็นไปได้ไหมที่ฉันจะล้างแคชด้วยวิธีที่ชาญฉลาดกว่า "ระเบิดแคชทั้งหมดในคราวเดียวและหวังว่าจะสร้างใหม่ทั้งหมด"

หากคุณไม่ต้องการทำลายแคชทั้งหมดให้ใช้: drush cc type_of_cacheเพื่อล้างค่าเฉพาะหรือกำหนดของคุณเอง

ล้างตารางเหมือนแคชทั้งหมดด้วยตนเองเช่น

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v 

หากคุณใช้ memcached (ไวยากรณ์ Bash) ให้ลอง:

pgrep memcached && echo flush_all > /dev/tcp/127.0.0.1/11211

ฉันสามารถปิดกั้นการร้องขอ HTTP ในขณะที่การล้างแคชเกิดขึ้นดังนั้น apache จะไม่ถูกปิดกั้นด้วยคำขอการประทับตราแคชจำนวนมาก?

เปิดใช้งานโหมดการบำรุงรักษา ( drush -y vset maintenance_mode 1) เพื่อป้องกันไม่ให้ผู้อื่นเข้าถึงเว็บไซต์ หรือกำหนดค่าส่วนหน้าเพื่อเปลี่ยนเส้นทางที่อื่น (เช่นในวานิชเปลี่ยนเส้นทางใน Apache หรือเปลี่ยนแปลง.htaccess)

หากฉันสามารถล้างแคชนอกคำขอ httpd ของ Drupal / ปกติฉันสามารถตั้งค่า PHP ที่สูงขึ้นmemory_limitสำหรับการดำเนินการล้างแคชและถอยออกสากลของฉันmemory_limit(ตอนนี้ตั้งไว้ที่ 256MB ในกรณีที่เธรด httpd แต่ละรายการต้องล้างแคช .. .)

การล้างแคชไม่ได้ใช้หน่วยความจำเพิ่ม แต่การสร้างแคชใหม่หลังจากล้างจะใช้เวลามากกว่า คุณสามารถอุ่นเครื่องแคชได้ตลอดเวลาโดยเรียกใช้ cron หรือเปิดหน้าใดก็ได้เช่น

time php -n -d memory_limit=-1 time $(which drush) cc registry
PHP_OPTIONS='-d memory_limit="2G"' drush cron
php -d memory_limit=1G ./scripts/drupal.sh http://localhost/

ระบุ-nเพื่อละเว้นphp.iniการประมวลผลที่สามารถเพิ่มความเร็วในการล้างแคช


-1

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

ข้อเสีย: ขึ้นอยู่กับจำนวนวินาที / นาทีของการหยุดทำงานของเซิร์ฟเวอร์การผลิตเทียบกับการตั้งค่าการหมดเวลา VCL ของคุณวานิชอาจอัปเดตในช่วงเวลานั้นและคุณจะเห็นหน้าจอข้อผิดพลาดวานิช 503

แต่วิธีการนี้พร้อมกับ Redis หรือ Memcache อาจช่วยได้


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

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