Hilfe mit MySql Optimierung

svenni

New Member
Hallo zusammen!

ich habe eine ziemlich große torrent-seite auf einem Dual Quadcore Server mit 32 GB ram und habe in letzter Zeit immer öfter Probleme mit der SQl Datenbank.

Hier mal ein top:
Code:
top - 23:15:54 up  3:09,  1 user,  load average: 51.57, 36.70, 34.21
Tasks: 782 total,   1 running, 781 sleeping,   0 stopped,   0 zombie
Cpu(s): 17.8%us, 14.9%sy,  0.0%ni, 65.2%id,  1.7%wa,  0.1%hi,  0.3%si,  0.0%st
Mem:  33279136k total,  3518044k used, 29761092k free,    68592k buffers
Swap:  2650684k total,        0k used,  2650684k free,   792348k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 9073 mysql     16   0  934m 339m 5372 D  190  1.0  53:53.51 mysqld             
10645 www-data  15   0 62288  16m  10m S    4  0.0   0:01.64 apache2            
12129 www-data  15   0 64168  16m 8712 S    2  0.1   0:00.56 apache2            
 6423 www-data  15   0 64752  18m  10m S    1  0.1   0:03.25 apache2            
 6529 www-data  15   0 63384  16m 9600 S    1  0.1   0:02.89 apache2            
 6846 www-data  15   0 65300  18m   9m S    1  0.1   0:02.77 apache2            
 7541 www-data  15   0 64260  16m 8540 S    1  0.1   0:02.56 apache2            
11454 www-data  15   0 61348  10m 5580 S    1  0.0   0:01.19 apache2            
12326 www-data  15   0 61148  10m 5428 S    1  0.0   0:00.33 apache2            
12346 www-data  15   0 60324 9528 5284 S    1  0.0   0:00.26 apache2            
12435 www-data  15   0 65456  14m 5368 S    1  0.0   0:00.22 apache2            
12451 www-data  16   0 60392 9780 5464 S    1  0.0   0:00.22 apache2            
12492 www-data  15   0 63320  12m 5440 S    1  0.0   0:00.27 apache2            
12728 www-data  15   0 60672  12m 8320 S    1  0.0   0:00.21 apache2            
12833 www-data  15   0 60064 9352 5224 S    1  0.0   0:00.17 apache2            
13027 www-data  15   0 60252 8880 4704 S    1  0.0   0:00.06 apache2

wie ihr seht haben Harddisks und CPU eigentlich nicht wirklich viel zu tun doch Mysql ackert ganz schön und erzeugt dadurch wahrscheinlichen hohe Serverlast.

Frage: wie kann ich die my.cnf optimieren, damit Mysql mehr ressourcen zugewiesen werden und die Performance steigt?
Hier mal meine my.cnf (relevanter teil):
Code:
# * Fine Tuning
#
max_connections = 3500
key_buffer = 256M
myisam_sort_buffer_size = 64M
join_buffer_size = 2M
read_buffer_size = 1M
sort_buffer_size = 6M
table_cache = 9000
thread_cache_size = 440
wait_timeout = 45
connect_timeout = 10
tmp_table_size = 160M
max_heap_table_size = 64M
max_allowed_packet = 64M
net_buffer_length = 16384
max_connect_errors = 10
thread_concurrency = 4
read_rnd_buffer_size = 786432
bulk_insert_buffer_size = 8M
query_cache_limit = 8M
query_cache_size = 192M
query_cache_type = 1
query_prealloc_size = 262144
query_alloc_block_size = 65536
transaction_alloc_block_size = 8192
transaction_prealloc_size = 4096

ich bin dankbar für jede Hilfe!:(
 
jo danke dir, letztendlich war es ein Angriff auf den Server und hatte nichts mit der Optimierung zu tun ;)
 
Dual Quadcore Server mit 32 GB ram

diese 32 GB RAM teilst du auf

1. Apache httpd Prozesse (MaxClients)
2. MySQL (Buffers, Caches, Threads, max_connections)

Jede Verbindung zum Server benötigt einen httpd Prozess und jeder httpd Prozess benötigt ~ 15 MB RAM.

Die Anzahl der zur Verfügung stehenden httpd Prozesse wird in der Apache Konfigurations Datei angegeben.
Code:
/etc/httpd/conf/httpd.conf

<IfModule prefork.c>
StartServers       50
MinSpareServers    25
MaxSpareServers    50
ServerLimit       500
[COLOR="Red"]MaxClients        500   (httpd Prozesse!)[/COLOR]
MaxRequestsPerChild  4000     
</IfModule>

Apache benötigt so im Extremfall ~ 7,5 GB RAM. Linux und qmail ect. benötigen nochmal ca. 200 MB RAM. Die restlichen 24 GB kannst du MySQL zur Verfügung stellen.

