WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL prestandaproblem (https://www.wn.se/forum/showthread.php?t=11743)

Fredrikl 2006-01-11 20:20

Hej

Vi driver ett litet onlinedatorspel med php/mysql som bas och har väldiga problem med mySQLs prestanda. mySQL håller på att bli vår största bottleneck och iom att gängse uppfattningen är att den skall vara grymt snabb så misstänker jag att det är vi som är klåpare på att sätta upp den korrekt och inte tillverkarna som gjort en värdelös databasserver.

Vårt databasserver har följande hårdvara.
AMD sempron 3000+
512M Ram
80 gigs SATA hd

vi kör mySQL version 4.1 på windows 2k.

Som det är nu så börjar vår site "sega" sig vid ca 25-30 samtida användare(normalt webbsideklickande) och det känns väldigt få. Är det någon som kan uppskatta om det är normalt? om inte vad borde det ligga på ungefär? och sist men inte minst är det någon som har en aning om vad vi skall göra för att få upp prestandan? (har micklat med cachevärden, connections, trådar och index men inget hjälper)

/Fredrik

acidflash 2006-01-11 21:16

Du säger att du kör Windows 2k, är de server version eller enbart en klient? För är de en klient så kan de förklara varför de ballar ur.

eg0master 2006-01-11 21:18

Hur ser databasen ut (tabell och index definitioner) samt hur ser de frågor ut som typiskt körs varje gång en sida laddas.

Jag frågar för jag tror som sagt att det rör sig om att ni gjort något designfel elelr missat någon optimering.

WizKid 2006-01-11 21:19

Det jag brukar göra är att installera mytop som är som top fast för mysql. Gör det enklare att övervaka vilka frågor det är som tar tid. Man får även ut siffror som antal frågor per sekund, hur stor procent av frågorna som cachas mm. Ofta brukar det vara en eller några få frågor som slöar ner. När jag väl hittat vilka det är så är det bara börja trixa med EXPLAIN för att se varför just de är långsamma. Detta hjälper ju ioförsig inte om det är hårdvaran som är flaskhalsen men själv tycker jag den burken borde klara med, men det beror självklart vilka frågor och antal frågor som ställs.

För optimering av MySQL skulle jag tipsa om boken: http://highperformancemysql.com/ . Själv hade jag enorm nytta av den.

Kristofer 2006-01-11 21:38

20-30 samtida onlinebesökare på en websida låter väldigt lite, brukar gå att ha betydligt fler innan det blir bekymmer.

Jag misstänker att ni antingen har sjukt många databasförfrågningar och / eller kodat sidan på ett klumpigt sätt som kräver onödiga resurser i samband med dessa. Ni kanske har moment då ni låser databasen för att göra en uppdatering ofta och därför upplevs den som seg?

kullervo 2006-01-11 22:19

Just nu är det 600 pers online på min största sajt. Totalt kör MySQL 130 frågor per sekund på den servern. Enbart MyISAM- samt HEAP-tabeller. Det är ca. 10% av CPU:n kapacitet. Burken är en P4 2,8GHz.

Om ni bara vill ha generella tips för ökad prestanda föreslår jag att ni läser kapitlet om optimering i manualen.

danjel 2006-01-12 12:20

MyISAM tabeller brukade vara sega vid updates pga att de låste hela tabellen..kanske kan va nåt att kolla på

Server side cachning - verkar som väldigt få använder det (?) men väldigt ofta kan man ju cacha html:en som genereras på många sidor ..kan ju drastiskt minska antalet db-anrop

b_andersson 2006-01-12 12:28

Citat:

Originally posted by danjel@Jan 12 2006, 12:20

Server side cachning - verkar som väldigt få använder det (?) men väldigt ofta kan man ju cacha html:en som genereras på många sidor ..kan ju drastiskt minska antalet db-anrop

Jag använder JPcache på ett par sidor som inte uppdateras SÅ ofta, det minskar belastningen en hel del.

Men bäst är som sagt tidigare att se över koden, mysql klarar väldigt många anrop/sek så länge allt är ok.

//Björn

Fredrikl 2006-01-12 15:08

Tack för alla bra svar.

Tabm skall jag förklara lite mer hur vår databas ser ut. Den består av ca 60 stycken innodb tabeller med varierande grad av fk connections och datamängd från ett par tusen till ett par miljoner rader. Det finns säkerligen både bra och dålig design bland alla dessa tabeller och ännu troligare finns det dåliga sqlsatser. Men det är inte det som är vårat stora problem. (tror vi inte iaf)

Vi gjorde idag ett litet testprogram för att jämföra de 2 databaser vi har tillgång till (extremt ovetenskapligt och missvisande men iaf) för att visa vilka stora skillnader det är. Tillverkade ett litet delphiprogg som ansluter till mysql via odbc och till en paradoxtabell BDE. Databasen består i bägge fallen av en enkel tabell med ett index och ett intvärde. Delphiprogrammet klarar då runt 56 000 inserts i sekunden till paradoxtabellen men endast runt 30 inserts per sekund till mysqltabellen. Jag har också skrivit en enkel phpsida med en loop som insertar i samma mysql-tabell och den klarar ca 58 inserts i sekunden. Det vill säga mysql-insertsen kör extremt mycket långsammare. Jag har även testat med delete och edit och i de fallen är skillnaderna ännu större.

Visst det är olika metoder och olika connectionsätt men att det skall skilja så mycket känns inte rätt. Det vi funderar över är om mysql skall vara så här slött. Låter det rimligt med under 100 inserts i sekunden eller ligger vi en faktor 1000 fel?

Vi kör klientversionen av win 2k, möjligt att vår enda chance är att testa ett annat os men då det kräver en hel massa arbete så känns det som en sista utväg.

danjel 2006-01-12 15:42

Har du en tabell struktur ?

vco-systems 2006-01-12 20:53

Citat:

Originally posted by Fredrikl@Jan 12 2006, 16:08
Vi kör klientversionen av win 2k, möjligt att vår enda chance är att testa ett annat os men då det kräver en hel massa arbete så känns det som en sista utväg.
Om det var skrivet i PHP/MySQL borde det väl vara väldigt enkelt att testa på en linux-server?

Susanne 2006-01-12 22:52

Möjliga felkällor:

- Konfigurationen av MySQL
- Maintenance av databasen behöver köras

PRQ 2006-01-12 23:29

Nu vet jag inget om hur din site ser ut under huven, men 130 queries/sekund för 600 samtidiga users är ganska mycket. Dock ska MySQL klara mer än så. Har du trimmat din my.cnf?

Crotalus 2006-01-13 03:01

Övervaka burken och se var flaskhalsen ligger nånstans, kolla diskstats/cpu etc.

Hur stor är databasen på disk med index och allting? Ju mer av databasen som ligger konstant i ram desto bättre. Jag gissar att 512 mb kan vara alldeles för lite i det här fallet. Kanske att den hela tiden måste läsa in data från disk samtidigt som den skriver till densamma.

~100 inserts / sekund är inte speciellt slött om du bara har en hårddisk, med tanke på ovanstående.

Fredrikl 2006-01-13 08:58

Vi är medvetna om att vår tabellstruktur och sitekod kan vara dålig men det är egentligen inte det vi undrar. Vår fråga är egentligen "Hur snabb är en mysqlserver?". Som jag skrev igår så gjorde vi en helt ny databas inehållande endas 1 tabell. I tabellen finns enbart 2 intfält, ett index och ett värde. De siffror jag gav gäller skrivningar till denna enkla tabell. Inserts till en databas som ser ut så borde kunna ge ett relativt bra sätt att jämföra om prestandan för själva mysql ligger 1000 ggr lägre än man kan förvänta sig. Vi har 5 olika datorer som vi kör mysql på (samtliga windowsmaskiner) och de ger alla ungefär samma (vad vi tycker) dåliga resultat. Vi behöver därför först och främst information om vad en mysqlserver borde ha i prestanda. Givetvis är detta beroende av hårdvara men det borde ju vara möjligt att se om vi har 10 eller 10 000 ggr slöare installation.

Riverboy 2006-01-14 22:11

Om det är den sinda som står på din sida, så kan jag hålla med att den är seg. Jag tycker det tar lång tid att ladda ifrån den, men framför allt bilderna på sidan? Ligger de i databasen? Vad har ni för lina ut egentligen?

Henrik Larsson 2006-01-15 01:07

Citat:

Originally posted by Riverboy@Jan 14 2006, 23:11
Vad har ni för lina ut egentligen?
Verkar vara en Bostream-uppkoppling med packet loss. RTT ligger just nu på 290-350 ms.

kullervo 2006-01-16 10:36

Citat:

Originally posted by PRQ@Jan 12 2006, 23:29
Nu vet jag inget om hur din site ser ut under huven, men 130 queries/sekund för 600 samtidiga users är ganska mycket. Dock ska MySQL klara mer än så. Har du trimmat din my.cnf?
Trimmat och trimmat. Jag har sett till att inte någon buffert eller cache är så liten att det blir en flaskhals. I stort sett har jag tagit my-huge.cnf och minskat lite på buffrar och cachar. Jag har dock en väldigt hög query cache hitrate. Den ligger runt 98%. Det bror dels på hur sajten ser ut men också delvis på att jag ändrar så lite som möjigt i databasen. Jag brukar lagra timestamps då en viss cell senast blev uppdaterad och se till att inte uppdatera oftare än nödvändigt. Key efficiency ligger givetvis på 100%.

Det jag trimmat är SQL-koden som körs av sajten. I stort sätt alla tabeller fixed lenght. Använder heap-tabeller så mycket som möjligt. T.ex. för att hålla reda på sessioner, statistik och sökresultat. Statistiken från heap-tabellen dumpas sedan var 20:e minut till en MyISAM för permanent lagring. Alla konstiga SQL-frågor (t.ex. när det blir många relationer) är prestandatestade på en gammal Pentium2-maskin som kör en backup av den skarpa databasen. Dessutom är alla dessa frågor körda med EXPAIN för att se att jag inte missat något index.

MySQL Administrator har jag stor hjälp av. Med det programmet kan man se all möjlig statistik på ett översiktligt sätt. Dessutom står det kommenterat vilka värden som är friskt. Visst kan man plocka ut den statistiken med SQL-kod istället, men det är mer omständigt.


Alla tider är GMT +2. Klockan är nu 09:44.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson