Ubrzavanje dinamičkih web siteova

tajne zanata

Dobrica Pavlinušić

system architect

dpavlin@gbs-it.com

www.strix-portal.com

O čemu nećemo govoriti?

Razne proxy tehnike za smanjivanje opterećenja web servera (squid, mod_proxy, mod_rewrite)

Posluživanje statičnog sadržaja sa jednostavnijeg i bržeg web servera

Ko-lokacija servera na bržem linku

How to scale-out your server:

Is caching right solution for you?

http://www.rot13.org/~dpavlin/scaleout.html

O čemu ćemo govoriti?

Ubrzavanje dinamički generiranih web aplikacija baziranih na relacijskim bazama podataka

hardware

Linux

Apache

PHP

PostgreSQL

i mnogo drugoga u vezi sa time...

Preuranjena optimizacija donosi više štete nego koristi!

Dizajn aplikacije

smanjiti broj round-tripova od korisnika do servera (odziv < 3 s za sve akcije!)

JavaScript za interakciju sa korisnikom

Profiling logovi za pronalaženje sporih mjesta

korištenje caching mehanizama

session cache (za jednog korisnika)

memcached (višekorisnički)

Hardware

hardware scaling je crna magija!

koliko korisnika?

ukupno

istovremenih

koliko RAM memorije? (za cache?)

osmislite sustav tako da možete umnažati komponente

front-end web serveri

RDBMS serveri (master-slave replikacija)

Hardware - IRQ

posebni interrupti za Network i SCSI kontroler (30% razlike u performansama)

irqbalance – za SMP sustave

cat /proc/interrupts

CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7

0: 3221906247 193454425 198656088 198656366 198659380 198655970 198659390 198656384 IO-APIC-edge timer

1: 2654 0 0 0 487 0 138 0 IO-APIC-edge i8042

5: 0 0 0 0 0 0 0 0 IO-APIC-level acpi

8: 4 0 0 0 0 0 0 0 IO-APIC-edge rtc

177: 3661437 0 794421 0 0 0 0 0 IO-APIC-level eth0

185: 30 0 0 0 0 0 0 0 IO-APIC-level aic7xxx

193: 30 0 0 0 0 0 0 0 IO-APIC-level aic7xxx

201: 1263898783 0 0 0 0 0 0 0 IO-APIC-level eth1

209: 156814484 0 0 335 26007046 400 9271401 0 IO-APIC-level ips

NMI: 0 0 0 0 0 0 0 0

LOC: 313284320 313284455 313284457 313284396 313284391 313284452 313284453 313284452

ERR: 0

MIS: 0

Hardware - diskovi

koliko prostora na disku?

SCSI

skuplji sa razlogom, brži, pouzdaniji

RAID sustavi

RAID 5 je dovoljno dobar (benchmark!)

manji diskovi su brži (34 vs 72 Gb)

Linux

agresivno koristi memoriju za filesystem cache

LVM – sigurno ćete željeti povećati filesystem!

filesystem

journaling nije opcija

ext3, reiserfs, jfs, xfs

backup / resize

tmpfs – ram disk koji zapravo radi!

Apache

KeepAlive On

http pipeline

MaxClients

u skladu sa brojem database connectiona!

AllowOverride

stat pri svakom pristupu nije vaš prijatelj

CustomLog / ErrorLog

trebate li sve te logove? (tmpfs?)

Apache - kompresija

kompresija pri slanju browseru (80%)

omogućava generiranje većih stranica bez povećanja vremena downloada

mod_gzip

Poor man's mod_gzip:

gzip -9 file.js

AddEncoding x-gzip gz

Internet Explorer ima problema sa kompresiranim CSS i JavaScript datotekama

HTTP Cache je vaš prijatelj!

statički sadržaj 50-80% ukupnog contenta (slike, flash, CSS, JavaScript, datoteke)

browser ima lokalni on-disk cache

Proxy negdje na putu do korisnika (CDN?)

Cacheability Engine

http://www.mnot.net/cacheability/

Pomognite HTTP cacheu

Headeri

Content-Length: (za pipelining)

Date:

Cache-Control:

Expires:

validatori promjene sadržaja:

Last-Modified:

ETag:

Izgleda komplicirano?

<?php

Header("Cache-Control: must-revalidate");

$offset = 60 * 3;	// 3 minute

$ExpStr = "Expires: " .

gmdate("D, d M Y H:i:s", time() + $offset) .

" GMT";

Header($ExpStr);

?>

PHP

ne naročito brz jezik

share-nothing arhitektura

teoretski neograničena skalabilnost

u praksi pomiče problem na bazu

akceleratori

eAccelerator (fork TurckMMCache-a)

Zend Performance Suite

cgi vs mod_php – security vs speed

Template sustavi

dobri, krasni, potrebni – MVC paradigma

Prekompajlirani templatei (200%)

PHP – Smarty

perl – Template Toolkit

tmpfs za smještanje prekompajliranih templatea

CSS trikovi

display: none

generiranje većeg html-a da bi se smanjio broj round-tripova do servera

pravi izbor za edit opcije na sučelju

mod_gzip je Vaš prijatelj!

JavaScript

svaka akcija koja štedi round-trip do servera poboljšava osjećaj brzine web aplikacije

pada li vam GMail na pamet?

XMLhttp request

Firefox, Interenet Explorer, Safari

Što sa ostalim korisnicima?

Opera (iframe cludge)

korisnici sa specijalnim potrebama (npr. slijepe osobe sa screen readerima)

PostgreSQL

postgresql.conf

max_connections – u skladu sa brojem apache childova

shared_buffers

sort_mem

fsync = true

log_min_duration_statement = 3

EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

indeksi, transakcije

Profiling

Ugradite logove za profiling u vašu aplikaciju

prema komponentama (modulima)

prema SQL upitima

Profiling podaci su najbolji pokazatelj što trebate spremiti u cache!

SQL upiti se mogu logirati i na razini baze

ali ako koristite placeholdere, bolje je na razini aplikacije!

Cache, napokon!

PHP Session cache

lokalan za (logiranog) korisnika

nestaje nakon odlogiravanja

u slučaju više front-end servera u bazi

MemCache

globalan, po potrebi na više različitih servera

invalidacija poseban izazov (timeout, eksplicitna)

eAccelerator

višekorisnički, ali samo na jednom web serveru

Benchmark

ab – Apache Benchmark

siege

provjerite mnogo različitih URL-ova, ne samo naslovnu stranicu

problemi sa autorizacijama

odustanite nakon nekog vremena!

Koliko poboljšanja očekivati?

OS tuning: 30-100 %

filesystem, elvtune, tmpfs

RDBMS tuning: 100-1000 %

indeksi, inserti unutar transakcija

PHP accelerator: 100-300 %

u zavisnosti od količine koda

Cache: 100-2000 %

ako pronađete prave podatke

Kako ubrzati aplikaciju?

provjerite iskorištenje diskova i procesora

što usporava aplikaciju: CPU, I/O ili baza?

napravite inicijalni benchmark

dodajte profile logging u aplikaciju

nađite najsporije komponente i ubrzajte ih

ponovite benchmark i provjerite ubrzanja

Pitanja?

www.strix-portal.com

2004-04-20T20:34:19