Brauche Hilfe: MySQL Errror!

MTenner

New Member
Hallo zusammen,

Ich bin ziemlich neu hier, würde mich aber sehr freuen, wenn mir jemand weiterhelfen könnte.

Ich habe vor ca. 1 Monat eine Website mit einer gekauften web 2.0 Software aufgeschaltet. Die Seite hat innert kürzester Zeit ziemlich viel Traffic erhalten, durchschnittlich 1'000 neue Sign Ups pro Tag und etwa 5'000 Unique Visitors. Zur Software hab ich noch ein Hosting Paket von 20$ gekauft. Aufgrund des Traffics wurde schnell klar, dass ich mir einen dedicated Server zulegen musste. Seit ein paar Wochen habe ich nun einen dedicated Server.

Mit dem neuen Linux Server habe ich aber nur Probleme, aber hier erstmals die Spezifikationen:

4x CPU:
Code:
Processor #1 Vendor: GenuineIntel
Processor #1 Name: Intel(R) Xeon(R) CPU           X3220  @ 2.40GHz
Processor #1 speed: 2399.883 MHz
Processor #1 cache size: 4096 KB

Code:
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
Memory: 3110964k/3144512k available (2122k kernel code, 32144k reserved, 883k data, 228k init, 2227008k highmem)

Memory
             total           used         free                 shared    buffers     cached
Mem:     3114708    1016724    2097984          0           52856     411824
-/+ buffers/cache:     552044    2562664
Swap:    2096472               0    2096472
Total:     5211180    1016724    4194456

Ein grosses Problem ist meiner Meinung nach vor allem der MySQL Server. Er braucht teilweise für einige Minuten 100% des CPU und stürzt dann manchmal ab und folgende Error Message ist zu lesen:

Code:
Warning: SK_MySQL::connect() database connection failed in /home/public_html/internals/API/MySQL.class.php on line 17

Warning: mysql_real_escape_string() expects parameter 2 to be resource, boolean given in /home/public_html/internals/API/MySQL.class.php on line 35

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/public_html/internals/API/MySQL.class.php on line 161

Warning: mysql_error(): supplied argument is not a valid MySQL-Link resource in /home/public_html/internals/API/MySQL.class.php on line 165

Warning: mysql_errno(): supplied argument is not a valid MySQL-Link resource in /home/public_html/internals/API/MySQL.class.php on line 166
Uncaught exception with message: code: 0
Trace:
#0 /home/public_html/internals/API/Config.class.php(49): SK_MySQL::query('SELECT `config_...')
#1 /home/public_html/internals/API/Config.class.php(18): SK_Config_Section->__construct('video')
#2 /home/public_html/internals/Header.inc.php(262): SK_Config::section('video')
#3 /home/public_html/index.php(3): require_once('/home/...')
#4 {main}
thrown in: /home/public_html/internals/API/MySQL.class.php on line 164

Oder etwas ähnliches:

Code:
Uncaught exception with message: MySQL server has gone away code: 2006
Trace:
#0 /home/public_html/internals/Apps/Profile.app.php(564): SK_MySQL::query('SELECT `profile...')
#1 /home/public_html/internals/API/HttpUser.class.php(40): app_Profile::updateProfileActivity()
#2 /home/public_html/internals/Header.inc.php(321): SK_HttpUser::session_start()
#3 /home/public_html/index.php(3): require_once('/home/...')
#4 {main}
thrown in: /home/public_html/internals/API/MySQL.class.php on line 164


Aufgrund dieser Probleme hat mir die Hosting Firma empfohlen 2gb ram zusätzlich zu kaufen und Nginx Webserver aufzusetzen, der all die Datenbank Anfragen besser verarbeiten kann. Ich habe nun die 2gb ram gekauft und die wurden heute morgen eingebaut. Dennoch hat sich das Problem kaum gebessert. Es gab immer noch dieselben Fehlermeldungen und der Server stürtzte immer wieder ab.

Hier vielleicht noch einige nützliche Infos:

