Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Doctrine, wydajność -> duże projekty, Czy mimo wysokiego zapotrzebowania na pamieć warto używać Doctrine?
Sajrox
post 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.
Go to the top of the page
+Quote Post
Zyx
post 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 smile.gif. 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 smile.gif. 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ć smile.gif.

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
Go to the top of the page
+Quote Post
Sajrox
post 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ś smile.gif 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 winksmiley.jpg ).

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ę questionmark.gif winksmiley.jpg
Go to the top of the page
+Quote Post
Zyx
post 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ą smile.gif.

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 smile.gif.
- 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 smile.gif).


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
murwazy
post 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%)
-----


Cytat(Sajrox @ 30.04.2009, 18:49:44 ) *
A z tego co wyczytałem Doctrine ma ich kilka ( do wyboru do koloru winksmiley.jpg ).

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
Go to the top of the page
+Quote Post
Sajrox
post 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 smile.gif

Robię to na localhoście jednak bez skutku sad.gif

Mój kod 

  1. <?php
  2. $servers = array(
  3.        'host' => 'localhost',
  4.        'port' => 11211,
  5.        'persistent' => true
  6.    );
  7.  
  8.    $cacheDriver = new Doctrine_Cache_Memcache(array(
  9.            'servers' => $servers,
  10.            'compression' => false
  11.        )
  12.    );
  13.  
  14.    $conn->setAttribute(Doctrine::ATTR_QUERY_CACHE, $cacheDriver);    
  15.    $conn->setAttribute(Doctrine::ATTR_RESULT_CACHE, $cacheDriver);
  16.    
  17.  
  18. $q = Doctrine_Query::create();
  19.    $q->from('Aktualnosci')->useResultCache(true);
  20.    $rows = $q->execute();    
  21. print_r($rows->toArray());
  22. ?>



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  smile.gif

Ten post edytował Sajrox 31.07.2009, 10:19:23
Go to the top of the page
+Quote Post
murwazy
post 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%)
-----


Cytat(Sajrox @ 31.07.2009, 11:11:40 ) *
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  smile.gif


w manualu masz wszystko...

  1. <?php
  2. $conn  = Doctrine_Manager::connection(new PDO('sqlite::result_cache.sq'), 'sqlite_cache_connection');
  3. $cacheDriver = new Doctrine_Cache_Db(array('connection' => $conn, 'tableName' => 'cache'));
  4. // za pierwszym razem odkomenuj te linie, trzeba stworzyc tabele
  5. //$cacheDriver->createTable();
  6.  
  7. $db = Doctrine_Manager::connection("mysql://user:pass@host/db", 'mysql');
  8. Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_RESULT_CACHE, $cacheDriver);
  9. Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, 3600);
  10. ?>


a pozniej juz uzywasz normalnie

  1. <?php
  2. $temp = Doctrine_Query::create()->from('Color c')->leftJoin('c.Translation t1 INDEXBY t1.lang')->where('c.id=?', $id)->setHydrationMode(Doctrine::HYDRATE_ARRAY)->useResultCache(true)->execute();
  3. ?>


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 smile.gif ):
http://www.doctrine-project.org/documentat...erview:profiler

  1. <?php
  2. $profiler = new Doctrine_Connection_Profiler();
  3. $db->setListener($profiler);
  4. ?>
Go to the top of the page
+Quote Post
mrok
post 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
  1. useResultCache(true)
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
  1. $oManager->setAttribute(Doctrine::ATTR_RESULT_CACHE, $oCacheDriver);

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
  1. public function useResultCache($driver = true, $timeToLive = null)
  2. {
  3. if ($driver !== null && $driver !== true && ! ($driver instanceOf Doctrine_Cache_Interface)) {
  4. $msg = 'First argument should be instance of Doctrine_Cache_Interface or null.';
  5. throw new Doctrine_Query_Exception($msg);
  6. }
  7. $this->_resultCache = $driver;
  8.  
  9. if ($timeToLive !== null) {
  10. $this->setResultCacheLifeSpan($timeToLive);
  11. }
  12. return $this;
  13. }


Kolejny natchniony pomysł
  1. $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, 0);

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
  1. useResultCache(true)
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 winksmiley.jpg))) sorrki za problem

Ten post edytował mrok 11.08.2009, 17:46:11


--------------------
Go to the top of the page
+Quote Post
Sajrox
post 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.

  1. $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, 10);
  2.  


Dodatkowo we wszystkich zapytaniach w skrypcie typu:
  1. $q = new Doctrine_Query();
  2. $q ->from('Tabela')
  3. ->where('id=?', 1);
  4.  
  5. $rows = $q->fetchArray();


Jest stosowane cache mimo tego że nie użyłem tutaj:
  1. $q ->setHydrationMode(Doctrine::HYDRATE_ARRAY)
  2. ->useResultCache(true);
  3.  
  4. $array = $q->execute();



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 sad.gif

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
Go to the top of the page
+Quote Post
mrok
post 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.



--------------------
Go to the top of the page
+Quote Post
Sajrox
post 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 ?
Go to the top of the page
+Quote Post
mrok
post 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 winksmiley.jpg


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.


--------------------
Go to the top of the page
+Quote Post
Sajrox
post 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 winksmiley.jpg Pół dnia i śmiga smile.gif

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
  1. useResultCache(true);
[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 smile.gif
Z tego co się dowiedziałem wersja 1.2 ma wprowadzić naprawdę ciekawe rozwiązania nie tylko pomocne w cachowaniu winksmiley.jpg

Ten post edytował Sajrox 13.08.2009, 18:08:42
Go to the top of the page
+Quote Post
murwazy
post 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%)
-----


Cytat(mrok @ 11.08.2009, 18:38:55 ) *
Wie ktoś może jak wyłączyć cache bez konieczności usuwania
  1. useResultCache(true)
z każdego DQL?


  1. //$cache_allowed = true;
  2. $cache_allowed = null;
  3. $query->useResultCache($cache_allowed);
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 6.06.2024 - 07:57