Chiến lược xóa bộ nhớ cache tiết kiệm bộ nhớ cho các trang web lớn?


30

Một trong 7 trang web Drupal của tôi có hàng ngàn trường, một loạt các loại nội dung, hơn 25 lượt xem và hàng trăm (sắp có hàng nghìn) loại hồ sơ. Do đó, tôi đang sử dụng một bản vá lõi giúp lưu trữ thông tin trường thực thể tốt hơn (http://drupal.org/node/1040790) và phiên bản -dev của Chế độ xem giúp lưu trữ lượt xem tốt hơn bằng cách hiển thị (thay vì có một HUGE xem hàng cache với tất cả dữ liệu xem trong đó).

Điều này đã giúp hầu hết các trang trên trang web tải với 20-30 MB RAM được sử dụng, thay vì 160 MB + (thay vì kéo lên các hàng bảng cache_ * cho các trường và chế độ xem là 10MB +, các bản vá giúp giữ dữ liệu cache_ * hiệu quả hơn nhiều).

Điều này giới thiệu một vấn đề, tuy nhiên, trong đó việc xây dựng lại bộ đệm mất rất nhiều thời gian . Thường là hơn một hoặc hai phút. Và trong thời gian này, Drupal chỉ đơn giản là không tải bất kỳ trang nào (vì các bộ nhớ cache mà nó đang cố đọc từ chưa được xây dựng, các yêu cầu khác phải chờ).

Trong chu kỳ lưu lượng thấp, đây không phải là vấn đề lớn; Một trăm người dùng sẽ chỉ phải đợi một phút trước khi tải trang. Nhưng trong các chu kỳ lưu lượng truy cập cao, máy chủ Apache bắt đầu phát điên, với hơn 40 lần tải CPU và bộ nhớ nhanh chóng bị lấp đầy vì tất cả các luồng công nhân ngồi chờ và tối đa hóa bộ nhớ của chúng, gây ra sự tráo đổi. Đó là một vòng xoáy chết chóc. Việc khởi động lại httpd sẽ xóa mọi thứ, nhưng phải mất 5-10 phút để mọi thứ trở lại bình thường.

Mục tiêu của tôi là làm cho nó để xóa bộ nhớ cache không đưa trang web đến đầu gối của nó. Đối với một người, nếu tôi sử dụng các chức năng xóa bộ nhớ cache riêng lẻ của admin_menu (như "CSS và JS", sau đó là "Menu", sau đó "Đăng ký chủ đề", v.v.), mọi thứ sẽ diễn ra suôn sẻ cho đến khi tôi nhấn tùy chọn "Trang và các trang khác". Đó là khi bộ đệm của chế độ xem được đặt lại (hoạt động rất mạnh mẽ của CPU và cơ sở dữ liệu với số lượt xem cần được lưu vào bộ đệm) và khi bộ đệm thông tin trường được đặt lại (cũng là CPU và dữ liệu dữ liệu trên trang web này).

Vì vậy, ... câu hỏi / ý tưởng của tôi:

  • Sử dụng drush và / hoặc các kịch bản shell khác, tôi có thể xóa bộ nhớ cache theo cách thông minh hơn là "nổ tất cả bộ nhớ cache cùng một lúc và hy vọng xây dựng lại sạch" không?
  • Tôi có thể chặn các yêu cầu http trong khi việc xóa bộ nhớ cache đang diễn ra để apache không bị tắc với một loạt các yêu cầu đóng dấu bộ đệm không?
  • Nếu tôi có thể xóa bộ nhớ cache bên ngoài yêu cầu Drupal / httpd bình thường, có lẽ tôi có thể đặt bộ nhớ PHP_limit cao hơn cho hoạt động xóa bộ nhớ cache và tắt bộ nhớ chung_limit của tôi (ngay bây giờ được đặt thành 256MB, trong trường hợp bất kỳ luồng httpd riêng lẻ nào cũng cần xóa bộ nhớ cache ...).

Về cơ bản: Có cách nào thông minh và duyên dáng để xóa tất cả bộ nhớ cache với Drupal ngoài việc chỉ cần nhấp vào nút trong giao diện người dùng hoặc sử dụng drush cc allkhông?

[ Chỉnh sửa để làm rõ : Vấn đề chính tôi gặp phải là xây dựng lại bộ đệm , trong đó (a) mất một lúc và (b) chặn tất cả các yêu cầu khác cho đến khi quá trình xây dựng lại hoàn tất. Tôi muốn tìm một cách để làm cho nó để việc xây dựng lại không hoàn toàn nguy hiểm trong thời gian lưu lượng truy cập cao.]


2
Câu hỏi thú vị. Nếu bạn tắt bộ nhớ đệm, hiệu suất trang web của bạn có đủ không? IOW, bạn đã tối ưu hóa Apache / PHP / MySQL để chạy cũng như nó có thể kích hoạt bộ đệm không? Rõ ràng, tôi chưa thấy hệ thống của bạn, nhưng đặt apc.stat = 0 và đảm bảo bạn có đủ bộ nhớ cho APC sẽ giúp giảm mức sử dụng đĩa. Sử dụng mysqltuner.pl cũng sẽ cho bạn biết liệu MySQL có phải là nút cổ chai hay không. Sau đó, bạn có thể bật bộ nhớ đệm và tinh chỉnh (nó sẽ tăng một số sử dụng DB, do đó bạn có thể cần phải điều chỉnh các tham số MySQL).
mpdon Arena

Tôi sử dụng Redis (tương tự như memcache) để giữ các bảng bộ đệm xem trong bộ nhớ. Điều đó đã cải thiện thời gian tải một cách quyết liệt. Mong muốn có tính năng "xem bộ nhớ cache bằng cách hiển thị" trong một bản phát hành ổn định, điều đó rất có ý nghĩa.
uwe

@MPD - Vô hiệu hóa bộ nhớ đệm sẽ nhanh chóng giết chết toàn bộ trang web; thường là 100-500 người dùng được xác thực và một số phần của trang web khá nặng. Vấn đề lớn nhất đối với tôi không phải là đọc bộ đệm (tôi đã thử nghiệm bộ nhớ cache của người dùng Memcached, Redis và APC cho việc đó), nhưng với việc xây dựng lại bộ đệm, rất tốn CPU.
ge Muffguy

Lý tưởng nhất là bạn muốn sử dụng dữ liệu bộ đệm cũ trong khi bộ đệm mới đang được xây dựng lại. Điều này có đúng không?
mikeytown2

@ mikeytown2 - Chính xác đó sẽ là lý tưởng.
ge Muffguy

Câu trả lời:


9

Có cách nào thông minh và duyên dáng để xóa tất cả bộ nhớ cache với Drupal ngoài việc chỉ cần nhấp vào nút trong giao diện người dùng hoặc sử dụng tất cả drush cc không?

Các mô-đun hành động bộ đệm làm điều đó. Nó phụ thuộc vào quy tắc. Đối với đề thi, bạn có thể thiết lập quy tắc để xóa chế độ xem cụ thể khi một nút loại "x" đã được thêm hoặc cập nhật. Kiểm tra các tài liệu để biết thêm chi tiết.

Ngoài ra, hãy xem mô-đun duyên dáng bộ đệm - chưa thử nhưng có vẻ thú vị.


Tôi đã sử dụng drush cc [type]để xóa bộ nhớ cache cụ thể (tương tự như hành động bộ đệm), nhưng tôi quan tâm hơn đến việc tìm cách xóa bộ nhớ cache một cách duyên dáng hơn và đảm bảo các luồng httpd khác không giết chết máy chủ Apache.
ge Muffguy

1
có vẻ như cc drush sẽ xóa tất cả các bộ nhớ cache. Với các hành động bộ đệm, bạn chỉ có thể xóa một chế độ xem hoặc hiển thị cụ thể. Có thể có một lỗi trong phiên bản dev, nếu không sẽ mất một hoặc hai phút để xây dựng lại bộ đệm. Bạn có gặp vấn đề tương tự khi sử dụng lượt xem 7.x-3.5 không? Ngoài ra, hãy xem drupal.org/project/cache_graceful - chưa thử nhưng có vẻ thú vị
uwe

Chế độ xem dev phá vỡ màn hình hiển thị thành các hàng bộ đệm của riêng họ, để giúp hiệu suất đọc bộ đệm. Điều này có nghĩa là lượt xem dành nhiều thời gian hơn để xây dựng bộ đệm (nhưng điều đó giúp giảm mức sử dụng bộ nhớ khi đọc bộ nhớ cache rất nhiều!).
ge Muffguy

Bạn có thể thêm thông tin về Cache Graceful vào câu trả lời ban đầu của mình không? Tôi sẽ chấp nhận nó, vì mô-đun cụ thể đó giúp một chút (nhưng không khắc phục hoàn toàn vấn đề cho tôi). Tôi nghĩ rằng tôi sẽ phải thực hiện một chút nghiên cứu lại trang web để sử dụng ít trường và loại thực thể hơn để thực sự khắc phục vấn đề của mình.
geummingguy

được. Tôi rất muốn nghe về trải nghiệm của bạn với cache_graceful. Phần nào không sửa được?
uwe

2

Vấn đề chính là bạn đang sử dụng MySQL để lưu trữ dữ liệu bộ đệm - đối với các trang web tải cao, đây là giải pháp rất không hiệu quả.

Tôi khuyên bạn nên sử dụng Memcache thay thế. Điều này sẽ tăng đáng kể hiệu năng của hệ thống bộ đệm và cung cấp cho bạn 2 lợi ích tuyệt vời:

  1. Memcache nhanh hơn nhiều đối với các hoạt động đọc và ghi mà MySQL - tất cả các hoạt động bộ đệm của bạn (và xây dựng lại bộ đệm đầy đủ) sẽ hoạt động nhanh hơn.
  2. Bởi vì dữ liệu bộ đệm không được lưu trữ trong DB nữa - xóa bộ đệm sẽ không chặn bất kỳ truy vấn MySQL nào khác.

Dưới đây là ví dụ về cấu hình Memcache cho Drupal 7.


Tôi đã sử dụng cả memcached và APC, theo nhiều cách khác nhau và trong khi chúng hỗ trợ rất nhiều cho việc đọc bộ đệm, thì vấn đề chính tôi gặp phải là việc xây dựng lại thực tế; cơ sở dữ liệu hầu như không làm gì trong khi máy chủ web đang đóng dấu bộ đệm trong quá trình xây dựng lại (rất chậm / lâu).
ge Muffguy

APC và Memcached tạo ra những thứ khác nhau. Tôi nghĩ rằng cấu hình chính xác của Memcached sẽ giúp bạn. BTW, nếu trang web của bạn chủ yếu được truy cập bởi người dùng ẩn danh - bạn có thể sử dụng Varnish. Trong trường hợp này, Varnish sẽ sử dụng hệ thống bộ đệm của riêng mình và Apache sẽ không được thực thi cho các yêu cầu ẩn danh.
Eugene Fidelin

Trang web có lưu lượng truy cập được xác thực gần như 100%, nếu không tôi sẽ xem xét sử dụng Varnish. Tôi có thể xem xét mô-đun Cache Graceful tại thời điểm này.
ge Muffguy

0

Sử dụng drush và / hoặc các kịch bản shell khác, tôi có thể xóa bộ nhớ cache theo cách thông minh hơn là "nổ tất cả bộ nhớ cache cùng một lúc và hy vọng xây dựng lại sạch" không?

Nếu bạn không muốn làm nổ tất cả bộ nhớ cache, hãy sử dụng: drush cc type_of_cache để xóa một cụ thể hoặc xác định bộ nhớ riêng của bạn.

Hoặc xóa tất cả các bảng giống như bộ đệm theo cách thủ công, ví dụ:

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

Nếu bạn đang sử dụng memcached (cú pháp Bash), hãy thử:

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

Tôi có thể chặn các yêu cầu http trong khi việc xóa bộ nhớ cache đang diễn ra để apache không bị tắc với một loạt các yêu cầu đóng dấu bộ đệm không?

Bật chế độ bảo trì ( drush -y vset maintenance_mode 1) để ngăn mọi người truy cập trang web. Hoặc định cấu hình giao diện người dùng để chuyển hướng ở một nơi khác (ví dụ như trong Varnish, chuyển hướng trong Apache hoặc thay đổi .htaccess).

Nếu tôi có thể xóa bộ nhớ cache ngoài yêu cầu Drupal / httpd bình thường, có lẽ tôi có thể đặt PHP cao hơn memory_limitcho hoạt động xóa bộ nhớ cache và tắt lại phổ quát của tôi memory_limit(ngay bây giờ được đặt thành 256 MB, trong trường hợp bất kỳ luồng httpd riêng lẻ nào cũng cần xóa bộ nhớ cache .. .).

Xóa bộ nhớ cache không chiếm nhiều bộ nhớ hơn, nhưng việc xây dựng lại bộ đệm sau khi xóa sẽ mất nhiều hơn. Bạn luôn có thể làm nóng bộ nhớ cache bằng cách chạy cron hoặc mở bất kỳ trang nào, vd

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/

Chỉ định -nbỏ qua php.inixử lý có thể tăng tốc quá trình xóa bộ nhớ cache.


-1

Có khả năng liên quan đến chi phí tiền tệ, nhưng bạn có thể sử dụng thiết lập máy chủ bộ đệm như Varnish. Ưu điểm là Varnish sẽ phục vụ trang web của bạn trong khi bộ nhớ cache của bạn đang xóa trên máy chủ sản xuất, mà người dùng không phải là người khôn ngoan hơn.

Nhược điểm: tùy thuộc vào thời gian ngừng hoạt động của máy chủ sản xuất so với cài đặt hết thời gian VCL của bạn, Varnish có thể cập nhật trong thời gian đó và bạn sẽ thấy màn hình lỗi Varnish 503.

Nhưng phương pháp này cùng với Redis hoặc Memcache có thể giúp ích.


Câu hỏi này chỉ liên quan đến bộ nhớ cache Drupal nội bộ; việc xây dựng lại bộ nhớ cache của Drupal đã mất mãi mãi và các lớp bộ nhớ đệm bổ sung bên ngoài / trước Drupal sẽ không giúp được gì nhiều cho việc xây dựng lại dữ liệu bộ đệm thực tế (bên cạnh việc giảm tải một số lưu lượng mà máy chủ web sẽ cần giữ một chút trong khi lưu trữ được xây dựng lại).
ge Muffguy

Trong trường hợp đó, tôi thấy Zend OpCache hoạt động tốt. :-)
mulderjoe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.