Dazu mußt du das Tuning-Primer.sh Script laufen lassen und dann die Variablen in der
Code:
/etc/my.cnf
auf Werte stellen, daß im Tuning-Primer.sh Script
Code:
MEMORY USAGE
Max Memory Ever Allocated : 
Configured Max Per-thread Buffers :
Configured Max Global Buffers :
[COLOR="Red"]Configured Max Memory Limit : 24 GB[/COLOR]

nicht überschritten wird. Setze die Variable max_connections = 500 und mache dann die Buffers, Caches, Threads so groß/klein, daß Configured Max Memory Limit : 24 GB nicht überschritten wird.

Zudem solltest du in der Apache Konfigurationsdatei
Code:
/etc/httpd/conf/httpd.conf
folgende Einträge machen.
Code:
Timeout 30
KeepAlive On
MaxKeepAliveRequests 150
KeepAliveTimeout 2
 
Last edited by a moderator:
Code:
# * Fine Tuning

max_connections = 3500 [COLOR="Red"]zu hoch, 500 reichen[/COLOR]
key_buffer = 256M
myisam_sort_buffer_size = 64M
join_buffer_size = 2M [COLOR="Red"]wird zu klein sein[/COLOR]
read_buffer_size = 1M
sort_buffer_size = 6M
table_cache = 9000 [COLOR="Red"]wird zu hoch sein[/COLOR]
thread_cache_size = 440 [COLOR="Red"]wird zu hoch sein[/COLOR]
wait_timeout = 45 [COLOR="Red"]weglassen[/COLOR]
connect_timeout = 10 [COLOR="Red"]weglassen[/COLOR]
tmp_table_size = 160M
max_heap_table_size = 64M
max_allowed_packet = 64M
net_buffer_length = [COLOR="Red"]8K[/COLOR]
max_connect_errors = 10
thread_concurrency = 4
read_rnd_buffer_size =[COLOR="Red"] 2M[/COLOR]
bulk_insert_buffer_size = 8M
query_cache_limit = 32M
query_cache_size = 192M
query_cache_type = 1
query_prealloc_size = 262144 [COLOR="Red"]?[/COLOR]
query_alloc_block_size = 65536 [COLOR="Red"]?[/COLOR]
transaction_alloc_block_size = 8192 [COLOR="Red"]?[/COLOR]
transaction_prealloc_size = 4096 [COLOR="Red"]?[/COLOR]
 
danke noto für die Antwort!
Ich werde mal ein bißchen mit den einstellungen herumspielen und Bescheid geben, allerdings zu den Max. Connections von MySQL:

MAX CONNECTIONS
Current max_connections = 3200
Current threads_connected = 112
Historic max_used_connections = 3201
The number of used connections is 100% of the configured maximum.
You should raise max_connections

:confused:
 
@svenni
Dann würde ich die Scripte mal genauer untersuchen.
Ggf. könnten die Ihre Connections schon früher wieder frei geben werden.
Wobei Deine "Historic max_used_connections" auch aus der Angriffszeit sein kann. Wenn der Angriff wirklich vorbei ist dann starte den MySQL mal neu und schau nach ein paar Tagen nach dem selben Wert.

Und wie hoch sind denn Deine Apache-Werte und welchen MPM nutzt Du?

huschi.
 
ich hab letztendlich das Problem mit dem Angriff so gelöst, dass ich per iptables große Teile von Asien und Südamerika ausgeschlossen habe, dann lief der Server wieder normal, wobei er dennoch eine Optimierung nötig hätte.
Ich benutz den prefork-Apachen da ich auch Plesk benutze, aus Gewohnheit.

mit den Einstellungen von noto läuft der Server wesentlich besser und habe eben mal ein Mysql Neustart gemacht denn die hohe Verbindungsanzahl kann wirklich noch von den Attacken kommen.
 
das Verhältnis von MaxClients (Apache) und max_connections (MySQL) liegt normalerweise bei 1:1 bis 3:1

780:3500 würde ja einem Verhältnis von 1:4 entprechen d.h. viermal mehr SQL Server Connections als HTTPD Connections.
 
so, jetzt hab ich mal den server gewechselt, und siehe da, die Probleme sind wech! anstatt Serverload 100 ist er jetzt bei 1!
allerdings hab ich in den stoßzeiten ein ab und zu ein paar timeouts beim apachen und die seite lädt nicht sofort (unter umständen muss man den link zweimal ancklicken etc.)
gibt es noch eine steigerung zu den apache werten von noto?
 
Es gibt immer Steigerungen. Aber die gibt es nicht als Pi-mal-Daumen-Regeln. Im Gegenteil, die sind mit Beobachtungsgabe, Erfahrung, tiefere Kenntnisse in Linux und (der weiblichen Komponente) "Feingefühl" verbunden.
Lektüre dazu: Server-Optimierung

huschi.
 
Back
Top