Disk usage:
Code:
 	Device  	Size  	Used  	Available  	Percent Used  	Mount Point
	/dev/sda1 	99M 	17M 	        78M 	        18%            	/boot
	/dev/sda3 	2.0G 	40M 	        1.8G 	        3% 	                /tmp
	/dev/sda5 	223G 7.7G 	204G 	4% 	                /


Servertraffic Statistiken:
Code:
Traffic Tip  	                ø pro Stunde
Empfangen 	187 MiB 	73 MiB
Gesendet 	        505 MiB 	196 MiB
Insgesamt 	692 MiB 	269 MiB

Verbindungen  	                                    ø pro Stunde  	%
max. gleichzeitige Verbindungen 	47        --- 	                ---
Fehlgeschlagen                      	0 	    0,00               	0,00%
Abgebrochen 	                        183 	    71,11 	                1,45%
Insgesamt 	                        13 k 	    4,898,18 	        100,00%


Abfragestatistiken:
Code:
Abfragestatistik: Seit seinem Start wurden 1,509,513 Abfragen an diesen MySQL-Server gesandt.

Insgesamt 	ø pro Stunde 	ø pro Minute 	ø pro Sekunde
1,510 k 	        586,54 k 	        9,78 k 	        162,93

Jemand der sich mit MySQL Problemen auskennt, hat mir folgendes dazu geschrieben:

* Query types: 83'000 SELECT, 5'5000 UPDATE, 6'000 SET OPTION.
Also gibt es 23 Select-Anfragen pro Sekunde. Das ist natürlich sehr
viel. Es wird also auf Applikationsebene wahrscheinlich nichts
gecachet, sondern alles direkt aus der DB geholt.
Ausserdem ist es komisch, dass es so viele "SET OPTION" Queries gibt.
Das macht eigentlich keinen Sinn so häufig, irgendwas komisches..

* 1'423'000 Requests mit Tablescan, 685'000'000 Requests mit Tablescan
und/oder schlechtem/keinem Index.
Requests mit Tablescan kommen eben vorallem vor, wenn schlechte bzw.
keine Indizes der Tabellen vorhanden sind. Das verlangsamt die DB u.U.
extrem.


CPU Usage:
Hierzu habe ich leider keine Statistiken, ich kann nur sagen, dass die CPU Auslastung wie irre hin und her springt zwischen 1% und dann in der nächsten Sekunde zu 99.9%. Angezeigt wird dann jeweils, dass immer der MySQL Server den ganzen CPU braucht. Dies bleibt dann manchmal s für mehrere Minuten und der MySQL Server stürzt komplett ab oder es beruhigt sich wieder. Seltsam scheint mir aber, dass trotz der extremen CPU Auslastung die ram Auslastung dieselbe bleibt (vorher bei 1gb ram ca. 0.4gb ram used und 0.6gb ram free und jetzt mit 3gb ram ca. 1.2gb ram used und 1.8gb ram free). Die Serverload ist in diesen Momenten dann auch bei etwa 1.5 schwankt dann aber auch wieder zurück zu 0.1.

Im PHP MyAdmin sind folgende Variablen rot markiert:

* Slow_queries 15 Anzahl der Anfragen, die länger als long_query_time benötigten.

* Innodb_buffer_pool_reads 13 Anzahl an Lesevorgängen die InnoDB nicht aus dem Zwischenspeicher bedienen konnte und deshalb einen Einzel-Seiten-Lesevorgang starten musste.

* Handler_read_rnd 6,215 k Anzahl der Anfragen, eine Zeile basierend auf einer festen Position zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Anfragen ausführen, die erfordern, dass das Ergebnis sortiert wird. Wenn Handler_read_rnd hoch ist, haben Sie wahrscheinlich viele Anfragen, die MySQL zwingen, ganze Tabellen zu scannen, oder Sie haben Joins, die Schlüssel nicht richtig benutzen.

* Handler_read_rnd_next 701 M Anzahl der Anfragen, die nächste Zeile in der Daten-Datei zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Tabellen-Scans durchführen

* Created_tmp_disk_tables 1,245 Anzahl der (implizit) auf der Platte erzeugten temporären Tabellen bei der Ausführung von Statements.

