PDA

Bekijk Volledige Versie : Mysql op meerdere CPU's



Zideo
03/03/09, 17:36
Hallo,

Ik draai op dit moment mysql 5 64 bits op windows 2003 64 bits.
De server is voorzien van 2 quad core processors en 8 GB RAM.
Ik heb thread concurrency op 20 gezet.
Maar toch gebruikt de Server alleen core 4 en core 8.

Heeft iemand een idee hoe we dit kunnen optimaliseren?

Groeten Bert

systemdeveloper
03/03/09, 18:43
De server is dan wel multithreaded maar de client connecties worden door een single thread afgehandeld. Als je dus queries over 1 connectie verstuurt, zal maar 1 core per proc gebruikt worden. Zodra je meer connecties hebt, zouden meer cores gebruikt moeten worden (als je config ok is).

Zideo
03/03/09, 20:12
Bedankt voor je reactie.

Zijn er dan bepaalde instellingen waar ik op moet letten voor de configuratie om MySQL over meerdere processoren te laten verlopen?

systemdeveloper
03/03/09, 21:05
Bedankt voor je reactie.

Zijn er dan bepaalde instellingen waar ik op moet letten voor de configuratie om MySQL over meerdere processoren te laten verlopen?
Die zullen wel ok zijn anders zou het niet op core 4 en 8 draaien.
Overigens zijn er 3 dingen die echt van belang zijn voor een database:
- beter 1 proc van 3 ghz dan 2 van 2 ghz.
- hoe sneller de disk, hoe sneller je db (eerste bottleneck op een geoptimaliseerde db is meestal de schijf.
- meer geheugen kan helpen, maar je moet eerst goed uitzoeken of meer geheugen uberhaupt gaat helpen. Een 'foute' query kan je amper sneller maken door er hardware tegenaan te smijten tenslotte.

Zideo
03/03/09, 21:10
We draaien op een HP dl360 net 2 x een QuadCore xeon 5335 processor 2Ghz.
De database staat op een losse 15k sas schijvenset in een raid1 configuratie (dus apart van het OS)

Lijkt me op zich een solide configuratie voor den dedicated database systeem. De queries zijn verder geoptimaliseerd, en met slow query log wordt bijgehouden waar de bottlenecks zitten qua sql.

Maar met welke instellingen kan dit gewijzigd worden.. Met thread concurrency mocht ik volgens my.ini 2x het aantal cores opgeven. Maar toch wordt alsnog alleen core 4 en 8 gebruikt...

systemdeveloper
03/03/09, 21:32
Als freebsd dude heeft een quadcore voor mij meestal maar 1 doel op een db server: het sneller kunnen rebuilden van mysql (al zal dat op een windows bak niet zo gemakkelijk zijn).

Maar het gebruiken van 1 core, al is het op 99%, terwijl de rest idle draait, is onder linux geween een keuze van de scheduler. Switchen tussen cores kost overhead, net zoals switches tussen threads, als de kernel denkt dat het proces beter af is op 1 core, dan draait het op 1 core. Is 1 core (4) niet genoeg, dan is de volgende core aan de beurt (bij voorkeur een core (8) op een andere processor).. etc.
Dus, of een hogere load veroorzaken, of meer connecties die parallel queries uitvoeren.
Het is dus echt niet dan een specifieke query sneller draait op een quad core of zo.

Deels van bovenstaande zal wellicht ook op windows van toepassing zijn.
Dus settings zul je niet zo naar hoeven te kijken, denk ik. Gewoon harder op zijn flikker geven dat ding :)

NB: Als je ter test 10000 dezelfde queries stuurt dan kun je nog met andere dingen te maken krijgen die je performance verknallen. table-locks, query-cache, exponentieel oplopen van temptables, swappen van index data indien de buffers niet toereikend zijn meer, etc.

<sting>Kan ook zijn dat windoos die andere 6 cores nodig heeft om zichzelf in de lucht te houden...</sting>

Zideo
19/03/09, 09:46
Het klinkt heel begrijpelijk... Misschien is de server wel beter af om de threads in 2 cores te laden... Immers de cores worden ook nog maar voor 40% gebruikt... dat is 10% van de 8 cores...

Zijn er verder nog windows mensen die hier ervaring mee hebben? Of moet een mysql server het gewoon niet zwaar hebben qua processor load?

electric
22/03/09, 11:48
Database servers hebben vaker meer baat met Snellere schijven en veel geheugen dan veel CPU capaciteit.

Het geheugen bereik kan je instellen in de config van mysql hoeveel deze mag gebruiken.
Als de server enkel voor Mysql draait kan je die gerust op 80% van je totaal geheugen zetten.

Zideo
22/03/09, 14:00
Welke Geheugeninstellingen zijn dan het belangrijkst?
Er staan tal van geheugen instellingen in MySQL

