Andreas Bergman

Icon

Debian störst på webbservrar

IDG.se som kanske inte alltid levererar kvalitetsjournalistik publicerade idag en artikel om att Debian toppar som OS på linuxservrar, inte särskilt oväntat tycker jag. Debian har rykte om sig om att vara väldigt anala i vilka paket som släpps vidare till stable, och det är på gott och ont, visst paketversionerna kanske inte är dom senaste, men samtidigt så funkar det jävligt bra.

CentOS kommer som tvåa, och det är inte särskilt förvånande, om Debian är en liten och smidig F1 maskin så är CentOS mer som en jäkligt robust pansarvagn att jobba med, jag tycker att den känns enormt solid och paketformatet RPM är väldigt lättarbetat och tenderar att lösa dependencyproblem bättre än APT.

Vill du läsa artikeln finns den här: www.idg.se/2.1085/1.425993/debian-toppar-pa-linuxservrar

Linux är helt felpaketerat

När du idag installerar en linuxdist, tex Debian 6 eller CentOS 6 och väljer att installera det som en “server” då kommer installationsprogrammet installera det allra nödvändigaste och inte mycket mer, såvida du inte väljer en massa extra paket.

Sedan väljer du att installera dom applikationer du vill ha, tex MySQL, Nginx och PHP. Allt är frid och fröjd så länge din applikation bara har ett fåtal besökare, MEN när besöksantalet växer, applikationen blir mer krävande, du lägger till CPU, RAM och HDD men applikationen går ändå inte fortare, känns det igen?

Allt detta beror på att linux är helt felpaketerat, många av applikationerna, begränsningarna i hur många filer och processer en användare får använda och antalet databastabeller som får vara öppna samtidigt i databasen, är alla konfigurerade för att köras på en mobiltelefon, prestandamässigt åtminstone.

För att ta ett exempel: en större webbapplikation kanske har en 2000 databastabeller, är det en WordPress multisite så kan den mycket väl ha fler, vad sägs om några tusen tabeller? Som standard är den MySQL konfiguration som skeppas med Debian 6 satt med en table_open_cache till 256, det optimala för MySQL är antalet tabeller * max antal joins och i de flesta webbapplikationer gör man fler än 2 joins i en query, säg att man gör 3 joins som mest i en query det gör att table_open_cache borde vara någonstans runt 2000 * 3 dvs 6000. Så istället för att skeppa en liten konfig som standard, skeppa en konfig som låter mig nyttja servern till max.

Ett bättre och ett fel som många springer på och som jag avhandlar i det här blogginlägget är att användarkonton i linux av någon outgrundlig anledning har ett maxtak på 1024 öppna filer. Jag köper att man kanske har det på Ubuntu som är en desktopapplikation, men i Debian som installeras som en server? Hur har man tänkt där?

Det är två exempel på hur sned standardkonfigurationen är, det känns som att när man paketerar linuxdistributionerna så tänker man “Men vi vill ju inte att servern går omkull, så vi konfar allting lågt”. Jag vet att det är ofta är standardkonfigurationen för applikationen som skeppas, och det spelar ingen roll, det är precis lika skevt och det är inte intressant om det är applikationens konfiguration eller om det är en konfiguration gjord av teamet bakom distributionen, det som påverkas i slutändan är användaren och användarupplevelsen.

I min värld så är det helt snett, att nyttja en server till 50% av sin kapacitet är inte ekonomiskt. Säg att du köpt en server för 20 000, och lite tillbehör för 10 000 så din kostnad för servern är 30 000 och kanske 5 000 / månad (man brukar räkna 5500 som kostnaden för en server / månad med underhåll och patchar) om då bara nyttjar servern till 50% då slänger du ju bort 50% av din investering varje månad, och hur sjukt är inte det? I en ideal värld så vill man utnyttja servern så mycket som möjligt, säg att den ligger på 70% vid normal användning och 100% vid en peak, då nyttjar man både sin investering och den energi som går åt att driva och kyla servern maximalt. Här kan man applicera samma tänk som man använder när man pratar om fördelarna med virtualisering, högre utnyttjande av mindre hårdvara är bättre ekonomi och miljö.

I en del fall är det kanske inte hållbart att köra servern tills den kroknar och går ner, utan man vill försöka hålla maskinen online och vill då ha ett max utnyttjande på 90% vid en peak, oavsett så är nyckeln att se över konfigurationen. Om servern utnyttjas till sitt max, då är det också enklare att se vart i sin applikation man ska optimera, man kanske måste snygga till koden, databasen eller tänka över hela sin design, men det kan och ska man inte göra förrän man är säker på att man nyttjar servern till sitt max, eller åtminstone det max man satt upp som företagspolicy.

