Witryna, którą zbudowałem z Kohana, została wczoraj zatłoczona ogromnym ruchem, co spowodowało, że cofnąłem się o krok i oceniłem część projektu. Jestem ciekawy, jakie są standardowe techniki optymalizacji aplikacji opartych na Kohanie?
Interesuje mnie też benchmarking. Czy muszę skonfigurować Benchmark::start()
i Benchmark::stop()
dla każdej metody kontrolera, aby zobaczyć czasy wykonywania dla wszystkich stron, czy też mogę zastosować testy porównawcze globalnie i szybko?
Będę częściej korzystał z biblioteki Cache w przyszłości, ale jestem otwarty na więcej sugestii, ponieważ jestem pewien, że mogę zrobić wiele, o których po prostu nie wiem.
php
optimization
performance
scalability
kohana
Sampson
źródło
źródło
Odpowiedzi:
To, co powiem w tej odpowiedzi, nie jest specyficzne dla Kohany i prawdopodobnie może dotyczyć wielu projektów PHP.
Oto kilka punktów, które przychodzą mi na myśl, kiedy mówię o wydajności, skalowalności, PHP ...
Wiele z tych pomysłów wykorzystałem podczas pracy nad kilkoma projektami - i pomogły; więc prawdopodobnie mogliby tu pomóc.
Przede wszystkim, jeśli chodzi o występy, jest wiele aspektów / pytań, które należy wziąć pod uwagę :
Korzystanie z odwrotnego serwera proxy
Pierwszą rzeczą, która może być naprawdę przydatna, jest użycie odwrotnego proxy , takiego jak varnish , przed serwerem sieciowym: niech buforuje jak najwięcej rzeczy , więc tylko żądania, które naprawdę wymagają obliczeń PHP / MySQL (i oczywiście kilka innych żądania, jeśli nie znajdują się w pamięci podręcznej serwera proxy), kierują je do Apache / PHP / MySQL.
O używaniu odwrotnego proxy jako pamięci podręcznej , dla aplikacji PHP, możesz na przykład spojrzeć na Wyniki testów porównawczych pokazujące wzrost możliwości serwera o 400% -700% dzięki APC i pamięci podręcznej Squid .
(Tak, używają Squid, a ja mówiłem o lakierze - to tylko kolejna możliwość ^^ Lakier jest nowszy, ale bardziej poświęcony buforowaniu)
Jeśli zrobisz to wystarczająco dobrze i uda ci się przestać ponownie generować zbyt wiele stron, być może nie będziesz musiał nawet optymalizować żadnego z kodu ;-)
A przynajmniej może nie w pośpiechu ... Zawsze lepiej jest przeprowadzać optymalizacje, gdy nie jesteś pod zbyt dużą presją ...
Na marginesie: mówisz w PO:
Jest to rodzaj nagłej sytuacji, w której odwrotne proxy może dosłownie uratować sytuację , jeśli Twoja witryna może poradzić sobie z nieaktualnością w ciągu sekundy:
O tym, jak mogę wykryć i przetrwać bycie „Slashdotted”? może być ciekawą lekturą.
Po stronie PHP:
Po pierwsze: czy używasz najnowszej wersji PHP ? Nowe wersje regularnie poprawiają prędkość ;-)
Na przykład spójrz na Benchmark PHP Branches 3.0 do 5.3-CVS .
Zwróć uwagę, że wydajność jest całkiem dobrym powodem, aby używać PHP 5.3 ( zrobiłem kilka testów porównawczych (po francusku) i wyniki są świetne) ...
Kolejnym całkiem dobrym powodem jest oczywiście to, że PHP 5.2 osiągnęło koniec życia i nie jest już konserwowane!
Czy używasz jakiejkolwiek pamięci podręcznej kodu operacyjnego?
[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
może być dobre dla obciążenia systemu; ale oznacza to, że modyfikacje dokonane w plikach PHP nie będą brane pod uwagę, chyba że opróżnisz całą pamięć podręczną opcode; o tym, aby uzyskać więcej informacji, zobacz na przykład To stat () Or Not To stat ()?Korzystanie z pamięci podręcznej danych
O ile to możliwe, lepiej unikać ciągłego robienia tego samego .
Główną rzeczą, o której myślę, są oczywiście zapytania SQL: wiele Twoich stron prawdopodobnie wykonuje te same zapytania, a wyniki niektórych z nich są prawdopodobnie prawie zawsze takie same ... Co oznacza wiele „bezużytecznych” zapytań do bazy danych, która musi poświęcać czas na ciągłe serwowanie tych samych danych.
Oczywiście dotyczy to innych rzeczy, takich jak połączenia z usługami internetowymi, pobieranie informacji z innych witryn internetowych, ciężkie obliczenia ...
Może być dla Ciebie bardzo interesujące zidentyfikowanie:
I przechowuj te dane / wyniki w jakiejś pamięci podręcznej, aby były łatwiejsze do uzyskania - szybciej - i nie musisz iść do serwera SQL po „nic”.
Świetne mechanizmy buforowania to między innymi:
Jestem prawie pewien, że twój framework zawiera pewne rzeczy związane z pamięcią podręczną; prawdopodobnie już to wiesz, jak powiedziałeś "Będę używał biblioteki pamięci podręcznej bardziej w przyszłości" w OP ;-)
Profilowy
Teraz fajnie byłoby użyć rozszerzenia Xdebug do profilowania aplikacji : często pozwala to dość łatwo znaleźć kilka słabych punktów - przynajmniej jeśli jest jakaś funkcja, która zajmuje dużo czasu.
Prawidłowo skonfigurowany wygeneruje pliki profilowe, które można przeanalizować za pomocą niektórych narzędzi graficznych, takich jak:
Na przykład, oto kilka zrzutów ekranu z KCacheGrind:
(źródło: pascal-martin.fr ) (źródło: pascal-martin.fr )
(Swoją drogą, callgraph przedstawiony na drugim zrzucie ekranu jest zwykle czymś, czego nie potrafi zrobić ani WinCacheGrind, ani Webgrind, jeśli dobrze pamiętam ^^)
(Dzięki @Mikushi za komentarz) Inną możliwością, z której nie korzystałem zbyt wiele, jest rozszerzenie xhprof : pomaga również w profilowaniu, może generować callgraph - ale jest lżejsze niż Xdebug, co oznacza, że powinieneś być w stanie go zainstalować serwer produkcyjny.
Powinieneś móc go używać poza XHGui , co pomoże w wizualizacji danych.
Po stronie SQL:
Skoro już trochę rozmawialiśmy o PHP, zauważ, że jest więcej niż możliwe, że wąskim gardłem nie jest strona PHP , ale baza danych ...
Co najmniej dwie lub trzy rzeczy, tutaj:
EXPLAIN
instrukcji, jeśli używasz MySQLlog_slow_queries
aby uzyskać listę żądań, które zajmują „zbyt dużo” czasu i na ich podstawie rozpocząć optymalizację.Mimo to dwie najważniejsze rzeczy to:
I co teraz?
Jeśli nadal czytasz, co jeszcze można zoptymalizować?
Cóż, wciąż jest miejsce na ulepszenia ... Oto kilka pomysłów na architekturę:
Cóż, może niektóre z tych pomysłów są trochę przesadzone w twojej sytuacji ^^
Ale nadal ... Dlaczego nie przestudiować ich trochę, na wszelki wypadek? ;-)
A co z Kohaną?
Twoje pierwsze pytanie dotyczyło optymalizacji aplikacji korzystającej z Kohana ... Cóż, opublikowałem kilka pomysłów, które są prawdziwe dla każdej aplikacji PHP ... Co oznacza, że są one również prawdziwe dla Kohany ;-)
(Nawet jeśli nie są dla niej specyficzne ^^)
Powiedziałem: użyj pamięci podręcznej; Wydaje się, że Kohana obsługuje trochę buforowania (sam o tym mówiłeś, więc nic nowego ...)
Jeśli jest coś, co można zrobić szybko, spróbuj ;-)
Powiedziałem też, że nie powinieneś robić niczego, co nie jest konieczne; czy jest coś włączonego domyślnie w Kohanie, czego nie potrzebujesz?
Przeglądając sieć, wydaje się, że jest przynajmniej coś o filtrowaniu XSS; potrzebujesz tego
Oto kilka linków, które mogą być przydatne:
Wniosek?
I na koniec prosta myśl:
Nie mówię, że nie powinieneś optymalizować: zdecydowanie powinieneś!
Ale zdecyduj się na „szybkie” optymalizacje, które najpierw dadzą Ci duże korzyści : użycie pamięci podręcznej kodu operacji może pomóc Ci zmniejszyć obciążenie procesora o 10 do 50 procent ... A konfiguracja zajmuje tylko kilka minut; - ) Z drugiej strony spędzanie 3 dni za 2 proc ...
Aha, i przy okazji: zanim cokolwiek zrobisz: umieść kilka rzeczy monitorujących na miejscu , abyś wiedział, jakie ulepszenia zostały wprowadzone i jak!
Bez monitorowania nie będziesz miał pojęcia o efekcie tego, co zrobiłeś ... Nawet jeśli jest to prawdziwa optymalizacja, czy nie!
Na przykład możesz użyć czegoś takiego jak RRDtool + kaktusy .
A pokazanie szefowi ładnej grafiki ze spadkiem obciążenia procesora o 40% jest zawsze świetne ;-)
W każdym razie, i naprawdę podsumowując: baw się dobrze!
(Tak, optymalizacja jest fajna!)
(Ech, nie sądziłem, żebym tak dużo pisał ... Mam nadzieję, że przynajmniej niektóre części są przydatne ... I powinienem pamiętać o tej odpowiedzi: może się przydać innym razem. ..)
źródło
Zastosowanie XDebug i WinCacheGrind lub WebCacheGrind do profilu i analizować powolne wykonanie kodu.
(źródło: jokke.dk )
źródło
Kod profilu z XDebug .
Używaj dużo pamięci podręcznej. Jeśli Twoje strony są względnie statyczne, najlepszym sposobem na to może być odwrotne proxy.
źródło
Kohana jest po wyjęciu z pudełka bardzo, bardzo szybko, z wyjątkiem użycia obiektów bazy danych. Cytując Zombor: „Możesz zmniejszyć zużycie pamięci, upewniając się, że używasz obiektu bazy danych zamiast tablic wyników”. To powoduje OGROMNĄ różnicę w wydajności witryny, która jest atakowana. Nie tylko zużywa więcej pamięci, ale także spowalnia wykonywanie skryptów.
Ponadto - musisz użyć buforowania. Wolę memcache i używam go w moich modelach w ten sposób:
public function get($e_id) { $event_data = $this->cache->get('event_get_'.$e_id.Kohana::config('config.site_domain')); if ($event_data === NULL) { $this->db_slave ->select('e_id,e_name') ->from('Events') ->where('e_id', $e_id); $result = $this->db_slave->get(); $event_data = ($result->count() ==1)? $result->current() : FALSE; $this->cache->set('event_get_'.$e_id.Kohana::config('config.site_domain'), $event_data, NULL, 300); // 5 minutes } return $event_data; }
To również znacznie zwiększy wydajność. Powyższe dwie techniki poprawiły wydajność witryn o 80%.
Jeśli podasz więcej informacji o tym, gdzie Twoim zdaniem znajduje się wąskie gardło, jestem pewien, że moglibyśmy podać lepsze pomysły.
Sprawdź również yslow (google it), aby uzyskać inne wskazówki dotyczące wydajności.
źródło
Ściśle związane z Kohaną (prawdopodobnie już to zrobiłeś lub nie):
W trybie produkcyjnym:
Tylko moje 2 centy :)
źródło
Całkowicie zgadzam się z XDebug i buforowaniem odpowiedzi. Nie zaglądaj do warstwy Kohana w celu optymalizacji, dopóki nie zidentyfikujesz największych wąskich gardeł w zakresie szybkości i skali.
XDebug powie Ci, gdzie spędzałeś najwięcej czasu i zidentyfikuje „punkty aktywne” w kodzie. Zachowaj te informacje profilowania, aby móc bazować i mierzyć ulepszenia wydajności.
Przykładowy problem i rozwiązanie: Jeśli zauważysz, że za każdym razem tworzysz drogie obiekty z bazy danych, które tak naprawdę nie zmieniają się często, możesz spojrzeć na buforowanie ich za pomocą memcached lub innego mechanizmu. Wszystkie te poprawki wydajności wymagają czasu i komplikują system, więc zanim zaczniesz je naprawiać, upewnij się, że występują wąskie gardła.
źródło