electric
22/03/09, 14:13
Dit zijn de meest belangrijke geheugen instellingen:

max_heap_table_size
tmp_table_size
table_cache
query_cache_size
key_buffer

Het beste is om deze op te zoeken in de manual van mysql en de juiste settings te plaatsen.

Zideo
22/03/09, 16:24
Ik heb gekeken in de mysql manual maar de precieze samenhang van alle instellingen kon ik er ook niet echt uithalen. Ik denk dat dit een kwestie van ervaring is... Misschien kan je me een beetje op wel helpen.. Ik draai nu dus op een 6gb server en mijn windows task manager staat continu op 5.7 GB..

max_heap_table_size
De max Heap table size komt nu niet in mijn my.ini voor... Ik zag hem wel in de andere my.ini voorbeelden staan in mijn mysql map. Waar is deze waarde precies voor? En welke waarde kan je het beste instellen als je de ini setting toe zou voegen aan je my.ini?

tmp_table_size
Mijn tmp_table_size staat op :: 256M

table_cache
Mijn table_cache staat op :: 1520

query_cache_size
Mijn query_cache_size staat op 700M

key_buffer
Mijn key buffer size staat op ::=700M

electric
22/03/09, 17:16
max_heap_table_size = 2048M
tmp_table_size = 512M
table_cache = 8k

Je query_cache_size & key_buffer zijn veelste hoog.

query_cache_size = 2M
key_buffer = 4M

Zijn groot genoeg.

Hier kan je al veel preformance uithalen.
Voor linux is er ook een tuning programma die het e.e.a nakijkt, ik weet niet of deze er ook voor windows is.

Zideo
22/03/09, 21:27
Wat is dan precies dat max_heap_table_size? Deze staat nu gewoon helemaal niet in mijn my.ini...

Hoe heet trouwens dat tuning programma?

Groeten Bert

systemdeveloper
22/03/09, 23:04
mysqltuner: http://www.howtoforge.com/tuning-mysql-performance-with-mysqltuner

Default heb je een aantal configs zoals my-large.cnf, my-huge.cnf die een basis config hebben voor servers met een bepaalde hoeveelheid ram. Met 1 van die zou je kunnen beginnen.
Daarna moet je om de paar dagen eens bovenstaand scriptje draaien en kijken of er nog tips uitkomen. Hier even uitleggen hoe alle settings zich tot elkaar verhouden is ondoenlijk, want daar worden complete boeken over geschreven.

max_heap geeft aan hoeveel de mysql engine aan geheugen mag gebruiken. Dit moet dus per definitie hoger staan dan je tmp_table_size. Je kunt die gelijk aan elkaar maken, maar je moet er een beetje mee spelen afhankelijk van het aantal temptables dat daadwerkelijk wordt gemaakt op de server en je hoeveelheid geheugen.

table_cache is een waarde die een aantal filehandles reserveert en indien die waarde hoog genoeg is, zal mysql niet telkens je tabellen fysiek moeten openen, flushen en sluiten. Kun je dus redelijk performance mee halen, maar als je hem te hoog zet, verspil je geheugen.

query_cache_size en limit heeft helemaal geen optimale settings. Deze params zorgen ervoor dat bepaalde mysqlqueries gecached kunnen worden en bij een herhaalde aanroep niet meer opnieuw gecompileerd/geoptimaliseerd hoeven te worden. Bepaalde queries kunnen gewoon niet gecached worden, andere wel weer. Speel ermee, totdat je zo zoveel mogelijk cacheble queries daarin krijgt. Hoe beter gevuld, hoe hoger de performance.

De keybuffer geeft aan hoeveel ruimte er gebruikt word om indexen te cachen. Als je indexgrootte van je tabellen bv. 200mb, dan zet je key_buffer ook op 200 mb. Na een paar dagen (of een goede mysql-slap) kun je kijken in hoeverre je keybuffer gevuld is. Probeer hier een vulling van tegen de 100% te krijgen. Als indexen helemaal in je geheugen zitten, spaar je een zooi disk io.

mysql tunen gaat niet 'snel' en is zeer afhankelijk van je database gebruik door je applicaties. Je moet regelmatig checken (in principe) of het nog wel allemaal goed is, aangezien in de loop van de tijd ook je tabellen, indexen, e.d. veranderen.

frvge
23/03/09, 01:59
Je zou meerdere instances van memcached kunnen gebruiken. Gebruikt voornamelijk RAM, en is sneller. Zo heb je iig meer gebruik van je server, MySQL zelf zal er niet over meer cores over gaan draaien helaas.

Zideo
23/03/09, 09:17
Thanks systeemdeveloper een heldere uitleg en uiteenzetting van de begrippen.... De waardes die Systeemdeveloper en electric adviseren lopen echter nog wat uiteen... Zijn er misschien andere mensen die hier een mening over hebben?