Det är irrelevant om servern är en VPS eller dedikerat stål, det är ändå i allas intresse att servern utnyttjas till fullo, eller det är åtminstone i kundens intresse, en VPS leverantör tycker nog inte att 100% nyttjande av 100% av maskinerna är sådär superkul. Men det ger kunden mer bang for the buck.

Kan vi inte enas om att se över våra konfigurationer och se till att vi nyttjar våra maskiner så mycket det går?

Högtrafikerade webbsidor med Nginx och PHP-FPM

Nginx och PHP-FPM har blivit något av en standard för högtrafikerade webbsidor, kombinationen en lättviktig webbserver och en vertikalt skalbar scriptmotor med relativt litet avtryck gör att det är ett prisvärt och smidigt sätt att driva sin webbsida.

Av någon anledning så kommer dom flesta linuxdistributioner, och de programpaket som skeppas med en minimal konfiguration, vilket gör att man ganska snabbt stöter på problem och flaskhalsar på grund av lågt satta begränsningar i operativsystemet.

En av de begränsningar man stöter på är att antalet tillåtna file descriptors (FD) för användaren som webbservern och eller PHP-FPM körs som är för lågt satta. Debian 6 skeppas med 1024 file descriptors / användare, och maxantalet i systemet brukar vara runt 3 miljoner. Exakt vilket antal FD man bör ha på användaren är svårt att säga, men förutsatt att servern inte kör fler applikationer än Nginx och PHP-FPM så kan man ta i ganska rejält, på en stor installation jag jobbar med så har användaren en gräns på runt 300 000, men jag kan inte se något fel i att öka den ännu mer.

Att felsöka filedescriptors

Till att börja med så vill man veta hur många FDs som systemet får ha som mest.

# sysctl fs.file-max
fs.file-max = 70000

Nu vet vi att systemet som mest kan ha 70 000 FDs. Hur många FDs används då?

#sysctl fs.file-nr
fs.file-nr = 1020 0 70000

Där 1020 är antalet aktiva filer (file handles), 0 antalet allokerade men inaktiva filer, och 70 000 är max antal. För att ta reda på max antal FDs för en specifik annvändare, logga in som användaren och kör:

#ulimit -Sn
1024
#ulimit -Hn
1024

ulimit talar om för dig hur många FDs som användaren får lov att ha öppna, 1024 är lagom för de flesta, men har du högt trafikerade servrar så kommer du behöva höja, det gör du genom att ändra gränsen i /etc/security/limits.conf

abergman                soft    nofile          65535
abergman                hard    no file          65535

Det gör att min användare, abergman får lov att ha 65535 file descriptors, för att ändringen ska slå igenom så måste webbservern och PHP-FPM startas om.

Referenser för dig som vill läsa mer, även ett stort tack till Tom för att han pekade mig i rätt riktning vad gäller mod_limits i PAM.
http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html
http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
http://research.cs.wisc.edu/condor/condorg/linux_scalability.html

Test av VPS-tjänster

Jag har i två poster(Här och här) gjort ett test av Oderlands VPS-tjänst, och som alla vet så skiljer det en del mellan VPS och VPS. Därför har jag tänkt göra ett test av olika VPS-tjänster, för att testet ska vara trovärdigt och relevant så måste det finnas lite stolpar att jobba efter.

* Det måste vara en VPS
* Det måste finnas en kontrollpanel där jag själv kan starta/stoppa maskinen.
* Det måste vara en linux VPS.

Det är de enda stolparna som krävs för att få vara med, har ni en Microsoft VPS så kan jag testa den med, men testet riktar sig främst till Linuxmaskiner. Jag kommer att testa allt kring maskinen och ju fler funktioner ni har för tjänsten (backup,kontrollpanel, etc) desto roligare. Har ni själva dessutom något som ni är riktigt stolta över och vill att jag testar, säg till!

Vad får ni genom att vara med?

* Jag publicerar namn, länk och testet i sin helhet på abergman.se.
* Ni får lov att fritt använda, citera etc testet i er marknadsföring.

Notera: Det är inte en tävling utan bara ett test, inga poäng eller priser kommer att delas ut.

Vill ni vara med i testet? Skicka ett mail till andreas@abergman.se

Del 2 – Oderland VPS

I forstsättningen av mitt test av en Oderland VPS, där det första intrycket var väldigt gott, fortsätter Oderland att leverera.

Kickstart

