MySQL Server Konfiguration für hohe Ansprüche

26/10/2008 - 15:47 von Alexander Griesser | Report spam
Griass eich,

ich habe seit einiger Zeit bei einem Kundenserver ein "Problem".
Die Hauptaufgabe des Servers ist die Bereitstellung eines phpBB Forums,
welches stark frequentiert wird und hie und da auch mal gerne mit
DDOS Angriffen bombadiert wird.

Vor ein paar Tagen wars mal wieder soweit und dank ausreichend
pràventiver Maßnahmen, blieb der Server wunderbar online, allerdings
stieg die Load auf über 100 und er brauchte einfach ewig lange für
die Abarbeitung der Requests.

Der Webserver selbst war nahezu unausgelastet, aber der mysqld lief
mit bis zu 280% CPU Leistung (Quad Core) und war in dieser Situation
definitiv das Bottleneck.

Jetzt hab ich schon versucht ein wenig an der MySQL Konfiguration
zu tunen um dem Ding einfach mehr Ressourcen zu gewàhren, hat aber
auch nicht wirklich was gebracht, im Prinzip ist das Ding noch immer
das Bottleneck wenn wir unter hoher Load stehn.

Was tun?

Kann ich irgendwie zwei Instanzen von mysqld auf einem Server laufen
lassen, die auf die selbe Datenbank zugreifen oder kann ich dem
mysqld irgendwie mitteilen, dass er gefàlligst so ziemlich einiges
parallel machen soll und nicht immer bremst?

Mir ist schon klar, dass wenn eine Applikation einen Lock auf eine
Tabelle anfordert, dann dauert das halt mal lànger, bis die wieder
verfügbar ist. Bei phpbb kann man sich zwar nie so sicher sein, aber
ich glaube nicht, dass dies dort der Fall ist.


Anbei meine my.cnf.
Der Server hat 2GB Hauptspeicher und 4 Cores.

Danke && ciao,
Alex




[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
language = /usr/share/mysql/english
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 384M
max_allowed_packet = 1M
thread_cache_size = 8
myisam-recover = BACKUP
myisam_sort_buffer_size = 64M
max_connections = 2000
thread_concurrency = 8
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
query_cache_size = 32M
expire_logs_days = 10
max_binlog_size = 100M
skip-bdb
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
!includedir /etc/mysql/conf.d/
 

Lesen sie die antworten

#1 Peter J. Holzer
26/10/2008 - 17:19 | Warnen spam
On 2008-10-26 14:47, Alexander Griesser wrote:
Der Webserver selbst war nahezu unausgelastet, aber der mysqld lief
mit bis zu 280% CPU Leistung (Quad Core) und war in dieser Situation
definitiv das Bottleneck.

Jetzt hab ich schon versucht ein wenig an der MySQL Konfiguration
zu tunen um dem Ding einfach mehr Ressourcen zu gewàhren, hat aber
auch nicht wirklich was gebracht, im Prinzip ist das Ding noch immer
das Bottleneck wenn wir unter hoher Load stehn.

Was tun?

Kann ich irgendwie zwei Instanzen von mysqld auf einem Server laufen
lassen, die auf die selbe Datenbank zugreifen oder kann ich dem
mysqld irgendwie mitteilen, dass er gefàlligst so ziemlich einiges
parallel machen soll und nicht immer bremst?



Wenn der mysqld auf einer Quad-Core Maschine bereits 280% CPU-Leistung
verbràt, dann bringt weitere Parallelisierung auf der gleichen Maschine
wahrscheinlich nicht mehr viel. Den Rest der Zeit verbringt er
wahrscheinlich damit, auf die Disk zu warten.

Was mir so einfàllt:

* Wenn das Working Set der Datenbank größer ist als der Buffer Cache,
aber klein genug, dass man es mit einem RAM-Upgrade in den Buffer
Cache bekommen könnte, dann ist ein RAM-Upgrade wahrscheinlich die
schnellste und billigste Lösung. Aber damit kommst Du bestenfalls von
280% auf 400% CPU-Auslastung, der Rest bleibt gleich, also ein
Verbesserungspotential von 42%.

* Wenn die Datenbankzugriffe hauptsàchlich Lesezugriffe sind, kann man
die Datenbank möglicherweise auf mehrere Maschinen replizieren (hàngt
vom phpBB Code ab - schreiben kann man nur auf den Master). Potential
100% für jede zusàtzliche Maschine.

* phpBB profilen, die Queries, die die meiste Zeit verbraten,
identifizieren[1] und entweder optimieren oder vermeiden. Vor allem
letzteres ist erstaunlich oft möglich (man glaubt gar nicht, wie oft
Daten aus einer Datenbank abgefragt werden, die die Applikation eh
schon hat). Zum Cachen von Datenbankabfragen (oder anderen aufwàndigen
Operationen) ist der memcached gut geeignet.

hp

[1] Zu Oracle und Perl könnte ich da einiges sagen. Mit MySQL und PHP
habe ich wenig bis keine Erfahrung beim Performancetunen. MySQL hat
ein "slow query log", aber das wird in der Situation eher wenig
helfen, weil Du vermutlich eher viele kurze Queries hast. Das
general query log enthàlt leider keine Laufzeiten.

Ähnliche fragen