- Tagi
- hosting (3)
- shell (3)
- serwery (2)
- webmaster (2)
- porady (2)
- linux (2)
- unix (2)
- prywatne (1)
- blog (1)
- optymalizacja (1)
- android (1)
- recenzja (1)
- narzędzia (1)
- Menu główne
- Newsy
- Forum
- Hackme 1.0
- Hackme 2.0
- Hackme 3.0
- HackmeMove

- Audiobooki
- Videoarty
- Błedy w PHP
- Linux
- Kurs PHP
- Kurs MySQL
- Kurs Smarty

- JavaScript
- HTML5

- ReverseCraft
- Assembler
- Delphi
- Pozostale
- Materiały
- Artykuły
- Security
- Linux
- Software
- Protokoły
- Pokaż wszystkie
- Nasze projekty
- UW-Shell
- Multi Koder
- Zadania z MySQL
- BlipCounter
- UW-Blog
- Muzeum FAQ
- JSCms
- GG dekoder
- Tester nickow
Jak przetrwać wykop efekt?
Tagi: hosting, optymalizacja, webmaster
Wykop.pl będący polskim odpowiednikiem anglojęzycznego serwisu digg.com, stał się jednym z najpopularniejszych serwisów Web 2.0 w Polsce. Gromadzi on linki dodawane przez swoich użytkowników, umożliwiając im głosowanie na nie. Dodane witryny, które przekroczą pewien próg punktowy, dostają się na stronę główną serwisu – tak w ogromnym uproszczeniu działa Wykop.pl.
Celem właścicieli stron internetowych jest zwykle maksymalizacja ilości unikalnych użytkowników odwiedzających ich serwis. Cel ten ułatwia właśnie dostanie się na stronę główną wykopu.
Wielkie rozczarowanie
W momencie gdy Twój serwis zdobędzie ilość głosów która zakwalifikuje go do publikacji na stronie głównej wykop.pl, Twoje statystyki odnotują ogromny skok oglądalności. Jest to dokładnie to, co zapewne chciałeś osiągnąć. Niestety bardzo szybko możesz doświadczyć zjawiska zwanego “Wykop efekt”.
Czym jest “Wykop efekt”?
Najprościej mówiąc, jest to zablokowanie dostępu do strony internetowej na skutek zbyt dużej ilości odwiedzających ją osób. W przypadku wejść z wykopu, Twój serwis może spodziewać się od kilku do kilkudziesięciu tysięcy wejść dziennie, co może spowodować:
- przeciążenie bazy danych MySQL
- zużycie transferu na hostingu współdzielonym
- przekroczenie limitu obciążenia procesora na wirtualnych hostingach
Na temat serwerów wirtualnych możesz poczytać więcej w innym wpisie.
Najczęstszym następstwem wykopowego efektu jest wyłączenie hostowanej strony przez administratora hostingu, lub pojawienie się komunikatu o przekroczonej ilości odwołań do bazy danych, lub o przekroczonym transferze konta.
Co muszę zoptymalizować?
Postaram się wypunktować Ci najważniejsze elementy na które musisz zwrócić uwagę projektując serwis dla dużego ruchu przychodzącego.
Musisz zadbać o:
- optymalne zapytania mysql
- możliwie krótki czas wykonywania skryptów PHP
- zminimalizowanie ilości zapytań do serwera
- optymalizacja rozmiarów elementów na stronie WWW
Zacznijmy więc optymalizację
Baza MySQL – podstawy optymalizacji
Najczęściej spotykanym błędem spotykanym w rozwiązaniach autorskich (choć nie tylko) są nieoptymalne zapytania wysyłane do bazy.
Oto lista zasad, których powinieneś się trzymać:
- Twórz indeksy na polach po których wyszukujesz lub grupujesz dane (nie na tych, które wyciągasz – to nic nie daje!)
- Stosuj poprawne indeksy – jeśli wartość jest unikalna, użyj indeksu UNIQUE
- Pamiętaj, że zakładanie indeksów na pola, spowalnia proces dodawania nowych rekordów. Setka indeksów w tabeli z której wyciągasz dane jedynie po ID, spowoduje więcej złego niż dobrego.
- Przechowując dane o stałych rozmiarach, takie jak np. hash md5, stosuj pola o ustalonej na sztywno długości. Czyli dla md5 będzie to char(32) a nie varchar(32)
- Trzymaj w cache zapytania wykonujące się przez ponad sekundę, oraz te, które nie wymagają stale aktualizowanych danych. W praktyce jednak… wrzucaj do cache co się da
- Staraj się unikać losowania danych z dużych tabel za pomocą funkcji rand(). O wiele lepiej jest pobrać ilość wszystkich rekordów, wylosować liczbę z przedziału 1-N w PHP i pobrać ten konkretny rekord.
- Jeśli to tylko możliwe, wyciągaj dane z bazy na podstawie pól numerycznych, a nie tekstowych.
Z głową w chmurach
Analizując kilka serwisów internetowych moich znajomych, doszedłem do wniosku, że około 60% całej “wagi” tych serwisów znajduje się w sekcji HEAD. Są tam najczęściej umieszczone zewnętrzne skrypty języka JavaScript i arkusze CSS. Całość ma przeważnie kilkadziesiąt kilobajtów. Nie jest to niby dużo, jednak zapoznaj się z artykułem na temat serwerów wirtualnych, w którym przedstawiam jak te kilkadziesiąt kilobajtów może wpłynąć na cały serwis internetowy.
Zauważyłem, że niemal każdy z analizowanych przeze mnie serwisów korzystał z biblioteki jQuery, a kilka z nich także z pluginu jQueryUI. Obie te biblioteki razem zajmują przeważnie od kilkudziesięciu do nawet 200 kilobajtów. Dlaczego więc nie poprosić kogoś, aby hostował je za nas?
Tym dobrym “kimś” może być “wujek Google”. Możliwe, że niewiele osób o tym wie, ale Google udostępnia na swoim CDN (Content Distribution Network) zarówno biblioteki jQuery i jQueryUI, jak i wszystkie domyślne 24 skórki dla tej drugiej biblioteki (zarówno CSS jak i grafiki).
Chcąc korzystać z tych bibliotek w wersji hostowanej przez chmury Googla, wystarczy zaincludować następujące dwa pliki JS (Google hostuje także inne, nowsze wersje):
http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js
Link do domyślnego stylu CSS dla jQuery UI:
http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/start/jquery-ui.css
Pytaj wolniej, bo nie odpowiem…
Każdy serwer internetowy ma ograniczoną wytrzymałość jeśli chodzi o ilość wysyłanych do niego zapytań o pliki. Jest to spowodowane zarówno ograniczeniami pamięciowymi, jak i czasem procesora potrzebnym do obsłużenia tych zapytań.
Wyobraź sobie, że Twoja strona po dostaniu się na Wykop.pl przyjmuje średnio 100 osób na minutę, czyli prawie dwie osoby na sekundę.
Nie oznacza to, że Twój serwer w ciągu sekundy obsługuje dwa zapytania. Musisz pamiętać, że serwis WWW składa się nie tylko z kodu HTML, ale także grafik, plików CSS, JS itp.
Spotkałem się z serwisami, które podczas ładowania pojedynczej podstrony, odwoływały się do ponad 50 plików zewnętrznych. Załóżmy jednak, że taką przyzwoitą normą jest 20 odwołań. Oznacza to, że Twoich dwóch czytelników stara się wykonać około 40 zapytań (pomińmy istnienie limitu requestów zawartego w przeglądarce) do serwera WWW na sekundę. To naprawdę dużo.
Aby zmniejszyć ilość zapytań do Twojego serwera, zastosuj następujące porady:
- Korzystaj z publicznie hostowanych bibliotek JavaScript (Google CDN jest tutaj dobrym pomysłem)
- Zacznij wykorzystywać CSS Sprites w swoim serwisie, czyli zamiast setki małych obrazków, zastosuj jeden ogromny, z którego przy użyciu arkuszy CSS będziesz wycinał potrzebne Ci fragmenty.
- Scal kilka plików CSS w jeden. Wiem, że zapewne podzieliłeś je na kawałki ze względu na porządek w kodzie, jednak includowanie kilku lub kilkunastu plików CSS nie jest dobrym pomysłem. Możesz je scalić w jeden kawałek nawet za pomocą prostego skryptu PHP – tak aby na dysku nadal był porządek.
- Podobnie jak pliki CSS, tak i JavaScript scal w jeden wielki plik. Ilość odwołań znacznie zmaleje.
Z własnego doświadczenia wiem, że najlepsze efekty osiąga się, stosując poradę związaną z zastosowaniem CSS Sprites. Jeśli sam nie umiesz lub nie chcesz przygotowywać odpowiednich grafik do tego celu, może to zrobić za Ciebie serwis spriteme.org.
Dobry kolega przejmie część uderzenia na siebie…
W Internecie istnieje bardzo wiele darmowych hostingów, oferujących potencjalnie nieograniczony transfer. Możesz wykorzystać ten fakt do hostowania tam np. zdjęć wrzucanych na Twojego bloga. W ten sposób pewną część mocy “uderzenia ludzi z wykopu” przejmie inny serwer, a Ty oberwiesz z połową mocy
W praktyce jednak pamiętaj, że Twoje darmowe konto może zostać po prostu zablokowane za przeciążanie systemu. Z tego powodu ja do tego typu działań wykorzystuję Dreamhosta, który nie limituje pojemności konta jak i transferu. Muszę powiedzieć, że nie jest to kolejna ściema typu “nieograniczony transfer pod warunkiem, że nie przekroczysz X giga”. Miesięcznie zużywam tam setki gigabajtów transferu i jak dotąd wszystko działa idealnie.
Zapamiętaj, aby nigdy nie stosować darmowych hostingów zdjęć do tego typu “outsourcowania” zawartości. Mają one bardzo niewielkie limity transferu przypadające na zdjęcie, więc szybko zobaczysz komunikat o przekroczeniu tego limitu.
Co jest lepsze od własnej domeny? kilka domen!
Przeglądarki internetowe mają wbudowany w sobie mechanizm limitujący ilość jednoczesnych zapytań jakie mogą wysłać do serwera. Często jest to ilość ustawiona na 8 lub 16 jednoczesnych połączeń. Oznacza to, że chcąc pobrać stronę mającą np. 30 obrazów, przeglądarka musi to zrobić w dwóch lub czterech “paczkach”. Pobierając pierwszą paczkę danych (np. 8 zapytań), pozostałe pliki czekają w kolejce.
W praktyce łącze użytkownika nie jest zwykle zapchane aż tak bardzo, aby nie był on w stanie przyjąć jednocześnie np. 20 połączeń. Można naturalnie zmienić konfigurację przeglądarki, aby zaciągała więcej danych za jednym razem, ale przecież nie zrobisz tego u swojego czytelnika
Należy się zastanowić, skąd przeglądarka wie, że pobiera dane z jednego serwera. Oczywiście rozpoznaje to na podstawie domeny. Możemy więc powiedzieć, że tak naprawdę, limit requestów przypada tutaj na domenę, a nie na faktyczny serwer.
Idąc dalej tym tokiem rozumowania, dojdziemy do wniosku, że chcąc zwiększyć ilość jednocześnie pobieranych przez użytkownika plików, wystarczy zaciągać te dane z kilku różnych domen.
Oczywiście nie będę Cię teraz namawiał do kupienia np. 10 domen, które po roku będziesz musiał przedłużyć. W tym przypadku w pełni wystarczy Ci jedna domena z kilkoma subdomenami, które przeglądarka także traktuje jako oddzielne serwery.
Zwróć uwagę na to, jak ten problem rozwiązałem na UW-Team.org. Część danych ładuję bezpośrednio z domeny serwisu, a część z subdomeny cdn.uwteam.org. Zastosowanie dwóch domen sprawia, że użytkownik pobiera jednocześnie nie 8 czy 16 plików, lecz 16 lub 32, co potencjalnie powinno skrócić czas ładowania strony o połowę.
Napisałem “potencjalnie”, ponieważ w praktyce tracony jest jeszcze czas na obsługę tych zapytań, oraz na znalezienie tej dodatkowej domeny (resolving DNS). Pomimo marnowania czasu na szukanie dodatkowej domeny, warto wiedzieć, że domena raz znaleziona jest już w przetrzymywana w cache przeglądarki, więc każda kolejna podstrona odwołująca się do niej, działać już będzie znacznie szybciej.
Wordpressie – oszczędź mój serwer!
Obecnie najpopularniejszym skryptem blogowym jest Wordpress. Niestety nie jest to skrypt optymalny i przystosowany do dużej oglądalności serwisu.
Średnio wywołanie jednej podstrony bloga działającego pod kontrolą systemu Wordpress powoduje wykonanie od kilku do kilkunastu zapytań do bazy danych – wszystko zależy od ilości zainstalowanych pluginów.
Taka ilość zapytań przy dostatecznie dużej ilości unikalnych odwiedzin w serwisie, może skutecznie zapchać każdy serwer.
Na szczęście w przypadku tego skryptu, nie będziesz musiał ani optymalizować bazy danych, ani też zapytań SQL. Wystarczy, że doinstalujesz specjalny plugin, który zajmie się za Ciebie cachowaniem podstron Twojego bloga.
Pluginem takim jest wp-supercache. jego działanie nie polega na przetrzymywaniu w pamięci podręcznej zapytań SQL, lecz na zapisywaniu kompletnych, statycznych stron do plików na dysku serwera. Oznacza to, że plugin załatwia sprawę optymalizacji serwisu niezwykle kompleksowo. Nie tylko odciąża bazę danych, ale też daje odpocząć interpreterowi PHP, serwując statyczne pliki HTML dla użytkownika.
Podsumowanie
W tym wpisie celowo pominąłem optymalizację od strony serwera. Jest to spowodowane faktem, że znaczna większość czytelników tego bloga hostuje swoje serwisy na serwerach współdzielonych, bez możliwości przekonfigurowania maszyny.
Jeśli masz swoje sposoby na obronę przed wykop efektem, to podziel się proszę nimi w komentarzach do tego wpisu.

