måndag 31 maj 2010

Ladda php-klasser först när de ska användas

Idag var jag på Optimera STHLM och lyssnade på flera intressanta föreläsningar. Det var inte jättemycket nytt under solen men inspirerade till att optimera sin kod än mer och kändes som ett väldigt bra initiativ av IIS.

En oväntad sak jag lärde mig var att php har en inbyggd funktion som talar om hur mycket minne ens php-script allokerat som mest under exekveringen, nämligen: memory_get_peak_usage()

Jag var såklart tvungen att testa denna funktion på Pusha där jag blev glatt överraskad av att Pusha som mest verkar använda 4mb minne. Till min förvåning visade det sig att Qvaq använde mer minne än vad Pusha gör vilket var väldigt märkligt eftersom Pusha består av betydligt fler klasser. Efter ett tag insåg jag dock att det beror på att vi på Pusha laddar in endast de klasser som verkligen används dynamiskt istället för att ladda alla klasser hela tiden.

I vanliga fall kanske ens php-kod innehåller ett stort antal include-satser för att ladda in alla klasser man behöver, det kan se ut ungefär såhär (fast med hundratals rader):

include "classes/User.php";
include "classes/Link.php";
include "classes/Comment.php";

För att istället ladda in en klass först när den behövs om den behövs över huvud taget så behöver man bara override:a funktionen __autoload().

Denna funktion anropas automatiskt i php så fort php stöter på en klass som den inte känner till och skickar med namnet på den saknade klassen som inparameter. Det enda du behöver göra i funktionen är alltså att inkludera den fil där klassen som saknas är definierad. Enklast tänkbara sätt att göra detta är såhär:

function __autoload($class) {
   include "classes/".$class.".php";
}

På Qvaq sänkte dessa förändringar minnesanvändningen med 0,5mb per sidladdning från 4,25mb till 3,75mb. Kanske ingen jättevinst men då innehåller inte Qvaq speciellt många klasser och har man många requests kan det bli en hel del sparat minne.

Jag misstänkte att detta sätt att ladda in klasserna on-the-fly skulle göra att koden exekverades långsammare men enligt mina mätningar gick det lika snabbt eller möjligen till och med något snabbare.

torsdag 20 maj 2010

Tiodubbla hastigheten på dina InnoDB-tabeller

Vi har precis fixat en ny databas-server till Pusha och inatt satt jag uppe och försökte optimera inställningarna för MySQL. En förändring jag gjorde av standardinställningarna som gav oväntat bra effekt var att ändra innodb_flush_log_at_trx_commit. Denna variabel talar om för mysql hur ofta den ska skriva till loggen när man skriver till en innodb-tabell.

Standardvärdet för innodb_flush_log_at_trx_commit är 1 vilket betyder att varenda uppdatering måste flushas till loggen direkt. Bygger man en bank så är nog detta att rekommendera men för de flesta applikationer som inte kräver extremt hög säkerhet så räcker nog värde 2 som innebär att man bara skriver till loggen en gång per sekund. Skulle operativsystemet krascha så förlorar man alltså maximalt en sekunds ändringar.

Du ändrar värdet genom att lägga till denna rad under [mysqld] i /etc/mysql/my.cnf (eller var du nu har my.cnf):

innodb_flush_log_at_trx_commit  = 2

Glöm inte att starta om mysql för att ändringen ska få effekt.

Jag har inte gjort några exakta mätningar på hur stor skillnad detta gör men det blev synbart snabbare att pusha en länk på Pusha så det är minst 10 ggr så snabbt som med värdet 1.

MySQL-dokumentationen för innodb_flush_log_at_trx_commit
Fler tips på hur man finjusterar MySQL

Spotify rekryterar med programmeringstävling

Vill du ha ett jobb på spotify så ska du boka in lördag den 29e maj i kalendern. Spotify anordnar då en programmeringstävling där man kan vinna (än så länge ospecifierade) priser och goda möjligheter till en anställning i företaget.

På 4 timmar ska man lösa 6-8 uppgifter av en algoritmisk karaktär. Lösningarna ska skrivas i C, C++ eller Java och kommer att rättas av en dator.

Mer information och anmälan

Google lanserar Google Storage for Developers

Google har lanserat en tjänst för att lagra data i molnet - Google Storage for Developers. Egentligen en ren och skär kopia av Amazon S3. Även prissättningen är i princip densamma som för S3, google storage är något dyrare men å andra sidan får man nu under deras "Preview" 100 gigabyte lagringsutrymme och 300 gigabyte bandbredd per månad gratis.

Än så länge är tjänsten bara öppen för den amerikanska marknaden men förmodligen kommer det till Europa också så småningom.

Det finns en sak som skulle kunna få mig att svika Amazon S3 och övergå till Google Storage. Om Google Storage tillåter att man döper objekt till en tom sträng så att man kan lägga in en "förstasida" för sin bucket så är jag såld. Tyvärr har jag inte lyckats utreda om det är så eller ej.