Nu aveti permisiuni pentru a descarca fisierul grader_test6.in
Diferente pentru planificare/camp-alcatraz intre reviziile #26 si #31
Nu exista diferente intre titluri.
Diferente intre continut:
h3. Ziua 1 (2008-11-15)
* Workflow and tools: 'Trac':http://hackers.devnet.ro and 'Review Board':http://reviewboard.infoarena.ro * Explicat 'MVC':http://en.wikipedia.org/wiki/Model-view-controller si 'unit testing':http://en.wikipedia.org/wiki/Unit_testing * Toata lumea face 'setup':http://hackers.devnet.ro/wiki/HackingTutorial la infoarena * Citim si actualizam 'wiki-ul':http://hackers.devnet.ro/wiki
* Workflow and tools: 'Trac':http://hackers.devnet.ro and 'Review Board':http://reviewboard.infoarena.ro ✓ * Explicat 'MVC':http://en.wikipedia.org/wiki/Model-view-controller si 'unit testing':http://en.wikipedia.org/wiki/Unit_testing ✓ * Toata lumea face 'setup':http://hackers.devnet.ro/wiki/HackingTutorial la infoarena ✓ * Citim si actualizam 'wiki-ul':http://hackers.devnet.ro/wiki ✓
* Rulat 'YSlow!':http://developer.yahoo.com/yslow/ si citit tutoriale ('1':http://developer.yahoo.com/performance/rules.html, '2':http://www.thinkvitamin.com/features/webapps/serving-javascript-fast)
* Reorganizat 'tichete':http://hackers.devnet.ro/report/3 pentru 2.2
* Reorganizat 'tichete':http://hackers.devnet.ro/report/3 pentru 2.2 ✓
** 'Notite la tichete':camp-alcatraz/tichete-2.2
* Lucram la identificarea bottleneck-urilor si rezolvarea lor ('benchmarks':http://hackers.devnet.ro/wiki/Benchmarks) * Backup script
* Lucram la identificarea bottleneck-urilor si rezolvarea lor ('benchmarks':http://hackers.devnet.ro/wiki/Benchmarks) ✓ * Backup script ✓
h3. Ziua 2 (2008-11-16) * Raport despre imbunatatirile de performanta
* Implementam alte feature-uri * Stabilim data si obiectivele pentru urmatorul Coding Camp
* Implementam alte feature-uri ✓ * Stabilim data si obiectivele pentru urmatorul Coding Camp ✓
* Feedback h2. To Do
* -Luat stampila de la Sergiu- * -Mers la banca sa punem bani pe card- * -'Code review':http://reviewboard.infoarena.ro la toate change-urile de pana acum-
* svn up pe live
* -svn up pe live-
h2. Performanta site-ului (Cristian: las mai jos niste notite despre cum ar putea fi imbunatatita performanta site-ului. Nu sunt informatii 100% verificate, luati-le ca puncte de plecare in investigatiile pe care le faceti.)
h3. Benchmarks Folositi ./scripts/benchmark pentru masuratori. Cel mai probabil trebuie imbunatatit putin. (Nu face decat sa ruleze apache-benchmark pe o serie de URL-uri.) Experimentati cu flag-ul -c pentru request-uri concurente. Benchmark-urile trebuie interpretate cu atentie. Configuratia live este diferita de cea pentru development.
h3. MySQL MySQL, asa cum il folosim noi, este suspectul principal. De fiecare data cand site-ul nu raspunde si am putut sa ma uit la lista de procese MySQL era in top. Chiar si cand site-ul este responsive si fara trafic semnificativ, MySQL consuma constant CPU. Spre exemplu, acum e 5 dimineata in Romania, site-ul este responsive, iar primele doua procese arata asa:
<pre style="line-height: 1em">
==code(c)|
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1179 mysql 15 0 175m 44m 3072 S 84 4.3 60370:09 mysqld 19234 apache 17 0 75336 24m 10m S 8 2.4 0:03.17 httpd
</pre>
==
Unele query-uri sunt prea incete. In /var/lib/mysql/infoarena-slow.log gasiti un slow-queries log facut de MySQL. (Are 1.4GB!) Log-ul trebuie interpretat cu atentie deoarece unele query-uri incete pot declansa o cascada de alte query-uri incete. Un query care in mod obisnuit este foarte rapid poate sa se blocheze asteptand un alt query sa termine; ambele query-uri ajung in infoarena-slow.log.
h3. Caching
Daca trebuie, putem sa bagam in cache intreg tabelul de utilizatori, probleme, runde, si poate altele. Asta ar optimiza semnificativ unele query-uri. Spre exemplu, in monitorul de evaluare nu ar mai trebui sa facem JOIN la tabelele de task-uri, runde, si utilizatori pentru a afisa titluri si nume. SELECT-am doar id-urisi restul informatiilele scoatem din cache.
Daca trebuie, putem sa bagam in cache intreg tabelul de utilizatori, probleme, runde, si poate altele. Asta ar optimiza semnificativ unele query-uri. Spre exemplu, in monitorul de evaluare nu ar mai trebui sa facem JOIN la tabelele de task-uri, runde, si utilizatori pentru a afisa titluri si nume. SELECT-am doar id-uri iar restul informatiilor le scoatem din cache.
Caching-ul poate sa rezolve multe probleme de performanta insa are dezavantaje importante: * Complica codul. Cand actualizezi X in baza de date trebuie sa invalidezi X din cache impreuna cu toate informatiile care au fost calculate pe baza lui X.
* Serializarea si deserializarea nu sunt operatii teribil de rapide. Nucredcaeeficient sa faci 'apc_fetch':http://www.php.net/manual/en/ref.apc.php la un array cu intreaga lista de utilizatori. Cache-ul trebuie spart pe bucatele mici. E rapid sa faci fetch la un element insa probabil nu-ti permiti sa iterezi prin multe elemente.
* Serializarea si deserializarea nu sunt operatii teribil de rapide. Nu e eficient sa faci 'apc_fetch':http://www.php.net/manual/en/ref.apc.php la un array cu intreaga lista de utilizatori. Cache-ul trebuie spart pe bucatele mici. E rapid sa faci fetch la un element insa probabil nu-ti permiti sa iterezi prin multe elemente.
h3. Directoare mari si plate
Am observat ca pesistemulde fisiere de pe live (ext3), timpul de acces la un fisier oarecare dintr-un director variaza foarte mult in functie de numarul total de fisiere din acel director.
Am observat ca pe live (FS ext3), timpul de acces la un fisier oarecare dintr-un director variaza foarte mult in functie de numarul total de fisiere din acel director.
<pre style="line-height: 1em;overflow: auto">
==code(c)|
# echo -n ~infoarena/live/{cache,attach,www,www/views} /var/lib/php/session /tmp /usr/bin /usr/lib | xargs -d" " -IX echo ' echo -e `find X -type f -maxdepth 1 | wc -l` "\t" `~infoarena/live/scripts/fs-benchmark X` "\t" X ' | bash 39114 1.7286 /home/infoarena/live/cache
348 0.0028 /tmp 1194 0.1031 /usr/bin 309 0.3081 /usr/lib
</pre>
==
Prima coloana reprezinta numarul de fisiere dintr-un director, a doua reprezinta timpul de acces (fopen + fread 2KB) la 100 de fisiere alese aleator din acel director. Script-ul fs-benchmark il gasiti pe live. Eu doar am observat ca timpul de acces variaza semnificativ insa _nu stiu daca si cum ne afecteaza pe noi_. Incarcarea unei pagini de 'clasament':clasament-arhiva fara cache in browser poate sa genereze usor 50 de request-uri HTTP. Daca la fiecare request accesam un fisier de sesiune (din /var/lib/php/session) si inca un fisier din cache sau din attach, ajungem la 100 de accesari de fisiere.
Probabil ca din acelasi motiv,'MediaWiki stocheaza fisiere de cache in directoare "stufoase."':http://www.mediawiki.org/wiki/Manual:File_cache
Probabil ca din acelasi motiv 'MediaWiki stocheaza fisiere de cache in directoare "stufoase."':http://www.mediawiki.org/wiki/Manual:File_cache
h3. Sesiuni in memorie
infoarena foloseste momentan sistemul de sesiuni implicit configurat in PHP, adica multe fisiere (~100k) in /var/lib/php/session. Sistemul de sesiuni din PHP suporta customizarea backend-ului de stocare. Se poate cupla usor APC. Dezavantaj: cand restartam Apache pe livese pierd toate sesiunile.
infoarena foloseste momentan sistemul de sesiuni implicit configurat in PHP, adica multe fisiere (~100k) in /var/lib/php/session. Sistemul de sesiuni din PHP suporta customizarea backend-ului de stocare. Se poate cupla usor APC. Dezavantaj: cand repornim Apache pierdem toate sesiunile.
(Nota: Nu avem nevoie inca de memcached pentru ca nu folosim decat un singur server.)
(:P Nota pentru Mircea: Nu ne trebuie memached, avem un singur server.)