lipiec 3rd, 2010 o godzinie 20:57
Świetny artykuł, aczkowiek warto zauważyć, iż te same reguły obowiązują w przypadku normalnych serwisów o dużym obciążeniu, hostowanych na serwerach dedykowanych. Oczywiście dochodzi jeszcze druga strona tak jak napisałeś, czyli optymalizacja od strony serwera (najwiekszy skok wg mnie powoduje proste wlaczenie kompresji gzip, a mimo to bardzo duża ilość serwisów nie korzysta z tego typu rozwiązań. Metod na optymalizację znam wiele, ale żadne z nich nie są proste w zastosowaniu, ani nie są możliwe do wykonania bez przebudowy skryptu.
sierpień 27th, 2010 o godzinie 16:07
Dobre podsumowanie. Ci ktorzy sami hostuja i tworza swoje aplikacje powinni takie rzeczy wiedziec, ale czesto ktos zleca zrobienie i hostowanie swojego serwisu i nawet nie zdaje sobie sprawy ile czynnikow wplywa na dzialanie naszej stronki.
Troche tylko za malo wspomniane o cachowaniu. Wszytkie duze serwisy opieraja sie na ciezkim cachowaniu wszystkiego co sie da. Jednym z trudniejszych zagadnien w skalowaniu aplikacji webowych jest inwalidacja cache. Standardem w tej dziedzinie jest memcached. Lepsze frameworki webowe (np. Django, RoR) wspoldzialaja bardzo dobze z memcached. Dobre cachowanie jest wazniejsze od optymalizacji zapytan do bazy (choc na to tez powinno sie zwrocic uwage).
sierpień 27th, 2010 o godzinie 18:17
Hehehe no to UW-Team.org ma przekichane… ten artykul jest juz na wykopie i zaraz sami padniecie ofiara effektu hehe.
sierpień 27th, 2010 o godzinie 18:46
deny from all w .htaccess.
sierpień 27th, 2010 o godzinie 21:37
Wykop to najlepsza strona dla śmieszków w sieci. Dużo śmiechowych obrazków, filmików i dissów
Lepsze niż poszkole.pl!
sierpień 27th, 2010 o godzinie 22:28
WYKOP odwiedził i tego arta – czy strona przetrwa?
sierpień 27th, 2010 o godzinie 22:55
co to za brednie od 2 lat nie mogę się doprosić wykop efektu dla strony nadia.pl
sierpień 27th, 2010 o godzinie 23:02
Fajny sposób z tym pobieraniem bibliotek od Google. Tylko czy na pewno nie ma z tym żadnych problemów? G nic nie blokuje jak za dużo się od nich ciągnie?
sierpień 28th, 2010 o godzinie 00:01
Pogromca: deflate jest nieco bardziej wydajny od gzipa jeśli chodzi o obciążenie maszyny. Testowane i sprawdzone. Warto pytać o niuanse obsługę techniczną w firmie hostingowej, z której korzystamy. Bo pytając czy na SH zainstalowany jest mod_deflate albo mod_gzip, bo chciałem odpalić kompresję po http (js + css prawie 300kilo zajmował, a to sporo) sam się zdziwiłem jak dostałem w odpowiedzi: kompresja deflate jest defaultowo włączona
Sam się zastanawiałem nad “wykop efektem”, który technicznie rzecz biorąc jest atakiem ddos.
Można zaprzęgnąć php do zliczania sesji i przy powiedzmy > 30 userach w ciągu minuty wyświetlać pozostałym informację o tym, aby zaczekali chwilkę, bo ddosują maszynę
Można by zrobić prostego round robina, ale przy blogach i małych witrynach babranie się w tworzenie mirrora nie ma sensu.
Oczywiście najprostszym rozwiązaniem jest ściągnąć artykuł na kilkanaście godzin, wyświetlić tabliczkę: wracam jutro, a gdy już przejdzie fala powodziowa, przywrócić arta.
sierpień 28th, 2010 o godzinie 00:03
Test: poczytaj o serwerach CDN.
Nie tylko google udostępnia zasoby.
sierpień 28th, 2010 o godzinie 00:21
Widzę że usuwanie sensownych komentarzy jest chyba najprostszym rozwiązaniem na wykop efekt.
Gratuluję. Nie będę polecał innym straty czasu na komentowanie czegokolwiek tutaj.
sierpień 28th, 2010 o godzinie 00:35
@Jay: na blogu używamy opisanego w artykule pluginu o nazwie wp-supercache. Oznacza to, że Twoje komentarze pojawiają się w serwisie po upływie co najmniej kilkunastu minut. Nikt nie usuwa Twoich wpisów. To po prostu cache
sierpień 28th, 2010 o godzinie 01:13
Hmmm….dziwne, doprawdy dziwne.
Dorzuciłem pierwszy komentarz, przeładowało stronę, okazało się że kilku komentujących mnie ubiegło. Skomentowałem ponownie i poza dwoma pierwszymi komentarzami, wszystkie wycięło.
Niby wiem nieco o tym, a jednak nie przestaje mnie zadziwiać cała ta infrastruktura
Trochę mnie poniesło, za co przepraszam.
sierpień 28th, 2010 o godzinie 10:54
“Wykop efekt” to jakiś pokraczny ponglish. Albo efekt wykopu albo wykop effect.
sierpień 28th, 2010 o godzinie 11:32
Proponuję jeszcze przyjrzeć się dokładnej analizie wykopowiczów sporządzonej na podstawie Google Analytics: http://like-a-geek.jogger.pl/2010/08/21/wszystko-co-musisz-wiedziec-o-wejsciach-z-wykopu/
Czego by o sobie nie sądzili wykopowicze, to wcale nie jest to aż tak olbrzymia liczba odwiedzin jak mogłoby się wydawać.
sierpień 28th, 2010 o godzinie 11:39
@admin – z tymi komentarzami i cachem to bzdura w sensie nie korzystalem nigdy z wp siedze w ciutke czym innym, jednaklze jezeli tak to dziala to znaczy ze dziala to zle bo komentarz powinien byc wysiwetlony zaraz po dodaniu i dopiero wtedy cache powinien go przyjac, ewentualnie opcja ze mozesz sobie ustawic jak ma sie to zachowywac ale wtedy oczywiscie powinna sie pojawic stosowna informacja o tym dla komentujacego. Wnioskujac po poscie powyzszym owa informacja sie nie pojawia czyli system zle dziala
sierpień 28th, 2010 o godzinie 14:24
@admin @Jay W myśl usability powinna być widocza na stronie informacja uprzedzająca uzytkownika, że napisanay komentarz moze pojawić się na stronie dopiero po paru minutach.
sierpień 28th, 2010 o godzinie 18:24
Problem z wp-supercache polega na tym, ze nie mozna “keszowac” czesci stron i dolaczac do nich elementow ladowanych dynamicznie. Dobrze by bylo gdyby mozna zbierac w bloki fragmenty, ktore maja sie zawsze ladowac dynamicznie.
Przykladowo laduje galerie zdjec, a pod nia piec linkow do innych losowo wybranych galerii. Mozna to niby przeskoczyc ladowaniem ich za pomoca js, ale wtedy boty indeksujace nie zalapia tych linkow. Podobnie z komentarzami, wrzucic mozna ajaxem, ale co z tego skoro pozbawiamy strone wartosciowego contentu*.
sierpień 29th, 2010 o godzinie 00:44
myslalem ze bedzie o nginx, memcache itp a tu takie popierdulki ;]
sierpień 30th, 2010 o godzinie 01:07
@admin odnosnie wp-supercache – to raczej standard ze w takich przypadkach pokazuje sie userowi strone z jego komentarzem ale anonimowy cache odswierza sie dopiero po paru minutach.
co do pluginów wp to lepszy jest w3 total cache – robi duzo wiecej niz supercache.
odnosnie walki z samym ruchem to najlepszym rozwiazaniem jest po prostu reverse-proxy z dobrze napisanym configiem ktory w moim przypadku zbiera 85% ruchu zmniejszajac load maszyny kilkukrotnie, bo rev proxy nie musi tworzyc kilkudziesieciomegowych wątków apache tylko po to aby zrobić redirect do statycznego pliku.
kolejnym bardzo ważnym punktem jest puszczenie plików statycznych przez “nie-apache” – jest wiele opcji – light, nginx etc. apache sie do tego po prostu nie nadaje.
sierpień 30th, 2010 o godzinie 11:02
@bre: zwróć proszę uwagę, że wpis ten dotyczy optymalizacji serwisu od strony użytkownika, czyli celowo pomijam w nim to, co musi wykonać administrator serwera.