drush cc all
Uruchomienie w moim miejscu zajmuje ponad 4 minuty. Db witryny to kilka GB. Nie widzę jednak wyraźnego powodu, dla którego to trwa zbyt długo. Co mogę zrobić, aby zlokalizować szyjkę butelki?
drush cc all
Uruchomienie w moim miejscu zajmuje ponad 4 minuty. Db witryny to kilka GB. Nie widzę jednak wyraźnego powodu, dla którego to trwa zbyt długo. Co mogę zrobić, aby zlokalizować szyjkę butelki?
Odpowiedzi:
Samo czyszczenie pamięci podręcznej nie zajmuje dużo czasu, ponieważ po prostu obcina tabele pamięci podręcznej. Najwięcej czasu zajmuje odbudowanie rejestru pamięci podręcznej. Zwykle jest to rejestr motywów, który skanuje wszystkie nowe zaczepy i wszystkie foldery Drupal w poszukiwaniu nowych plików szablonów, system skanujący pliki w poszukiwaniu nowych modułów i plików klas i tym podobne.
Zawsze możesz wyczyścić określoną pamięć podręczną, podając ją drush cc theme-registry
lub dowolną inną.
Zaleca się użycie mechanizmu buforowania PHP (np. OPCache, XCache itp.), Aby przyspieszyć przetwarzanie. Pamięć podręczna oparta na pamięci, aby zastąpić duże obciążenie tabel SQL (np. Memcached lub redis), więc wyczyszczenie pamięci podręcznej nie zajmie czasu, tylko przez opróżnienie pamięci podręcznej (np. echo flush_all > /dev/tcp/127.0.0.1/11211
W Bash).
Alternatywnie możesz zawsze wyczyścić pamięć podręczną ręcznie , np .:
echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v
Aby sprawdzić, co zajmuje najwięcej czasu, musisz go debugować / profilować (np. XDebug, XHProf, phpdbg, dtrace).
W systemie OS X / Unix można to osiągnąć dtrace
(po uruchomieniu 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); }'
W systemie Linux użyj strace
np
strace -e trace=sendto,recvfrom -s1000 -p $(pgrep php)
Aby wyszukać określone rzeczy, spróbuj dodać np strace ... 2>&1 | grep -C5 UPDATE
. :
Jeśli masz naprawdę dużą bazę danych, a system działa poprawnie, gdy nie wykonujesz czyszczenia pamięci podręcznej, prawdopodobnie nie masz wystarczającej ilości pamięci, aby w pełni obsługiwać konfigurację.
Jeśli twoja strona działa na Linux-ie, uruchom „top” (ze swojej powłoki) i naciśnij Shift-M, aby posortować listę procesów według używanej pamięci. Następnie uruchom operację czyszczenia pamięci podręcznej z innego terminala. Powinieneś zobaczyć mysql i apache wznoszące się na górę listy. Zobaczysz, jaki procent całkowitej pamięci używa każdy z tych procesów i ile wolnej pamięci RAM jest używane. Jeśli masz dużo przestrzeni wirtualnej, ale cała fizyczna pamięć RAM jest wyczerpana, ta operacja może spowodować przeładowanie pamięci VM, co może skrócić czas wykonywania do niewielkiej części tego, co zwykle.
Kiedyś prowadziłem witrynę Drupal o średnim natężeniu ruchu na komputerze z / poza wystarczającą ilością pamięci do obsługi instalacji. Kiedy uruchomiłem czyszczenie pamięci podręcznej w niepowiązanej witrynie o niskim natężeniu ruchu, odbudowanie pamięci podręcznej spowodowało, że system przekroczył swój limit i wszystko zostało zablokowane. Dlatego ważne jest tutaj całkowite zachowanie systemu; dlatego proste narzędzia, takie jak „top”, są przydatne na początek.
Nie zgadzam się (nieco) z @ greg_1_anderson tutaj.
Jeśli system nie zawiesza się całkowicie podczas cc all
, nie sądzę, że masz ogólny problem z pamięcią. Kiedy na serwerze LAMP zabraknie pamięci, nastąpi zamiana. Aktywna zamiana trafień serwera spowoduje awarię. Procesy httpd zaczną się nakładać ze względu na spowolnienie systemu (swap powoduje, że system działa bardzo wolno), co spowoduje użycie większej liczby zamian itp. W witrynach, w których to widziałem, obciążenie procesu wynosi 100, i mnóstwo aktywnych procesów httpd.
Jeśli twój system w końcu wróci, myślę, że jesteś źle dostrojony. drush cc all
spowoduje dużo dostępu do bazy danych, więc myślę, że to pokazuje problem bardziej. Moją sugestią byłoby uruchomienie mysqltuner na stronie. Jeśli masz bazę danych o pojemności wielu GB, domyślam się, że nie masz innodb_buffer_pool_size
nawet odpowiedniego rozmiaru, a instancja MySQL jest niesamowita. Zbadałbym również alternatywne zaplecze pamięci podręcznej, aby spróbować zmniejszyć rozmiar bazy danych.
Może to być twoje środowisko hostingowe. Masz na myśli lokalną konfigurację, czy coś hostującego na hostingu współdzielonym lub VPS / serwerze?
max_execution_time
. Możesz jednak zrobić drush php-eval "print ini_get('max_execution_time');"
to dwukrotnie.
To nie jest kompletne rozwiązanie, tylko jedno narzędzie, które pomoże zidentyfikować źródło twoich opóźnień.
Oprócz używania top
do monitorowania procesów możesz znaleźć mytop
informacje. (Inne powyższe odpowiedzi zakładają, że MySQL, ale jeśli używasz innego zaplecza DB, musisz zamienić mytop na równoważne narzędzie).
mytop
po prostu wykonuje MySQL SHOW FULL PROCESSLIST
w pętli i pokazuje, które zapytania są wykonywane (co zajmuje dużo czasu). Jeśli czyszczenie pamięci podręcznej zajmuje dużo czasu, aby wyczyścić ten lub inny stół, zobaczysz dokładnie, co tu trzyma. Jeśli nie masz dostępu do instalacji mytop
, po prostu zrób surową wersję w swojej powłoce -
while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done
Jeśli opóźnienie nie wynika z zapytań MySQL, to narzędzie może to dla ciebie przynajmniej potwierdzić.
Znalazłem wpis na blogu zatytułowany Przyspieszenie czyszczenia pamięci podręcznej na Drupal 7, który był bardzo pomocny w zawężeniu tego, która część procesu czyszczenia pamięci podręcznej spowalniała proces. Problemy, które wskazuje w module funkcji i module interfejsu API encji, miały wpływ na moją witrynę, ale proces opisany w poście pomógł mi również wyśledzić problemy, które napotkaliśmy w module rdzenia Drupala i punktów przerwania .
Cały proces zajmuje trochę czasu, ale pomogło mi zredukować czyszczenie pamięci podręcznej z wielu minut do mniej niż minuty.