Upload
konryd
View
3.161
Download
2
Embed Size (px)
DESCRIPTION
Citation preview
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Za co nie lubi Cie Twój hosterCzyli jak wdrozyc aplikacje na produkcje i przezyc by o tym
opowiedziec
Grzegorz Nosek, MegiTeam
PyKonik, Kraków
9.02.2011
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Disclaimer
Bedzie:1 subiektywnie2 bez zmyslania3 o czestych problemach i uniwersalnych rozwiazaniach4 nie tylko o shared hostingu
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zasoby serwera
Podstawowe zasoby:czas procesoradostep do dysków
Serwery dostepne dla uzytkownika:serwer aplikacjiserwer baz danychinne dedykowane serwery, np. pocztowe
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Czas procesora
zadania w tleminiaturki itp.pliki statycznestrony prawie statyczne
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Zadania w tle
okresowe (nie powiazane z konkretnym zadaniem) –mailingi, backupy itp.odroczone (zadania zbyt czasochłonne by je wykonywac wobsłudze zadania) – przekodowanie wideo, analiza danychuzytkownika itp.
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Zadania w tle
Kryminalnie zle:
while True:
if mam_co_robic():
zrob_cos()
time.sleep(1) # albo i to nie
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Zadania w tle
Kryminalnie zle:
while True:
if mam_co_robic():
zrob_cos()
time.sleep(1) # albo i to nie
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Zadania w tle
Zle:
while True:
if mam_co_robic():
zrob_cos()
time.sleep(600)
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Zadania w tle
Dobrze:zadania okresowe (time.sleep(600)): cronzadania w tle (time.sleep(1)): messaging (celery,RabbitMQ)
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Miniaturki
Miniaturki i inne generowane plikiwzglednie czasochłonne do wygenerowaniaw sam raz do cache’owania na dyskucache moze byc przezroczysty dla aplikacji
...ale to niekoniecznie dobry pomysł“There are only two hard things in Computer Science:cache invalidation and naming things”.
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Miniaturki
Nginx
location /obrazki {
document_root /gdzies/tam/;
try_files $uri @aplikacja;
}
location @aplikacja {
# ...
proxy_pass http://127.0.0.1:9000/;
}
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Pliki statyczne
„...mógłbym ale serwer WWW zrobi to lepiej”django.views.static.serve
kontrola dostepu: X-Sendfile, X-Accel-Redirect
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Pliki statyczne
Nginx
location /scisle-tajne {
internal;
document_root /gdzies/tam/;
}
Aplikacja:
HTTP/1.1 200 OK
Content-Type: image/jpeg
X-Accel-Redirect: /scisle-tajne/1234567.jpg
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Zadania w tleMiniaturki itp.Pliki statyczneStrony prawie statyczne
Strony prawie statyczne
Statyczna strona (np. artykuł) z dynamicznymi elementami(komentarze, reklamy)
cache’owanie obiektów z bazy danychcache’owanie fragmentów HTMLcałkowicie statyczna strona z elementami dynamicznymi
javascriptSSI <!�#include virtual="/ssi/comments?foo=bar" �>
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O
przełaczenie kontekstu CPU – kilka(-dziesiat) µsruch głowica dysku – kilka(-nascie) mstrudno dokładnie zmierzyc, jeszcze trudniej sprawiedliwiepodzielic
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Liczba plików tworzonych przez aplikacjedosc dobry wyznacznik wymagan I/Ow jednym katalogu
im mniej plików tym szybszy dostepodgórne ograniczenia (ext3)
łacznieczas tworzenia i odtwarzania kopii zapasowych
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Pliki tymczasowe (w tym rozmaite cache)niech beda naprawde tymczasowenieuzywane pliki cache usuwane z crona
łatwo zapomniec podczas tworzenia aplikacjiatime
, którego i tak nie mamtime
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Pliki tymczasowe (w tym rozmaite cache)niech beda naprawde tymczasowenieuzywane pliki cache usuwane z crona
łatwo zapomniec podczas tworzenia aplikacjiatime, którego i tak nie mamtime
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Pliki trwałe (nie mozna ich usunac)niech beda naprawde trwałenie zmieniaj im nazwy bez zmiany zawartosci i vice-versa
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plikówzamiast /obrazki/1234567.jpg:/obrazki/12/1234/1234567.jpg
2-3 poziomy katalogówok. 1000 plików w katalogu ostatniego poziomurównomierny rozkład plików
pierwsze znaki z MD5 itp.http://en.wikipedia.org/wiki/Benford's_law
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plików – ku przestrodzeadresy e-mailowe, hashowane wg pierwszej litery
poczta/l/[email protected]
15% zaczynało sie od biuro@
kolejne 10% od info@
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plików – ku przestrodzeadresy e-mailowe, hashowane wg pierwszej litery
poczta/l/[email protected]
15% zaczynało sie od biuro@
kolejne 10% od info@
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plików – ku przestrodzeit’s MD5 all the way down
68/b3/29/da/...98/93/e3/40/...99/c7/d8/ad/....../5c/b9/c9/40/68b329da9893e34099c7d8ad5cb9c940ponad 3 miliony katalogów, z tego 300 tysiecy ostatniegopoziomupo jednym pliku w kazdym
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plików – ku przestrodzeit’s MD5 all the way down
68/b3/29/da/...
98/93/e3/40/...99/c7/d8/ad/....../5c/b9/c9/40/68b329da9893e34099c7d8ad5cb9c940ponad 3 miliony katalogów, z tego 300 tysiecy ostatniegopoziomupo jednym pliku w kazdym
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plików – ku przestrodzeit’s MD5 all the way down
68/b3/29/da/...98/93/e3/40/...
99/c7/d8/ad/....../5c/b9/c9/40/68b329da9893e34099c7d8ad5cb9c940ponad 3 miliony katalogów, z tego 300 tysiecy ostatniegopoziomupo jednym pliku w kazdym
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plików – ku przestrodzeit’s MD5 all the way down
68/b3/29/da/...98/93/e3/40/...99/c7/d8/ad/...
.../5c/b9/c9/40/68b329da9893e34099c7d8ad5cb9c940ponad 3 miliony katalogów, z tego 300 tysiecy ostatniegopoziomupo jednym pliku w kazdym
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pliki tworzone przez aplikacjeHashowanie nazw plików
I/O – pliki tworzone przez aplikacje
Hashowanie nazw plików – ku przestrodzeit’s MD5 all the way down
68/b3/29/da/...98/93/e3/40/...99/c7/d8/ad/....../5c/b9/c9/40/68b329da9893e34099c7d8ad5cb9c940ponad 3 miliony katalogów, z tego 300 tysiecy ostatniegopoziomupo jednym pliku w kazdym
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
Bazy danych
IndeksyMySQL: storage enginesPostgreSQL
statystykimartwe krotki
Aplikacjazbedne zapytaniaORM – wierz ale sprawdzaj
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
Indeksy
„Tu jest ksiazka, sprawdz czy jest w niej cos o lolkotkach”
EXPLAIN
mysql> EXPLAIN SELECT votes FROM wp_votes WHERE post='3222';+----+-------------+----------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+----------+------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | wp_votes | ALL | NULL | NULL | NULL | NULL | 1407 | Using where |+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
Indeksy
„Tu jest ksiazka, sprawdz czy jest w niej cos o lolkotkach”EXPLAIN
mysql> EXPLAIN SELECT votes FROM wp_votes WHERE post='3222';+----+-------------+----------+------+---------------+------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+----------+------+---------------+------+---------+------+------+-------------+| 1 | SIMPLE | wp_votes | ALL | NULL | NULL | NULL | NULL | 1407 | Using where |+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
Indeksy
CREATE INDEX
mysql> CREATE INDEX i_post_wp_votes ON wp_votes(post);Query OK, 1407 rows affected (0,04 sec)Records: 1407 Duplicates: 0 Warnings: 0
mysql> EXPLAIN SELECT votes FROM wp_votes WHERE post='3222';+----+-------------+----------+------+-----------------+-----------------+---------+-------+------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+----------+------+-----------------+-----------------+---------+-------+------+-------+| 1 | SIMPLE | wp_votes | ref | i_post_wp_votes | i_post_wp_votes | 4 | const | 1 | |+----+-------------+----------+------+-----------------+-----------------+---------+-------+------+-------+
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
Indeksy
Indeks to nie wszystkomegiteam=> explain analyze select * from ip_traffic where ip = '77.79.227.119'
and date_trunc('month', day) = '2011-01-01';QUERY PLAN
---------------------------------------------------------------------------------------------------Bitmap Heap Scan on ip_traffic (...) (actual time=3452.997..3511.852 rows=215 loops=1)
Recheck Cond: (ip = '77.79.227.119'::inet)Filter: (date_trunc('month'::text, ("day")::timestamp with time zone) =
'2011-01-01 00:00:00+01'::timestamp with time zone)-> Bitmap Index Scan on ip_traffic_pkey (...) (actual time=532.491..532.491 rows=7748 loops=1)
Index Cond: (ip = '77.79.227.119'::inet)Total runtime: 3511.997 ms
(6 rows)
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
Indeksy
Indeks to nie wszystko
megiteam=> explain analyze select * from ip_traffic where ip = '77.79.227.119'and day between '2011-01-01' and '2011-01-31';
QUERY PLAN------------------------------------------------------------------------------------------------Bitmap Heap Scan on ip_traffic (...) (actual time=64.238..344.296 rows=215 loops=1)
Recheck Cond: ((ip = '77.79.227.119'::inet)AND ("day" >= '2011-01-01'::date)AND ("day" <= '2011-01-31'::date))
-> Bitmap Index Scan on ip_traffic_pkey (...) (actual time=52.700..52.700 rows=215 loops=1)Index Cond: ((ip = '77.79.227.119'::inet)
AND ("day" >= '2011-01-01'::date)AND ("day" <= '2011-01-31'::date))
Total runtime: 344.450 ms(5 rows)
10x szybciej
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
Indeksy
Indeks to nie wszystko
megiteam=> explain analyze select * from ip_traffic where ip = '77.79.227.119'and day between '2011-01-01' and '2011-01-31';
QUERY PLAN------------------------------------------------------------------------------------------------Bitmap Heap Scan on ip_traffic (...) (actual time=64.238..344.296 rows=215 loops=1)
Recheck Cond: ((ip = '77.79.227.119'::inet)AND ("day" >= '2011-01-01'::date)AND ("day" <= '2011-01-31'::date))
-> Bitmap Index Scan on ip_traffic_pkey (...) (actual time=52.700..52.700 rows=215 loops=1)Index Cond: ((ip = '77.79.227.119'::inet)
AND ("day" >= '2011-01-01'::date)AND ("day" <= '2011-01-31'::date))
Total runtime: 344.450 ms(5 rows)
10x szybciej
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
MySQL – storage engines
MyISAMszybki i wsciekłybrak transakcji, precyzyjnego lockowania
InnoDBtransakcjegwarancje spójnosci danychtragiczna wydajnosc przy zapisiegrupowanie zapytan w transakcje
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
MySQL – storage engines
MyISAMszybki i wsciekłybrak transakcji, precyzyjnego lockowania
InnoDBtransakcjegwarancje spójnosci danych
tragiczna wydajnosc przy zapisiegrupowanie zapytan w transakcje
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
MySQL – storage engines
MyISAMszybki i wsciekłybrak transakcji, precyzyjnego lockowania
InnoDBtransakcjegwarancje spójnosci danychtragiczna wydajnosc przy zapisiegrupowanie zapytan w transakcje
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
PostgreSQL – statystyki
losowa próbka danych uzywana do planowania zapytanwarto odswiezyc po duzych zmianach w tabelitabele posredniczace w relacjach n:mANALYZE [VERBOSE] [tabela]
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
PostgreSQL – martwe krotki
MVCC – rózne transakcje widza rózne wersje danychkazdy UPDATE i DELETE zostawia stara wersje krotkiUPDATE articles SET views=views+1 WHERE id=%d
czesto zmieniane dane w innej tabeli, połaczonej relacja1:1VACUUM ANALYZE [VERBOSE] [tabela]
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
PostgreSQL – martwe krotki
MVCC – rózne transakcje widza rózne wersje danychkazdy UPDATE i DELETE zostawia stara wersje krotkiUPDATE articles SET views=views+1 WHERE id=%d
czesto zmieniane dane w innej tabeli, połaczonej relacja1:1VACUUM ANALYZE [VERBOSE] [tabela]
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
W aplikacji – zbedne zapytania
w widoku: posts = Post.objects.filter(author=1)
w szablonie:{% for post in posts %}
{{ post.author }}
{% endfor %}
posts =
Post.objects.filter(author=1).select_related('author')
cache’owanie zapytan (np. johnny-cache)
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
W aplikacji – zbedne zapytania
w widoku: posts = Post.objects.filter(author=1)
w szablonie:{% for post in posts %}
{{ post.author }}
{% endfor %}
posts =
Post.objects.filter(author=1).select_related('author')
cache’owanie zapytan (np. johnny-cache)
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
W aplikacji – ORM
.filter(fk=None) vs .filter(fk_id__isnull=True)
django.contrib.contenttypes
for obj in objs:
qs = qs | Model.objects.filter(obj=obj)
qs = Model.objects.filter(obj__in=objs)
str(queryset.query)
Django debug toolbar
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
IndeksyMySQLPostgreSQLW aplikacji
W aplikacji – ORM
.filter(fk=None) vs .filter(fk_id__isnull=True)
django.contrib.contenttypes
for obj in objs:
qs = qs | Model.objects.filter(obj=obj)
qs = Model.objects.filter(obj__in=objs)
str(queryset.query)
Django debug toolbar
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster
Tytułem wstepuCzas procesora
I/OBazy danych
QA
Pytania?
Pytania?
Grzegorz Nosek, MegiTeam Za co nie lubi Cie Twój hoster