FAQ |
Kalender |
|
2011-03-09, 16:38 | #1 | ||
|
|||
Nykomling
|
Hej,
Vet att detta varit uppe tidigare, men ingen av trådarna gav mig riktigt den förståelse jag behöver för att kunna optimera Apachen ordentligt. Jag driftar en site med ca 40k besök i månaden, den är väldigt ajax intensiv och rapporterar sportresultat i realtid vilket gör att topparna ligger koncentrerade till helgerna och kan då bli ganska intensiva. Systemet är uppdelat i separata delar, just nu sitter jag och försöker förstå hur man på rätt sätt ska optimera en Apache server. Alla mina servrar är virtuella, servern i fråga är bestyckad med 2x vCPU samt 3GB RAM. Den kör Ubuntu Server 10.04 och kör bara Apachen, inget annat. Jag kör Prefork MPM, vad rekommenderar ni för inställningar? ServerLimit StartServers MinSpareServers MaxSpareServers MaxClients MaxRequestsPerChild Stämmer det att MaxClients är hårdkodat till 256? Kan man se i någon logg ifall man maxat MaxClients? Vad händer när MaxClients går i taket, kommer den droppa anslutningarna eller köa? Om den köar, hur lång kan kön bli innan den börjar droppa? Finns det någon enkelt och bra verktyg för att se statistik från Apachen? Jag har inga problem att sitta och övervaka realtidsdata om det inte finns loggar tillgängliga. |
||
Svara med citat |
2011-03-09, 17:18 | #2 | |||
|
||||
Bara ett inlägg till!
|
Du kan tyvärr inte göra så jättemycket genom att ändra de där inställningarna. Grundproblemet kommer fortfarande att finnas kvar, nämligen att Prefork MPM är oerhört dyr och har mycket dålig gprestanda vid högt besökarantal. Du kan prova att minska KeepAlive så att anslutningarna släpps fortare, men det försämrar också upplevelsen för besökarna då de måste vänta på att webbläsaren skapar en ny anslutning för varje sidvisning.
Det stämmer dock inte att MaxClients är hårdkodat till 256 (var har du hört det?). MaxClients i Prefork har en övre gräns som är lika med inställningen ServerLimit. Vill du öka MaxClients ska du allså även öka ServerLimit. ServerLimit å sin sida har en övre gräns på 20000. Det långsiktiga målet bör nog vara att försöka övergå till Worker MPM eller byta webbserver helt. Den vanligaste orsaken att man kör Prefork är att man har PHP som Apache-modul. Om det är din anledning så försök använda PHP som FastCGI istället så att du kan köra Worker. Kortsiktigt kan du dock slippa göra ändringar i din kod (om den är beroende av att köras som Apache-modul) genom att lägga in en reverse-proxy (något som är bra att ha ändå när man kör Apache). Det är en annan mjukvara som agerar mellanhand och har hand om alla anslutningar. Jag har kört Nginx som reverse-proxy med gott resultat och det finns flera lätta guider för hur du gör. Enkelt ser det då ut så här: Besökare <-> Nginx <-> Apache Nginx tar emot besökaren, håller uppkopplingen vid liv (Keep-Alive) så att sidladdningar går fortare samt kan även konfigureras att helt ta hand om statiskt material såsom bilder om du vill. Då kan du låta Apache ha hand om skript och annat som kräver särskild konfiguration. Vill du att Apache ska få rätt IP-adresser från besökarna kan du då även lägga in modulen mod_rpaf, annars komme Apache se alla anslutningar som om de kommer från localhost. Andra mjukvaror som kan agera reverse-proxy är till exempel Lighttpd och Varnish (den senare är helt och hållet byggd för ändamålet). Apache (eller rättare sagt ditt operativsystem) köar anslutningarna. Kön blir så lång som ditt operativsystem tillåter. Webbläsarna ger dock upp efter någon minut och kopplar ner med ett felmeddelande till besökaren. Du kan hålla kolla på anslutningar, bandbredd och liknande genom modulen mod_info. Senast redigerad av emilv den 2011-03-09 klockan 17:25 |
|||
Svara med citat |
2011-03-09, 17:41 | #3 | ||
|
|||
Nykomling
|
Tack för ett utmärkt svar!
Jag har under tiden sedan jag skrev posten räknat fram avg minnesåtgång per apache2 process genom att köra "ps -ylC apache2 --sort:rss", in i Excel, summera och dela med resultatet 10mb/process (räknat på ca 220 processer). Om nu detta stämmer borde jag väl kunna sätta MaxClients till närmare 300 utan att riskera swapping? Eller är det max 256 clients? Plattformen är egenutvecklad och jag har ingen anledning till att köra prefork mer än att det var standard och att jag försökte konfa worker mpm men misslyckades. Ska jag ge mig på någon fundamental ändring av servern är det lika bra att gå över till en annan webserver direkt, men detta är något jag får göra vid sidan om produktionssystemet. Att köa anrop i upp till minuten är inte intressant, kan systemet inte svara inom 10sec kan det lika gärna droppa anropet... Hur skulle en bra uppsatt PHP server se ut? Jag har inte tid att lägga på manuellt arbete med servrarna hela tiden utan vill hålla mig till standard installationer så gott det går. Ubuntu apt-get *mmm* Jag har väldigt lite statiskt material, bara js, css samt bilder i designen, resten ligger i databaser och genereras vid efterfrågan. Ok, några tyngre script körs via cron och resultatet är statiskt tillgängligt för besökarna. Så jag vet inte hur mycket dubbla webservrar statiskt/dynamisk skulle hjälpa mig? Något jag borde intallera är en php cache, men har inte haft möjlighet att sätta mig in i det ännu. Vad är det som rekommenderas här? Många frågor blir det =) |
||
Svara med citat |
2011-03-09, 18:07 | #4 | |||
|
||||
Bara ett inlägg till!
|
En mycket enkel och bra PHP-cache är APC som finns i paketarkivet. Lägg in, kolla i PHP:s konfiguration att den är aktiverad och sedan startar du om Apache.
Du kan ju faktiskt sätta gränsen högre så att vissa delar swappas, även om jag fortfarande tycker att Prefork är fel väg att gå. Mycket av minnet i varje process används inte och det kommer därför inte att läsas in från swappen heller. Försök även minska minnesanvändningen genom att: *) Stänga av alla Apache-moduler du inte använder *) Om du kör PHP som Apache-modul, sätt MaxRequestsPerChild till ett lågt tal eftersom Apache är dåligt på att lämna tillbaka minne som PHP använt. Här har du en guide för att installera och konfigurera Apache som Worker MPM med PHP som FastCGI: http://ubuntuforums.org/showthread.php?t=1038416 Det mesta där görs med pakethanteraren. Två stora fördelar med detta: *) Mycket bättre prestanda i Apache (du kan utan problem hantera tusentals samtidiga uppkopplingar) *) Mycket bättre minnesanvändning när du blir av med mod_php |
|||
Svara med citat |
2011-03-09, 23:16 | #5 | ||
|
|||
Nykomling
|
Det är också viktigt att du cachar all data så hårt det går för att minska belastningen på databasen. Jag har gjort en likadan sida som den du beskriver och det vi gjorde för att minska loaden var att flytta livescoredatan till memcached och apc och köra genom nginx istället för apache.
|
||
Svara med citat |
2011-03-11, 16:36 | #6 | |||
|
||||
Klarade millennium-buggen
|
Att köra php i apache worker är inte att rekommendera, php är inte trådsäkert, vad du ska göra är att köra nginx och php-fpm, howto har du här: http://www.howtoforge.com/installing...-ubuntu-debian Sedan kan du sätta tex varnish framför.
|
|||
Svara med citat |
2011-03-11, 18:20 | #7 | |||
|
||||
Mycket flitig postare
|
När det gäller PHP + Apache tycker jag att en php-cache är det första man skall installera om man vill optimera. Själv kör jag eAccelerator, en php-cache brukar halvera belastningen på servern.
|
|||
Svara med citat |
2011-03-12, 23:26 | #8 | |||
|
||||
Medlem
|
40k besök/månad är åas inte särskilt mycket. Hur många samtidiga besökare har du vid toppar? Hur ofta uppdateras ajaxinformationen för dessa besökare?
Även om du skulle få 40k besök på en dag är det bara 1 besök varannan sekund. Även med 40000k besök på en timme - 11 besök per sekund bör inte vara några större problem med en standardinstallation. Sen beror det så klart på hur effektiv koden är skriven och hur ofta den måste laddas om. |
|||
Svara med citat |
2011-03-15, 19:41 | #9 | |||
|
||||
Har WN som tidsfördriv
|
Jag skulle också rekommendera Nginx med PHP-FPM och eventuellt Varnish eller Squid-cache som reverse proxy med cache. Vet inte riktigt vilken som är bäst, men de flesta verkar förespråka Varnish på det hör forumet.
Sedan är op-code cache lätt att installera, jag rekommenderar APC. För att minska belastningen på databasen är memcached suveränt, men kräver att du skriver om koden en del och det verkar ju inte riktigt vara det som är problemet här. Citat:
|
|||
Svara med citat |
2011-03-14, 12:39 | #10 | ||
|
|||
Har WN som tidsfördriv
|
Om du har problem med många requests i dina AJAX-lösningar kanske du ska kika på att använda websockets istället för xmlHTTPrequest. Skalar betydligt bättre och genom att använda exempelvis www.socket.io får du bakåtkompatibilitet med icke-HTML5 webbläsare.
|
||
Svara med citat |
Svara |
|
|