|
 |
|
| Autor |
Nachricht |
placido Helfer [User]

Anmeldung: 16.10.07 Beiträge: 194
|
Verfasst am: 16.09.2008, 10:35 Titel: Belastung / Performance von MySQL Datenbank testen |
|
|
Hallo zusammen,
bin mit ein paar Kollegen gerade dabei ein Portal für Warhammer Online aufzubauen, genug Helfer sind vorhanden, von daher besteht da keine Schwierigkeit.
Meine Sorge ist, dass bei zu vielen Besuchern in der Datenbank, selbige zu langsam wird, um Abfragen noch schnell genug durchführen zu können.
Habe gestern ein kleines Script gebastelt, dass mir 10.000 user eingetragen hat. Ist nun meine Frage: Ist das genug für eine Belastung?
Abgesehen davon, dass im deutschsprachigen Raum wahrscheinlich sowieso keine 10.000 User angemeldet werden (da es vergleichabre Portale schon gibt), geht es bisher noch sehr schnell.
Meiner Meinung nach ist das einloggen der schwierigste Teil, da dort alle wichtigen Daten wie user id, nickname abgefragt werden und in sessions gespeichert werden.
Das einloggen ging mit 3 benutzern quasi sofort, nun mit ca 11.000 usern dauerts ca 1 sekunde.
Was sagt das nun über mein Script aus?
Sagt es überhaupt was aus?
Wenns wichtig ist poste ich die URL. Aber denke es geht erst mal nur um die Datenmenge und ab wann es schwierig wird.
Gibt es eine Seite, mit der ich den gleichzeitigen Zugriff und belastung des Login scripts testen kann?
Grüße
Dennis _________________ Relativitätstheorie:
Wenn ich Dir einen Finger ins Auge stecke, haben wir beide einen Finger im Auge, aber ich bin relativ besser dran
Browserspiele
|
|
| Nach oben |
|
 |
eforium Bekannter [Mod]


Anmeldung: 20.01.06 Beiträge: 1349 Wohnort: Irgendwo i ...
|
Verfasst am: 16.09.2008, 17:10 Titel: |
|
|
Dein Script sagt wenig aus.
Denn es loggen sich ja nicht 10000 Leute gleichzeitig ein, oder? Du solltest einen Mix aus Dateien aufrufen, zirka 10%, immer mit file_get_contents und für jedes die Ladezeit analysieren. Wenn du das mit einem PHP Skript direkt 1000 mal nacheinander machen würdest, würde Apache ziemlich gestresst werden.
Aber bei SharedHosting wäre ich als Hoster nicht scharf drauf, einen Kunden zu haben, der den Apache zum Abstürzen bringt.
Ausserdem:
- Zend Optimizer aktivieren und installieren (oder umgekehrt)
- eAccelerator installieren und aktivieren _________________
Deihro Internet Programming - Ihre Webseite zu angenehmen Konditionen
Sie suchen eine TemplateEngine? Klicken Sie!
|
|
| Nach oben |
|
 |
placido Helfer [User]

Anmeldung: 16.10.07 Beiträge: 194
|
Verfasst am: 17.09.2008, 17:36 Titel: |
|
|
Danke dir, probiere es gleich aus.
Dachte die Masse an Daten die SQL abfragen muss ist relevant.
Weiß zb , dass xtcommerce mit jedem artikel langsamer wird. glaub aber dass da die grenze, an der das system echt deutlich langsamer wird 3 millionen artikel sind. von daher bin ich noch sehr weit davon entfernt... _________________ Relativitätstheorie:
Wenn ich Dir einen Finger ins Auge stecke, haben wir beide einen Finger im Auge, aber ich bin relativ besser dran
Browserspiele
|
|
| Nach oben |
|
 |
eforium Bekannter [Mod]


Anmeldung: 20.01.06 Beiträge: 1349 Wohnort: Irgendwo i ...
|
Verfasst am: 18.09.2008, 16:40 Titel: |
|
|
Klar, ist die Masse auch entscheidend, aber du solltest ja vorwiegend die Tabellen testen, die auch benötigt werden. So z.B., wie du es hier im Forum machst, loggst du dich ein und öffnest dann bis du wieder gehts etwa 20 mal eine Forenseite und etwa 150 Themen, worauf du bei 5 eine Antwort gibst.
Wenn du jetzt sagst, du müsstest, um die Performance zu testen, 10000 mal jemanden einloggen lassen, kann auch ich nicht mehr helfen  _________________
Deihro Internet Programming - Ihre Webseite zu angenehmen Konditionen
Sie suchen eine TemplateEngine? Klicken Sie!
|
|
| Nach oben |
|
 |
800XE Bekannter [Mod]


