clug 2011 march web server optimisation

Download Clug 2011 March  web server optimisation

If you can't read please download the document

Upload: grooverdan

Post on 16-Apr-2017

576 views

Category:

Technology


1 download

TRANSCRIPT

Website Optimisation

CLUG March 2012

contents

Network

Compression

HTTP Caching

Structuring

Measurement

Application Caching

Monitoring

contents

Network

Compression

HTTP Caching

Structuring

Measurement

Application Caching

Database tuning

Monitoring

Client

Server

Network

mtr -c 10 -r www.openquery.com

HOST: spaceman.localhost Loss% Snt Last Avg Best Wrst StDev 1.|-- 192.168.1.1 0.0% 10 0.8 2.6 0.7 19.3 5.8 2.|-- 192.168.3.254 0.0% 10 1.1 1.2 1.1 1.5 0.1 3.|-- lns20.cbr1.internode.on.n 0.0% 10 22.6 22.7 22.3 23.2 0.2 4.|-- gi0-0-2.cor3.cbr1.interno 0.0% 10 22.2 22.5 22.0 23.1 0.4 5.|-- te6-0-0.bdr1.syd4.interno 0.0% 10 207.1 207.7 207.1 208.4 0.4 6.|-- te0-0-0.bdr1.syd7.interno 0.0% 10 208.4 210.1 207.1 228.2 6.4 7.|-- po3-0-0.bdr1.sjc2.interno 0.0% 10 207.5 207.2 206.7 207.9 0.4 8.|-- 10gigabitethernet2-3.core 0.0% 10 185.9 187.0 185.0 190.7 2.0 9.|-- 10gigabitethernet1-1.core 0.0% 10 186.3 205.2 186.0 367.5 57.1 10.|-- linode-llc.10gigabitether 10.0% 10 186.1 189.1 185.4 210.8 8.1 11.|-- bluefish.lentz.com.au 10.0% 10 186.5 186.6 186.0 187.9 0.6

Network (DNS)

Check whois is showing the right nameserver

whois openquery.com NS1.LINODE.COM NS2.LINODE.COM NS3.LINODE.COM NS4.LINODE.COM NS1.CREATIVECONTINGENCIES.COM NS2.CREATIVECONTINGENCIES.COM NS3.CREATIVECONTINGENCIES.COM Ensure correct record is returned by querying each nameserver

dig www.openquery.com @ns1.creativecontingencies.com

Network (SSL/TLS)

17 packets 4 roundtrips before application data

Network (SSL/TLS)

Session Tickets - 8 packets 3 roundtrips before application dataEDH crypto computational expensive by has perfect forwards secrecy

Network (HTTP keep-alive)

Request / Response header

Connection:keep-alive

On by default. Can't handle variable length pages

Compression

Gzip/deflate

Compression

Apache's HTTPdEnable mod_deflate

SetOutputFilter DEFLATE

LightyEnable mod_compress in server.modules

Nginxgzip on;

Compression

PHPPhp.ini zlib.output_compression On

HTTP Caching

RFC 2616 Hypertext Transfer Protocol HTTP/1.1

HTTP Caching

EtagUnique string usual some form of digest

Browsers request with HTTP header:If-None-Match: uniquestring....

Server response: 304 not modified if nothing changes

HTTP Caching (Etag)

HTTPdFileETag Mtime

HTTP Caching (Expires)

HTTP Response headerExpires: Thu, 01 Dec 2012 16:00:00 GMTDate:Thu, 22 Mar 2012 01:00:17 GMTLast-Modified:Sun, 11 Mar 2012 20:55:16 GMT

HTTP RequestIf-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

HTTP Caching (Cache-Control)

Cache-Control = "Cache-Control" ":" 1#cache-directive

cache-directive = cache-request-directive | cache-response-directive

