Jedna z moich witryn Drupal 7 ma tysiące pól, kilka rodzajów treści, ponad 25 wyświetleń i setki (wkrótce tysiące) typów profili. Z tego powodu używam poprawki podstawowej, która lepiej buforuje informacje o polu encji (http://drupal.org/node/1040790), oraz wersji -dev widoków, która lepiej buforuje widoki poprzez wyświetlanie (zamiast posiadania OGROMNEGO wiersz pamięci podręcznej wyświetleń zawierający wszystkie dane wyświetleń).
Pomogło to załadować większość stron w witrynie przy użyciu 20-30 MB pamięci RAM zamiast 160 MB + (zamiast wyciągania wierszy tabeli cache_ * dla pól i widoków o wielkości 10 MB +, łatki pomagają utrzymać dane cache_ * znacznie bardziej wydajne).
Powoduje to jednak problem polegający na tym, że przebudowywanie pamięci podręcznej zajmuje naprawdę dużo czasu . Zwykle dłużej niż minutę lub dwie. W tym czasie Drupal po prostu nie ładuje żadnych stron (ponieważ pamięci podręczne, z których próbuje odczytać, nie zostały jeszcze zbudowane, inne żądania muszą czekać).
W cyklach o małym natężeniu ruchu nie jest to wielka sprawa; około stu użytkowników będzie musiało poczekać minutę, zanim strona się załaduje. Ale podczas cykli dużego ruchu serwer Apache zaczyna szaleć, z obciążeniem procesora większym niż 40, a pamięć szybko się zapełnia, ponieważ wszystkie wątki robocze czekają i maksymalnie obciążają pamięć, powodując zamianę. To rodzaj spirali śmierci. Ponowne uruchomienie httpd wyczyści wszystko, ale powrót do normalnego stanu zajmuje 5-10 minut.
Moim celem jest, aby czyszczenie pamięci podręcznej nie powodowało upadku witryny na kolana. Po pierwsze, jeśli korzystam z indywidualnych funkcji czyszczenia pamięci podręcznej admin_menu (takich jak „CSS i JS”, następnie „Menu”, a następnie „Rejestr motywów” itp.), Wszystko pójdzie gładko, dopóki nie kliknę opcji „Strona i jeszcze”. To wtedy pamięć podręczna widoków jest resetowana (operacja bardzo intensywna pod względem procesora i bazy danych z liczbą widoków, które muszą być buforowane), a pamięć podręczna informacji o polu jest resetowana (która również wymaga dużej mocy obliczeniowej procesora i bazy danych w tej witrynie).
Więc ... moje pytania / pomysły:
- Czy za pomocą drush i / lub innego skryptu powłoki mogę wyczyścić pamięć podręczną w bardziej inteligentny sposób niż „wysadzić wszystkie pamięci podręczne naraz i mieć nadzieję na czystą przebudowę”?
- Czy mogę blokować żądania HTTP podczas czyszczenia pamięci podręcznej, aby apache nie był blokowany przez kilka żądań znaczników pamięci podręcznej?
- Jeśli mogę wyczyścić pamięć podręczną poza żądaniem Drupal / normal httpd, prawdopodobnie mógłbym ustawić wyższy limit pamięci PHP dla operacji czyszczenia pamięci podręcznej i wycofać mój uniwersalny limit pamięci (teraz ustawiony na 256 MB, na wypadek, gdyby każdy wątek httpd musiał wyczyścić pamięć podręczną ...)
Zasadniczo: Czy istnieje jakiś inteligentny i pełen wdzięku sposób na wyczyszczenie wszystkich pamięci podręcznych za pomocą Drupala, oprócz zwykłego kliknięcia przycisku w interfejsie użytkownika lub użycia drush cc all
?
[ Edytuj w celu wyjaśnienia : Głównym problemem, jaki mam, jest przebudowa pamięci podręcznej , która (a) zajmuje trochę czasu i (b) blokuje wszystkie pozostałe żądania do czasu zakończenia przebudowy. Chciałbym znaleźć sposób, aby to zrobić, aby odbudowy nie były tak zabójcze w czasach dużego natężenia ruchu.]