Anmeldung: 24.10.04 Beiträge: 1409 Wohnort: Speyer
|
Verfasst am: 19.09.2008, 22:39 Titel: Re: Belastung / Performance von MySQL Datenbank testen |
|
|
| placido hat folgendes geschrieben: | Das einloggen ging mit 3 benutzern quasi sofort, nun mit ca 11.000 usern dauerts ca 1 sekunde.
Was sagt das nun über mein Script aus?
Sagt es überhaupt was aus? |
hast du irgendwelche Indexe angelegt?
| placido hat folgendes geschrieben: | Danke dir, probiere es gleich aus.
Dachte die Masse an Daten die SQL abfragen muss ist relevant.
Weiß zb , dass xtcommerce mit jedem artikel langsamer wird. glaub aber dass da die grenze, an der das system echt deutlich langsamer wird 3 millionen artikel sind. von daher bin ich noch sehr weit davon entfernt... |
als ich auf shop800.de auf der Startseite nor die "neuen" Artikel anzeigt und nur ca 1.ooo.ooo hatte, dauerste es ca 20, 30, 40, ..... Sekunden
Index angelegt = 0.1 Sekunden
ohne Index = je Datenzeile eine Abfrage = 1 Datensatz mehr = 1 Abfrage mehr
mit index, braucht es etwa immer eine verdopplung der Datensätze das 1 Abfrage mehr gebraucht wird
also, ob 1.ooo.ooo oder 1.1oo.ooo oder 1.5oo.ooo ist nicht wirklich mehr Arbeit
1.ooo.ooo Datensätze
Abfragen um richtign zu finden
#1 : 5oo.ooo
#2 : 250.ooo
#3 : 125.ooo
#4 : 60.ooo
#5 : 30.ooo
#6 : 15.ooo
#7 8.ooo
#8 4.ooo
#9 2.ooo
#10 1.ooo
#11 500
#12 250
#13 125
#14 60
.... ähm geht vielelicht bis 20 oder so ....
wenn du jetzt von 1.ooo.ooo auf 1.1oo.ooo gehst, ändert sich quasie nichts
wenn du jetzt von 1.ooo.ooo auf 2.ooo.ooo gehst, ändert sich 20 Abfragen zu 21 Abfragen
wenn du jetzt von 1.ooo.ooo auf 4.ooo.ooo gehst, ändert sich 20 Abfragen zu 22 Abfragen
wenn du jetzt von 1.ooo.ooo auf 8.ooo.ooo gehst, ändert sich 20 Abfragen zu 23 Abfragen _________________
Seien wir realistisch, versuchen wir das Unmögliche!
CMS800 :::::::::: Andy 800XE Zmuda :::::::::
ich bin nicht unhöflich, ich bin binär
|
|
| Nach oben |
|
 |
jonatan_männchen User [User]

Anmeldung: 12.10.08 Beiträge: 10 Wohnort: Winterthur ...
|
Verfasst am: 12.10.2008, 14:17 Titel: Benchmark |
|
|
Ich würde einen Benchmark erstellen:
(etwa so)
| Code: |
<?php
class Benchmark{
public $last_step_time = microtime(true);
public $steps = array();
$this->start();
public function start(){
$this->start_time = microtime(true);
$this->last_step_time = $this->start_time;
$this->step('Stop');
}
public function stop(){
$this->stop_time = microtime(true);
$this->step('Stop');
echo $this->steps;
}
public function step($description){
$this->steps[] = $description=>($microtime(true) - $this->last_step_time);
$this->last_step_time = microtime(true);
}
}
?>
|
Daran kannst du ablesen wie lange jeder Step hatte.
ANWENDUNG:
| Code: |
<?php
$benchmark = new Benchmark();
##Abfrage1##
$benchmark->step('Abfrage1');
##Abfrage2##
$benchmark->step('Abfrage2');
##usw...##
$benchmark->stop();
?>
|
Ich hoffe das Hilft.
|
|
| Nach oben |
|
 |
eforium Bekannter [Mod]


Anmeldung: 20.01.06 Beiträge: 1349 Wohnort: Irgendwo i ...
|
|
| Nach oben |
|
 |
jonatan_männchen User [User]

Anmeldung: 12.10.08 Beiträge: 10 Wohnort: Winterthur ...
|
Verfasst am: 28.10.2008, 22:00 Titel: Benchmark |
|
|
| eforium hat folgendes geschrieben: | | Ja, das wird dir helfen, nur, wenn der Server schon ein wenig gefordert ist und PHP auch, wird das Skript total nur noch mehr verlangsamert. Dann hilft es wiederum nichts mehr. |
Nein!
1.
Dieser Code ist gedacht um Queries und solche Sachen zu testen. Wenn du meinst es seie ja noch nicht genug ausgelastet => laste es aus... (Erstelle eine Testdb und ertselle automatisch einfach 5 Mio Einträge, mal sehen was nicht aus gelastet ist )
DB erstellcode:
| Code: |
<?php
mysql_connect("dbbenutzer-xy.mein-hoster.de", "username","passwort");
mysql_select_db("dbname");
for($i = 1; $i <= 5000000; $i++){
$sql = "INSERT INTO tabellenname SET feld1='".md5(uniqid())."', usw...";
mysql_query($sql):
}
?>
|
Jetzt ist alles ausgelastet...
2.
Schau mal mit einem leeren Benchmarkstep wie lange er hat... du wirst einfach nur Nullen ablsesen können.
Ausserdem, ich würde ihn eh nur zum testen benutzen und nicht live.
Eine Idee wäre diesen Code auf einem Repository (Dev-Server) so einzurichten, dass er aufgerufen wird, wenn du "?bench" an die URL anhängst.
|
|
| Nach oben |
|
 |