cache-request-directive = "no-cache" ; Section 14.9.1 | "no-store" ; Section 14.9.2 | "max-age" "=" delta-seconds ; Section 14.9.3, 14.9.4 | "max-stale" [ "=" delta-seconds ] ; Section 14.9.3 | "min-fresh" "=" delta-seconds ; Section 14.9.3 | "no-transform" ; Section 14.9.5 | "only-if-cached" ; Section 14.9.4 | cache-extension ; Section 14.9.6

cache-response-directive = "public" ; Section 14.9.1 | "private" [ "=" ] ; Section 14.9.1 | "no-cache" [ "=" ]; Section 14.9.1 | "no-store" ; Section 14.9.2 | "no-transform" ; Section 14.9.5 | "must-revalidate" ; Section 14.9.4 | "proxy-revalidate" ; Section 14.9.4 | "max-age" "=" delta-seconds ; Section 14.9.3 | "s-maxage" "=" delta-seconds ; Section 14.9.3 | cache-extension ; Section 14.9.6

Gzip + Caching

trunk/roundcubemail/.htaccess SetOutputFilter DEFLATE # replace 'append' with 'merge' for Apache version 2.2.9 and later Header append Cache-Control public env=!NO_CACHE ExpiresActive On ExpiresDefault "access plus 1 month" FileETag MTime

SavingsOn initial response: 104.2K (vs 255.6K) / 44 requests)

On next page: 6.2K 2 requests (vs 204.7K / 44 requests)

Structuring

Use Yslow / Firebug

Measurement

Measurement (Application)

create table `timings` ( `id` int(4) NOT NULL AUTO_INCREMENT, 'host' varchar(20),'page' varchar(120), int t1,int t2, int t3.....)

And in the index.php

$sample = rand(0,100) < 5; # 5% sample rate

if ($sample) $t0 = microtime(TRUE);

..bits of code

if ($sample) $t1 = microtime(TRUE) - $t0;..

if ($sample) $t2 = microtime(TRUE) - $t1;

...

if ($sample) { insert into timings .....$t1*1000, $t2*1000....}

Application Caching

Be strategic cost / benefit

Hard to generate graphs, database queries, complex maths

Frequent pages: front pages, rss, ajax

Application Caching (duplicate)

if (!$db->count('name', $name, DB_CACHE)) { // if no cache entry exists, fetch the appropriate html and insert...

} else { // row exists - determine if it is still valid $last_update = $db->getRecord('time', DB_CACHE, "name='$name'"); ....

if (strtotime($last_update) >= strtotime($max_age)) // value is still valid - retrieve existing { $result = $db->getRecord('value', DB_CACHE, "name='$name'");Fetching the same database entry three times.

Application Caching

Cache an entire page

Memcache is your friend RAM, autoexpire, overload intelligent expire

Share between servers

Nice API in all languagese.g. PHPpublic mixed Memcached::get ( string $key [, callable $cache_cb [, float &$cas_token ]] )

Application scaling

If the application scales by adding webservers you will save on hosting on high power servers

Ensure application is stateless

Reverse proxy state-full bits to central server if needed

CDNs or separated servers for static content saves lots of cpu (latency, keep alives)

Application APC

Graph from apc.php as part of the php_apc package

Database

Know what indexes are and which queries aren't using them.

EXPLAIN {sql expression} (Postgresql and Mysql)

EXPLAIN ANALYSE {sql expression}

Slow query log enable

Know differences between MySQL engines

Tune your serverDefaults well out of proportion with your sever.

Database (continued)

Searching text in SQL Use Sphinxsearch instead

Same sql interfaces, pulls off database much quicker at full text search

Databases (application)

Eventually one DB will be too little

Plan to buy big hardware (Oracle) or plan to use a replicated database (for reads)

Some reads will need to occur on the master. The ones where the data was likely just changed very recently

Monitoring

Monitoring

Include resource usage

Cpu / RAM / processes / forking / swap / IO / Bandwidth...

Web server pages/second, threads

Database query cache hits/misses, connections, replication delay

Business value: page load time.

Alert if boundaries exceeded