Den VPS jag fick var installerad med CentOS, inte någon personlig favorit efter mitt krossade hjärta i den här posten: http://www.abergman.se/oderland-vps/. Men som den vänliga själ jag är så gav jag det ett försök och kort sag: Det bara funkade. Inget meckande med VNC-sessioner för att få igång en SSH server eller annat trams. Apache2 var av någon anledning också installerat, men det kanske är en feature nu för tiden? För det var Apache2 installerat på Debianserver samt den Debian Testing jag installerade lokalt senare under kvällen. Varför man väljer att göra så fattar jag inte, men i sammanhanget så verkar det relativt logiskt.

Ominstallation

Som alla andra VPS-leverantörer med självrespekt så låter Oderland kunden själv installera om OSet om den vill, och det finns en hel del linuxdistar att välja på tex debian, fedora gentoo och en CentOS maskin anpassad för DNS med en cPanel installerat. Jag har inte testat den, men bra tänkt! Jag ominstallerade min maskin med Debian, och det gick fort, jösses va fort det gick! En feature jag inte riktigt bestämt mig för om jag gillar eller inte är att den nya maskinen fick samma rootlösen som min första maskin. Det finns en funktion i kontrollpanelen för att byta rootlösen, och jag antar att de sparar lösenordet för senare användning. Jag ser både för och nackdelar med det, vill jag verkligen att min VPS-leverantör ska spara mitt rootlösen?

Det enda jag direkt har att anmärka på var att apt-källorna inte var uppdaterade när maskinen startade, men det är att vara anal att kräva det.

Backup

Oderland har två backupmetoder, express och central. Expressmetoden gör en backup och placerar filen i din VPS och Central sparar kopian i Oderlands nas. Att göra en centralbackup tog mig inte mer än 5 min och det enda som krävdes var ett klick, som jag fattar det så ingår det även en (1) central backup i månadskostnaden. Att läsa tillbaka backupen efter en rm -rf / på maskinen var lika enkelt och gick lika snabbt.

Allmänt

Generellt så känns maskinen sjukt snabb, och linan in till maskinen är riktigt snabb, jag har inte kollat exakt men jag brukar vara ganska kräsen. Det verkar inte vara några problem med  responstiden eller något packetloss.

Gentoo och EAPI problem.

Jag bytte Profil på min gentooinstallation från 2008.0 till 10 och då slutade helt plötsligt portage att “funka”, alla paket blev masked. Tydligen såhar man infört något som heter EAPI som syftar till att rensa upp i portage och hålla versionerna uppdaterade.

För att lösa problemet så körde jag emerge –nodep portage och emerge –nodep python.

Backup med Rsync

Jag har suttit och läst om backup med rysnc, jag behöver offiste backupa en server och jag vill inte göra en jättestor process av det, utan tycker att rsync med ssh blir lagom. Jag hittade då den här siten: http://www.mikerubel.org/computers/rsync_snapshots/ Nyttig och pedagogisk läsning!

Ställa in klockan i Debian

Jag har under en längre tid haft problem med att klockan på mina servrar har gått fel , det har resulterat i att cronjobb inte gått när jag har tänkt mig och en massa annat irriterande. Men jag har inte riktigt haft ork  att fixa det förrän inatt. Min hårdvaruklocka går inte rätt den är inställd på en helt annan tidszon, men det gör inget för med ett enkelt handgrepp får jag klockan maskinen att gå rätt.

ln -sf /usr/share/zoneinfo/Europe/Stockholm /etc/localtime

Sådär, nu kommer klockan att stå rätt i din maskin, oavsett vad hrårdvaruklockan står på. För att vara säker på att alltid har rätt tid på maskinerna så låter jag dem köra ntpdate-debian en gång / dygn, det gjorde jag genom att helt enkelt lägga en fil med kommandot “ntpdate-debian” i /etc/cron.daily.

Man kan även sätta tidzoner för varje användare med hjälp av kommandot “tzselect”, men det slår bara på den aktuella sessionen och inte på hela maskinen.

HipHop for PHP på Debian (Testing)

I mitt sökande efter bra sätt att optimera prestandan på maskinerna så sprang jag över “HipHop for PHP” som är utvecklat av killarna bakom facebook, som ett sätt för dem att kunna utnyttja sina maskiner bättre. Enligt egen utsago så har de kunnat halvera CPU-belastningen med upp till 50%!

Detta kan de uppnå genom att använda sig av HipHop for PHP som konverterar PHP:t till C++ och sedan kompilerar det, så man kan köra sin PHP-applikation som en demon, antingen direkt på port 80 och slippa ha en webbserver, eller som jag planerar göra; På någon annan obskyr port och använda Nginx som gateway.

