Doctrine, wydajność -> duże projekty, Czy mimo wysokiego zapotrzebowania na pamieć warto używać Doctrine? |
Doctrine, wydajność -> duże projekty, Czy mimo wysokiego zapotrzebowania na pamieć warto używać Doctrine? |
30.04.2009, 17:16:08
Post
#1
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 7 Dołączył: 9.10.2007 Skąd: Poznań Ostrzeżenie: (0%) |
Witam,
Od kilku dni szukam coś o Doctrine oraz zastosowania tej biblioteki w dużych projektach. Generalnie chodzi o to że Doctrine zużywa ponad 4 razy więcej pamięci niż użycie standardowych funkcji w php. Na co dzień używam swojej własnej biblioteki do obsługi bazy danych z wykorzystaniem PDO i średnio zużycie pamięci wynosi około 1400 kb. Po zainstalowaniu Doctrine zużycie pamięci przy jednym zapytaniu SELECT wzrosło do około 4500 kb. Co o tym sądzicie, jak może to wpłynąć na duży projekt z dużym ruchem. Niestety 3 krotne zwiększenie zużycie pamięci może szybko spowodować że serwer może nie wyrobić. Chciałbym się zapytać o wasze zdanie w tej sprawie, czy mimo tego Doctrone można śmiało używać w dużych projektach (także małych) bez zamartwiania się że serwer może nie dać rady ? Wydaje mi się że przy np 1000 użytkownikach mogą być już problemy gdyż 4500 kb x 1000 = ok 4 GB. Oczywiście wiem że można zastosować cachowanie, jednak tutaj chciałbym to wykluczyć i podyskutować o zastosowaniu Doctrone bez cache i innych dopalaczy. Ciągle się wacham aby na stałe zacząć używać tej biblioteki. |
|
|
30.04.2009, 17:32:16
Post
#2
|
|
Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) |
Na pewno szybciej przestanie wyrabiać, to nie ulega wątpliwości . Zawsze użycie bardziej wyspecjalizowanego narzędzia na wyższym poziomie abstrakcji pociąga za sobą spadek wydajności, to już my musimy rozstrzygnąć, co jesteśmy w stanie bardziej poświęcić. Samo użycie PHP to też kompromis, bo przecież możesz teoretycznie wszystko w C albo nawet assemblerze zaklepać, tylko musisz się wcześniej zastanowić, czy zdążysz to zrobić, zanim umrzesz . Oczywiście byłaby inna rozmowa, gdybyś miał dwie biblioteki robiące to samo, tyle że jedna bardziej, a druga mniej wydajnie.
Świat niestety jest brutalny - liczy się czas pracy programisty i ogarnięcie złożoności dużych projektów, w wielu przypadkach znacznie taniej jest po prostu w pewnym momencie kupić dodatkowy sprzęt, niż wydawać fortunę na trwające dłużej prace, pełną optymalizację itd. Jedną z form taniej, a skutecznej optymalizacji jest m.in. cache i naprawdę nie wiem, czego się tak przed nim bronisz; dobrze wykorzystany cache bywa skuteczniejszy nawet od czystego zapytania SQL, a skoro Doctrine ma odpowiednie narzędzia do jego realizacji, aż żal nie skorzystać. Podsumowując - nie ma uniwersalnej odpowiedzi na pytanie. Jeśli wydajność jest czynnikiem krytycznym, to sprawa jest prosta. Mój ostatni projekt realizuję właśnie z użyciem Doctrine, gdyż biorąc pod uwagę specyfikę zadania, byłoby bez niego baaaaaardzo ciężko. A że przy okazji bardzo fajnie współgra ona z OPT... cóż, żyć, nie umierać . PS. Za przeproszeniem, ale skąd Ci wyszły takie idiotyczne wyniki dotyczące zużycia pamięci? Co mają zasoby zużyte przez PHP i parser DQL-a do ilości użytkowników w bazie? Ten post edytował Zyx 30.04.2009, 17:33:08 -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
30.04.2009, 17:49:44
Post
#3
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 7 Dołączył: 9.10.2007 Skąd: Poznań Ostrzeżenie: (0%) |
Z tymi liczbami to brałem to na logikę, wydawało mi się że te 4500 kb pamięci przypada na jedną osobę która właśnie korzysta ze strony.
Pewnie się mylę więc proszę mnie poprawić. Oczywiście to czysto teoretyczne wyliczenia przy których 1000 użytkowników musiało by jednocześnie wejść na stronę. Co jest mało prawdopodobne ale nie zmienia to faktu że Doctrine mimo wszystko potrzebuje kilka krotnie więcej pamięci. Może 4500 kb to nie jest duże. Ale jeśli tak jak pisałem, strona ma bardzo duży ruch i czysto teoretycznie wejdzie nam w jednej chwili 1000 osób to już mamy problem. Co do Twojej wypowiedzi to bardzo ciekawie to określiłeś Pełen podziw tego jak to przedstawiłeś. W pracy programisty faktycznie ważniejszy jest czas pracy nad projektem a nie zużycie pamięci. Doszedłem do wniosku że mimo wszystko PHP z coraz to nowszą wersją poprawia kwestie wydajności oraz zużycia pamięci (przynajmniej tak wyczytałem z różnych źródeł), sprzęt na których stoją nasze strony jest coraz szybszy i wyposażony w większą ilość pamięci RAM. Dlatego tak jak piszesz nie ma sensu poświęcać dodatkowych tygodni lub miesiące nad tym aby oprogramowanie chodziło szybciej. Na szczęście system cache jest lekarstwem na te bolączki z wydajnością. A z tego co wyczytałem Doctrine ma ich kilka ( do wyboru do koloru ). Więc morał z tego jest taki że Doctrine dobrze wykorzystane z zastosowaniem systemu cache może skrócić nie tylko czas pracy nad apliacją www ale także przyspieszyć jej działanie w przeglądarce (co na początku przygody z Doctrine może się wydawać niemożliwe). Chyba mam rację |
|
|
1.05.2009, 19:15:42
Post
#4
|
|
Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) |
Może, ale nie we wszystkich przypadkach musi. Systemu cache nie da się zastosować we wszystkich miejscach, ale w ogólnym przypadku można tak powiedzieć. Temat wydajności to bardzo śliska; nie ma jednego, uniwersalnego czynnika, który da się mierzyć. Nawet w czystej algorytmice rozpatrujemy złożoność czasową i pamięciową, a w praktyce dochodzą do tego kwestie sprzętowe (szybkość łączy, ilość i rodzaj operacji dyskowych, system operacyjny, wybrana technologia)... ciężko to wszystko przekazać w paru postach czy artykułach. Z czasem programista sobie wyrabia intuicję, co też przekłada się na jakość kodu, ponieważ używane narzędzia trzeba jeszcze umieć używać z głową .
Jeszcze odnośnie wyliczeń związanych z ruchem. Jeśli PHP musi obsłużyć 1000 żądań w ciągu sekundy, to: - Albo ktoś Ci robi atak DoS i tutaj nie ma co kupować sprzętu, bo i tak w pewnym momencie nie wytrzyma, a należy inwestować w systemy wczesnego ostrzegania i obrony . - Albo Twoja strona obsługuje ruch rzędu x milionów wejść na podstrony dziennie. Nie znam pojedynczej maszyny, która byłaby w stanie tyle wytrzymać, a skoro już ktoś obsługuje taki potężny ruch, to na pewno ma pieniądze na zakup odpowiednich serwerów, ich utrzymania itd. (serwer serwisu nasza-klasa jest notowany na liście 500 najszybszych komputerów świata ). -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
12.05.2009, 10:52:19
Post
#5
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 5 Dołączył: 13.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) |
A z tego co wyczytałem Doctrine ma ich kilka ( do wyboru do koloru ). Owszem ale sporo zalezy od serwera, nie wszedzie jest memcache a raczej nie ma go nigdzie, apc to samo, w praktyce sqlite sie sprawdza bardzo fajnie z tym ze w najnowszej dostepnej wersji jest skopana wersja cache na sqlite, poprawiona jest na svnie i czeka na wyjscie. osobiscie zglaszalem ticket i uwzglednili moje poprawki. sam uzywam poprawionej wersji i dziala super. to czego brak to etykiety czy tez tagi - nie mozesz skasowac tylko czesci cache, albo jeden rekord (po id ktorego nie znasz:)) albo calosc. to jest rowniez zgloszone i czeka na wdrozenie w nowszej wersji. ew jak mi tego zabraknie w jakims projekcie to dopisze to dla sqlite;) tak czy owak nie zastanawiaj sie nad uzyciem doctrine - polecam. bardzo ulatwia zapanowanie nad projektem, pracuje z ta biblioteka ponad 1.5 roku jak ostatnio policzylem, od bardzo wczesnej wersji. nie wyobrazam sobie innego pisania. nastaw sie na to, ze wydajnosc troche spadnie ale od tego jest cache doctrine, cache frameworka i cache browsera. w newralgicznych momentach po prostu uzywalem czystego sqla razem z pdo, wyciagalem to co chcialem, keszowalem i w razie potrzeby uzywalem opakowane w obiekty doctrine tam gdzie bylo to potrzebne. na razie zdarzylo sie to moze 2 razy. w wiekszosci przypadkow nie bedziesz mial problemow, tylko raz przepisywalem serwis bo serwer sobie nie radzil - przepisalem tez na doctrine bo winna byla struktura - z musu byla to kopia rozwiazania jakiegos badziewnego programu dla biur nieruchomosci. po przemysleniu i napisaniu od nowa dziala szybko do dzisiaj. aha, nie polecam serwerow home.pl - sa juz zdecydowanie za wolne pytaj jesli czegos nie bedziesz wiedzial pozdro Cytat poprawiona jest na svnie i czeka na wyjscie wyszly nowe wersje Ten post edytował murwazy 12.05.2009, 10:51:46 |
|
|
31.07.2009, 10:11:40
Post
#6
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 7 Dołączył: 9.10.2007 Skąd: Poznań Ostrzeżenie: (0%) |
Wracając do tematu to od wczoraj próbuję uruchomić memcache w projekcie używającego Doctrine. Myslę że czas najwyższy pomyśleć o cache
Robię to na localhoście jednak bez skutku Mój kod
Wywala błąd: Notice: Memcache::get() [memcache.get]:Server localhost (tcp 11211) failed with: Próba połšczenia nie powiodłasię, ponieważ połšczona strona nie odpowiedziała poprawnie po ustalonymokresie czasu lub utworzone połšczenie nie powiodło się, ponieważpołšczony host nie odpowiedział. (10060) in C:\wamp\www\FRAMEWORK 7\Lib\Doctrine\Cache\Memcache.php on line 83 Dodam że błąd raz jest raz go nie ma. Na localu właczyłem obsługę memcache bez skutku. Chciałbym też zapytać się czy jest jakaś mozliwość sprawdzenia cze memcahce działa poprawnie czy wyniki faktycznie są pobierane z cache. Ewentualnie gdyby ktoś miłą inny system cache do zaproponowania to czekam na sugestie np. jak korzystać z SqLite cache. Może jakiś przykład kodu ? Na pewno się przyda Ten post edytował Sajrox 31.07.2009, 10:19:23 |
|
|
6.08.2009, 10:41:15
Post
#7
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 5 Dołączył: 13.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) |
Ewentualnie gdyby ktoś miłą inny system cache do zaproponowania to czekam na sugestie np. jak korzystać z SqLite cache. Może jakiś przykład kodu ? Na pewno się przyda w manualu masz wszystko...
a pozniej juz uzywasz normalnie
wazne zeby uzywac Doctrine::HYDRATE_ARRAY z danymi, ktore keszujesz, obiektow nie mozesz keszowac (tracisz relacje) profilerem sprawdzisz skad ida dane (z ktorej bazy bo profiler mozesz podlaczyc tez do sqlite ): http://www.doctrine-project.org/documentat...erview:profiler
|
|
|
11.08.2009, 17:38:55
Post
#8
|
|
Grupa: Zarejestrowani Postów: 258 Pomógł: 17 Dołączył: 22.05.2007 Ostrzeżenie: (0%) |
Udało sie komuś wyłączyć cache??
W większości lini z DQL dopisałem sobie przed execute() lub fatchOne(). Korzystam z Sqlite Odpaliłem kilka razy to co napisałem (a sporo tego było) i zanotowałem czas wykonania. Chciałem wyłączyc cache zeby porównać i ocenić jakie dał korzyści. Myślałem że wystarczy samo zakomentowanie linii
i tu zonk - w wszystkich liniach DQL pozostało useResultCache(true) co skutkuje wyjątkiem Cytat Doctrine_Exception: Result Cache driver not initialized kolejny znakomity pomysł useResultCache(true)->useResultCache(false) i kolejna porazka, w doctrine dopuszczalne jest tylko true lub cos implementujące Doctrine_Cache_Interface
Kolejny natchniony pomysł
fajnie cache nie działa, ale do bazy sa zapisywane dane (czyli takie testy sa na nic). Wie ktoś może jak wyłączyć cache bez konieczności usuwania z każdego DQL? //EDIT jak ktoś wie jak wyłaczyć cache to proszę o info, a ja mogę przeciez wykomentowac odpowiednie linie w samym doctrine i robic sobie testy ))) sorrki za problem Ten post edytował mrok 11.08.2009, 17:46:11 -------------------- |
|
|
11.08.2009, 22:29:13
Post
#9
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 7 Dołączył: 9.10.2007 Skąd: Poznań Ostrzeżenie: (0%) |
murwazy dzięki wielkie. Właśnie o to mi chodziło. Już kilka dni nad tym stercze i po prostu źle zrozumiałem dokumentację.
Mam tylko jeden problem. Po użyciu cache mimo upłynięcia czasu dalej pobiera z cache: Nawet po kilkunastu minutach ciągle widzę wersję pobraną z cache.
Dodatkowo we wszystkich zapytaniach w skrypcie typu:
Jest stosowane cache mimo tego że nie użyłem tutaj:
Chciałbym aby cache było używane tylko tam gdzie zastosuję kod podany wyżej oraz czas podany w "Doctrine::ATTR_RESULT_CACHE_LIFESPAN" był brany pod uwagę. Niestety dokumentacja za dużo tutaj nie wnosi edit ------- Zauwazyłem że w bazie w polu "expire" zamiast normalnego czasu mam: 0000-00-00 00:00:00 Ten post edytował Sajrox 11.08.2009, 22:59:30 |
|
|
12.08.2009, 10:54:21
Post
#10
|
|
Grupa: Zarejestrowani Postów: 258 Pomógł: 17 Dołączył: 22.05.2007 Ostrzeżenie: (0%) |
Sajrox - spróbuj mozę jakims debugerem krok po kroku prześledzić co się dzieje to dojdziesz dlaczego masz zera jako daty.
A teraz pytanie filozoficzne - jaki jest sens robienia cachu na Sqlite? (zakładam że hosting jest współdzielony). W przypadku wielu użytkowników właśnie Sqlite stanie się wąskim gardłem ponieważ głowicę na talerz(dysku) masz tylko jedną, i wiele rządań dostępu zostanie skolejkowanych zamiast być obsłużonym rownoczesnie. -------------------- |
|
|
12.08.2009, 16:22:05
Post
#11
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 7 Dołączył: 9.10.2007 Skąd: Poznań Ostrzeżenie: (0%) |
Niestety xdebugera nie mogę zainstalować wieć nici ze śledzenia krok po kroku.
Ale problem nie stoi z datami bo gdy ręcznie w bazie ustawie datę np. 3 dni wstecz to dalej Doctrine pobiera cały czas z cache mimo że czas ustawie na kilka sekund. Po dodaniu do cache nawet gdy odświeże stronę po kilku godzinach to wyniku otrzymuje z cache które zostałt ręcznie zmienione w bazie i powinny się odświezyć. Jak rozwiązać ten problem i zacząć normalnie używać cache w doctrine ? |
|
|
12.08.2009, 22:14:33
Post
#12
|
|
Grupa: Zarejestrowani Postów: 258 Pomógł: 17 Dołączył: 22.05.2007 Ostrzeżenie: (0%) |
Cytat Niestety xdebugera nie mogę zainstalować wieć nici ze śledzenia krok po kroku. Pierwszy raz jakoś boli (mi zeszło z nim pół dnia) - ale teraz nie wyobrażam sobie zycia bez niego Cytat Jak rozwiązać ten problem i zacząć normalnie używać cache w doctrine ? A czy masz najnowsza wersje Doctrine? Do poprzednich były zgłaszane jakieś tickety zwiazane z czasem cachowania. Jak i to nie pomoze to zglos im buga. -------------------- |
|
|
13.08.2009, 16:40:55
Post
#13
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 7 Dołączył: 9.10.2007 Skąd: Poznań Ostrzeżenie: (0%) |
xDebug uruchomiony Pół dnia i śmiga
A co do Doctrine to mam najnowszą wersje. Wykonałem wszystko według wskazówek, za dużo to ich nie było. I właśnie są problemy z czasami. Po za tym cachuje mi każde zapytanie, nawet te w których nie użyję: [PHP] pobierz, plaintext
Dziwna sprawa, oby w wersji 2.0 to naprawili i uzupełnili dokumentację. Co do zgłoszenia do buga to nie znam angielskiego, a po rusku nie będę im pisał :/ EDIT: ------ Cache już działa, nie zauważyłem że w tym projekcie którym testowałem cache miałem starszą wersję Doctrine. Po aktualizacji plików do wersji 1.1.2 wszystko ładnie śmiga Z tego co się dowiedziałem wersja 1.2 ma wprowadzić naprawdę ciekawe rozwiązania nie tylko pomocne w cachowaniu Ten post edytował Sajrox 13.08.2009, 18:08:42 |
|
|
17.08.2009, 11:13:09
Post
#14
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 5 Dołączył: 13.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) |
Wie ktoś może jak wyłączyć cache bez konieczności usuwania z każdego DQL?
|
|
|
Wersja Lo-Fi | Aktualny czas: 6.06.2024 - 07:57 |