* Select_full_join 16 k Anzahl der Joins ohne Schlüssel. Wenn dieser Wert nicht 0 ist sollten die Indizes der Tabellen sorgfältig überprüft werden.

* Opened_tables 267 Anzahl der Tabellen, die geöffnet wurden. Wenn Opened_tables hoch ist, ist Ihre table_cache-Variable wahrscheinlich zu niedrig.

* Table_locks_waited 908 Wie oft eine Tabellensperre nicht sofort erlangt werden konnte und gewartet werden musste. Wenn dieser Wert hoch ist und Sie Performance-Probleme haben, sollten Sie zunächst Ihre Anfragen optimieren und dann entweder Ihre Tabelle(n) zerteilen oder Replikation benutzen.
-----------------------------

Seltsam finde ich, dass mein alter Hostin plan für 20$ mit gut 70 Leuten gleichzeitig auf der Seite ohne weiteres zu Rande kam, dass aber der neue Server für das 20fache vom Preis schon mit 30 Leuten gleichzeitig Mühe hat und abstürzt. Da kann irgendetwas nicht stimmen.

Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte. Denn seit ich den neuen Server habe ist der Traffic massiv gesunken und auch sonst ist es einfach sehr mühsam. Könnte es sein, das es einfach an der Software liegt, die vielleicht schlecht cached und indexiert und darum viele aufwendige Datenbanken Zugriffe macht?

Das angehängte Bild zeigt die Down-/Uptime des Servers (Ein Monitor Skript hat jede Minute versucht auf die Seite zuzugreifen) innerhalb von 48 Stunden. Obere Linie zeigt Uptime, untere Downtime.

Besten Dank,
Michael
MOD: Bitte [noparse]
Code:
...
[/noparse]-Tags um Ausgaben, Code, etc. verwenden (im Editor auch mit '#' erreichbar). Danke!
 

Attachments

  • Picture 1.png
    Picture 1.png
    13.6 KB · Views: 137
Last edited by a moderator:
Hier sind noch einige Daten, wenn der Server völlig ausgelastet ist:

Code:
top - 16:13:01 up 21:41,  2 users,  load average: 2.37, 1.44, 0.73
Tasks: 204 total,   1 running, 202 sleeping,   0 stopped,   1 zombie
Cpu(s): 27.1%us,  0.3%sy,  0.0%ni, 72.5%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   3114708k total,  1734804k used,  1379904k free,   212284k buffers
Swap:  2096472k total,        0k used,  2096472k free,   918660k cached

PID    USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 2195   mysql     15   0  748m 188m 3908 S 100.2  6.2 298:48.95 mysqld            
22141 nobody    15   0 30900  13m 3936 S  2.7  0.4   0:00.18 httpd              
22328 nobody    15   0 30916  13m 3932 S  2.0  0.4   0:00.26 httpd
MOD: Bitte [noparse]
Code:
...
[/noparse]-Tags um Ausgaben, Code, etc. verwenden (im Editor auch mit '#' erreichbar). Danke!
 
Last edited by a moderator:
Naja, die Antwort hast du ja eigentlich schon bekommen:

1'423'000 Requests mit Tablescan, 685'000'000 Requests mit Tablescan
und/oder schlechtem/keinem Index.
Requests mit Tablescan kommen eben vorallem vor, wenn schlechte bzw.
keine Indizes der Tabellen vorhanden sind. Das verlangsamt die DB u.U.
extrem.

Da musst du dich wohl mal hinsetzen und die Datenbanken optimieren, zu Anfang die Queries ohne Index loggen (--log-queries-not-using-indexes) und die beteiligten Tabellen dann optimieren (Indexes hinzufügen soweit möglich/sinnvoll): MySQL :: MySQL 5.0 Reference Manual :: 5.2.4 The Slow Query Log
http://dev.mysql.com/doc/refman/5.0/en/create-index.html

P.S. Das Logging wirklich nur zum Aufspüren der Queries laufen lassen, nicht ständig da der Schreibzugriff die Performance noch weiter runterzieht.
 
Last edited by a moderator:
Back
Top