eforium Bekannter [Mod]


Anmeldung: 20.01.06 Beiträge: 1349 Wohnort: Irgendwo i ...
|
Verfasst am: 29.10.2008, 17:32 Titel: |
|
|
Ich denke, wenn ich einen leeren Benchmark aufrufe, werde ich nicht nur nullen ablesen können... Ohne das zu testen, weiss ich, dass eine Millisekunde einer tausendstel Sekunde entspricht... Diese Zeit ist messbar, und die wird wohl gerade dazu verbraucht, die Zeit überhaupt irgendwo mal durch den RAM zu jagen...
Ausserdem bringt das 5 Mio Einträge erstellen nichts... Wenn du das schon mal ausprobiert hast, wirst du zwei Sachen merken:
- 1. Wird sich der Server wohl früher oder später aufhängen = Mehr Schaden als Nutzen
- 2. Werden niemals 5 Mio Einträge in so kurzer Zeit erstellt werden, dass das relevant wäre.
- 3. Geht es bei einem Browsergame vor allem um auslesen und teilweise, das heisst geringerer Anteil, ums speichern. Beim Speichern wird allerdings nichts im RAM gelagert, nur hindurch gejagt. MySQL ist aber so einstellbar, dass Datenbanken im RAM gelagert werden können, d.h. es wird schneller ausgelesen. Dass kannst du mit 5 Mio Einträgen nicht machen, oder?
Idee: Es soll jemand einen SQL Server programmieren, der INSERT's zwischenlagert, bevor sie gesendet bzw. erstellt wurden  _________________
Deihro Internet Programming - Ihre Webseite zu angenehmen Konditionen
Sie suchen eine TemplateEngine? Klicken Sie!
|
|
| Nach oben |
|
 |
800XE Bekannter [Mod]


Anmeldung: 24.10.04 Beiträge: 1409 Wohnort: Speyer
|
Verfasst am: 30.10.2008, 04:50 Titel: |
|
|
| eforium hat folgendes geschrieben: | Es soll jemand einen SQL Server programmieren, der INSERT's zwischenlagert, bevor sie gesendet bzw. erstellt wurden  |
im SQL Handbuch
http://andyzmuda.de/Apache/
http://dev.mysql.com/doc/refman/5.1/de/
hab ich schon öffer was gelesen von
"Querys gehen in Pipeline" ....
... und werden erst "wenn Zeit übrig ist" wirklich ausgeführt
muß glaub etra per Befehl angegeben werden ...
... weil dadurch ja die "aktuellen daten dann veraltet sind"
also
ich mache einen UPDATE .... danach einen SELECT .... und sehe noch das alte, weil der UPDATE noch (vielleicht lange) in der Pipeline liegt _________________
Seien wir realistisch, versuchen wir das Unmögliche!
CMS800 :::::::::: Andy 800XE Zmuda :::::::::
ich bin nicht unhöflich, ich bin binär
|
|
| Nach oben |
|
 |
hlag User [User]


Anmeldung: 29.10.08 Beiträge: 10 Wohnort: Bonn
|
Verfasst am: 28.11.2008, 18:52 Titel: |
|
|
Hi,
die Anzahl einträge in einer Datenbank sind meistens eher unkritisch.
Leg wie 800XE sagte über alle Felder, nach denen Du abfragst einen index an und es geht rasant schneller.
Wenn Du Abfragen mit AND verknüpfst, klickst Du im phpMyAdmin in der Strukturansicht beide Felder an und legst auf die kombinierten Felder einen Index.
Das bringt rasant viel.
Wenn Deine Seite auf einem CMS beruht, sieh zu, dass Du alles an inhalt, was Du cachen kannst, als File cached und die Datenbank in Ruhe lässt.
Wenn das jetzt immer noch zu langsam ist: dickerer Server.
viele Grüße,
hlag _________________ Klaus Blömeke
avaris | godot.de
SiteAlert - Websiteüberwachung
|
|
| Nach oben |
|
 |
hlag User [User]


Anmeldung: 29.10.08 Beiträge: 10 Wohnort: Bonn
|
Verfasst am: 28.11.2008, 18:57 Titel: |
|
|
Nebenbei:
Wenn Du die Responszeiten überwachen willst, kannst Du das mit unserem Tool tun.
Sobald der Server echt nicht mehr will, wird er erst langsam, danach schreit er um Hilfe:
Warning: mysql_connect() [function.mysql-connect]: Too many connections in /pfad/zum/script/script.php on line X
Unser Tool erkennt sowohl den String, als auch Änderungen auf der Seite die durch fehlende inhalte verursacht werden (falls Du die Ausgabe von Fehlern unterdrückst)
Viele Grüße,
Klaus _________________ Klaus Blömeke
avaris | godot.de
SiteAlert - Websiteüberwachung
|
|
| Nach oben |
|
 |
|
|
 |
|
Alle Zeiten sind GMT + 1 Stunde
|
| Seite 1 von 1 |
|  |