Som vanligt när man ska testa något så får man inleda med att installera det, och då HipHop For php är relativt nytt så finns det ännu inga färdiga paket att installera, dessutom så kräver HipHop for PHP en del patchade paket för att funka, så vi är utlämnade till en manuell installation. När jag först skulle installera beroendena så provade jag på Debian Lenny, men tyvärr så fanns inte ett paket som hör ihop med libboost till Stable än, så istället för att försöka haxxa in det manuellt så valde jag att uppdatera burken till testing istället, då kunde jag utan problem dra in alla beroenden.

apt-get install cmake g++ libboost-dev flex bison re2c libmysqlclient14-dev libxml2-dev libmcrypt-dev libicu-dev openssl binutils-dev libcap-dev libgd2-xpm-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev git-core autoconf libtool libcurl4-openssl-dev libboost-system-dev libboost-program-options-dev libboost-filesystem-dev

När det här är installerat, så är det dags att ge sig på HipHop for PHP och de paket som måste patchas och installeras manuellt, som jag uppfattar det så är patcharna skickade till respektive projekt för att komma med i paketet, men det verkar inte vara klart än. Först, ladda hem källkoden för HipHop:

mkdir hiphop
cd hiphop
git clone git://github.com/facebook/hiphop-php
cd hiphop-php
export CMAKE_PREFIX_PATH=`/bin/pwd`/../
export HPHP_HOME=`/bin/pwd`
export HPHP_LIB=`/bin/pwd`/bin
git submodule init
git submodule update
cd ..

Sedan är det dags att ladda ner  och patcha libevent.

wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
tar -xzvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
cp ../hiphop-php/src/third_party/libevent.fb-changes.diff .
patch < libevent.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

Det ska inte vara något problem att kompilera, skulle du köra fast av någon anledning så får du skriva en kommentar så ska jag försöka hjälpa dig! Nästa i tur för att kompileras är ICU4, detta behöver inte patchas utan ska bara installeras.

wget http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-src.tgz
tar -xvzf icu4c-4_2_1-src.tgz
cd icu/source
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ../../

Inga konstigheter där heller, nästa och sista paketet innan HipHop for PHP är libcurl, det är viktigt att komma ihåg -p0 som flagga i patch och att se till att tiden på maskinen är korrekt.

wget http://curl.haxx.se/download/curl-7.20.0.tar.gz
tar -xvzf curl-7.20.0.tar.gz
cd curl-7.20.0
cp ../hiphop-php/src/third_party/libcurl.fb-changes.diff .
patch -p0 < libcurl.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

Så var det dags för det sista innan vi kan testa; Kompilera HipHop for PHP!

cd hiphop-php
cmake .
make

Hela installationsprocessen är ganska straight forward och inga större konstigheter, dock så är den lite tidskrävande om man ska göra den på många maskiner. Hur man sedan använder HipHop återkommer jag med i ett senare inlägg.

För att testa så det fungerar som det ska så ska jag testa HipHop for PHP med ett enkelt “Hello World”-exempel: Läs det här

Källa: http://mediakey.dk/~cc/howto-install-hiphop-for-php-on-ubuntu/ som i sin tur tagit den från http://wiki.github.com/facebook/hiphop-php/building-and-installing-on-ubuntu-910

x86 64 eller x86

Jag behövde nyligen ta reda på om maskinen jag satt på var 64-bitars eller inte, detta av den enkla anledningen att jag planerar att testa HipHop för PHP på den. HipHop är i korthet ett sätt att konvertera PHP till c++ och sedan kompilera det och köra det som en standalone applikation, tanken bakom detta är att spara CPU då PHP är relativt prestandakrävande.

Hur som helst, för att ta reda på om maskinen är en 64 bitars eller 32 bitars så använder man sig av kommandot uname -a, och bör få en output som liknar den nedan.

Linux host.local 2.6.26-2-amd64 #1 SMP Tue Jan 12 22:12:20 UTC 2010 x86_64 GNU/Linux

I mitt fall var det således en 64 bitars maskin, vilket är perfekt, då hiphop än så länge bara funkar på 64 bitar. Om det inte framgår så är det x86_64 i slutet på raden som talar om vad det är för arkitektur.

Den här bloggen

skriver jag, Andreas Bergman, vilket i sig inte bör vara så förvånande. Jag driver en SMS tjänst och jobbar som tekniker/allt i allo på SEA där jag bland annat driftar en stor bloggportal och ett webbhotell. Vi håller även på att bygga ett datacenter.


Jag har några microsoft titlar, ett gäng DELL certifikat och jobbar dagligen med hårt belastade webbservrar. Utöver det jobbar jag också med virtualisering och server/storage. Någon gång ibland säljer jag även server och storagelösningar.

Maila mig gärna om något av ovan, eller annat, jag är ganska trevlig sägs det. andreas@abergman.se.