Server für Community optimieren

A

andiR

Guest
Hallo,

ich wollte hier bei euch mal nachfragen ob jemand Tips und Infos für mich hat, wie ich einen Server für meine Seite optimieren kann.

Sind durchschnittlich 50 Leute gleichzeitig online, wobei Tendenz steigend ist.

Die Hauptlast wird durch SQL Abfragen verursacht.

Wäre sehr dankbar.

Gruß
 
Ein Anfang wäre hier Mal die Konfiguration Deines Servers zu posten:

Anzahl CPUs
RAM

Betriebssystem
Welche Datenbank, Version...

Läuft ein bekanntes Skript?
phpBB2?
Postnuke?
Andere CMS?
sind die Indexe auf den tabellen richtig gesetzt?
Braucht es mehr?

Davon abhängig ob Du MySQL benutzt, kannst Du über Phpmyadmin oder über die Konsole einige Statistiken rauslassen.
Reads/Writes/Index Access, usw.
 
Hallo,

vielen Dank für die schnelle Antwort. Bin leider noch in der Arbeit und habe von hier keinen Zugriff auf die Konsole.

Kann daher nur folgende Angaben im Moment machen:

CPU: AMD Opteron 148
RAM: 1 GB
OS: SUSE Linux 10.0

Läuft über eine MySQL Datenbank.

Das Script ist von mir selbst geschrieben.

Weitere Infos werde ich heute Abend posten.

Thx
smile.gif
 
mhh...
Also generell solltest du versuchen die DB Zugriffe zu minimieren, also möglichst die Daten nur 1x abrufen. ^^


Dann einmal überprüfen, nach welchen Attributen (Werten einer Tabelle) du besonders häufig abfragst, auf diese dann einen Index setzen.
Das sollte schon einmal einiges bringen.

Was die DB-Optimierung angeht können dir sicherlich Sascha und die anderen noch mehr Tipps geben.


Was läuft denn sonst noch auf dem Server?
 
Suse uha :p

Ich würde mal sagen: RAM, RAM und dann mehr RAM. Dann MySQL Query Cache anmachen und Slow-Query.log anschalten und anschauen.
Wenn die Queries nicht so unterschiedlich sind, Mysql Query Log eine Zeitlang anmachen, Queries loggen und mit "EXPLAIN Query" schauen
ob Indizes benutzt werden.

 
QUOTE (TheGamer1701 @ Mo 13.11.2006, 18:11) Was läuft denn sonst noch auf dem Server?

Im moment rein gar nichts.

Die Ladezeiten halten sich ja auch im Rahmen, aber würde gerne gleich für die Zukunft absichern.

Vielen Dank für die weiteren Infos, werde das gleich mal versuchen.

Gruß
 
Vergiss Pauschalisierungen.

Also, unter phpMyAdmin, lass Dir Mal die Laufzeit-Informationen (Runtime-Data) anzeigen, und poste Mal das Ergebnis hier.
Daraus lässt sich eine erste oberflächliche Analyse machen.

Das hier sind meine Laufzeit-Informationen:

QUOTE
Dieser MySQL-Server läuft bereits 129 Tage, 2 Stunden, 57 Minuten und 6 Sekunden. Er wurde am 07. Juli 2006 um 21:04 gestartet.
Servertraffic: In diesen Tabellen wird der Netzwerktraffic dieses MySQL-Servers seit dessen Start aufgeführt.
Traffic ø pro Stunde
Empfangen 973 MB 329.106 Bytes
Gesendet 2.490 MB 842.641 Bytes
Insgesamt 3.463 MB 1.144 KB
Verbindungen ø pro Stunde %
Fehlgeschlagen 0 0,00 0,00 %
Abgebrochen 6.104 1,97 0,01 %
Insgesamt 47.453.124 15.312,64 100,00 %


Abfragestatistik: Seit seinem Start wurden 462.035.664 Abfragen an diesen MySQL-Server gesandt. Insgesamt ø pro Stunde ø pro Minute ø pro Sekunde
462.035.664 149.094,18 2.484,90 41,42

Abfrageart ø pro Stunde %
admin commands 31.150 10,05 0,01 %
alter db 0 0,00 0,00 %
alter table 0 0,00 0,00 %
analyze 0 0,00 0,00 %
backup table 0 0,00 0,00 %
begin 1.644 0,53 0,00 %
change db 803.067 259,14 0,19 %
change master 0 0,00 0,00 %
check 0 0,00 0,00 %
checksum 0 0,00 0,00 %
commit 1.644 0,53 0,00 %
create db 0 0,00 0,00 %
create function 0 0,00 0,00 %
create index 0 0,00 0,00 %
create table 0 0,00 0,00 %
dealloc sql 0 0,00 0,00 %
delete 5.271 1,70 0,00 %
delete multi 0 0,00 0,00 %
do 0 0,00 0,00 %
drop db 0 0,00 0,00 %
drop function 0 0,00 0,00 %
drop index 0 0,00 0,00 %
drop table 0 0,00 0,00 %
drop user 0 0,00 0,00 %
execute sql 0 0,00 0,00 %
flush 0 0,00 0,00 %
grant 0 0,00 0,00 %
ha close 0 0,00 0,00 %
ha open 0 0,00 0,00 %
ha read 0 0,00 0,00 %
help 0 0,00 0,00 %
insert 57.357 18,51 0,01 %
insert select 24 0,01 0,00 %
kill 0 0,00 0,00 %
load 0 0,00 0,00 %
load master data 0 0,00 0,00 %
load master table 0 0,00 0,00 %
lock tables 13 0,00 0,00 %
optimize 0 0,00 0,00 %
preload keys 0 0,00 0,00 %
prepare sql 0 0,00 0,00 %
purge 0 0,00 0,00 %
purge before date 0 0,00 0,00 %
rename table 0 0,00 0,00 %
repair 0 0,00 0,00 %
replace 65 0,02 0,00 %
replace select 2 0,00 0,00 %
Abfrageart ø pro Stunde %
reset 0 0,00 0,00 %
restore table 0 0,00 0,00 %
revoke 0 0,00 0,00 %
revoke all 0 0,00 0,00 %
rollback 0 0,00 0,00 %
savepoint 0 0,00 0,00 %
select 682.983 220,39 0,16 %
set option 2.200 0,71 0,00 %
show binlog events 0 0,00 0,00 %
show binlogs 4 0,00 0,00 %
show charsets 20 0,01 0,00 %
show collations 20 0,01 0,00 %
show column types 0 0,00 0,00 %
show create db 7 0,00 0,00 %
show create table 265 0,09 0,00 %
show databases 11 0,00 0,00 %
show errors 0 0,00 0,00 %
show fields 291 0,09 0,00 %
show grants 3 0,00 0,00 %
show innodb status 0 0,00 0,00 %
show keys 27 0,01 0,00 %
show logs 0 0,00 0,00 %
show master status 0 0,00 0,00 %
show ndb status 0 0,00 0,00 %
show new master 0 0,00 0,00 %
show open tables 0 0,00 0,00 %
show privileges 0 0,00 0,00 %
show processlist 0 0,00 0,00 %
show slave hosts 0 0,00 0,00 %
show slave status 0 0,00 0,00 %
show status 1 0,00 0,00 %
show storage engines 0 0,00 0,00 %
show tables 441 0,14 0,00 %
show variables 40 0,01 0,00 %
show warnings 0 0,00 0,00 %
slave start 0 0,00 0,00 %
slave stop 0 0,00 0,00 %
stmt close 0 0,00 0,00 %
stmt execute 0 0,00 0,00 %
stmt prepare 0 0,00 0,00 %
stmt reset 0 0,00 0,00 %
stmt send long data 0 0,00 0,00 %
truncate 0 0,00 0,00 %
unlock tables 13 0,00 0,00 %
update 705.410 227,63 0,17 %
update multi 0 0,00 0,00 %


Weitere Statusvariablen
Variable Wert
Binlog cache disk use 0
Binlog cache use 1644
Created tmp disk tables 573
Created tmp files 408
Created tmp tables 168476
Delayed errors 0
Delayed insert threads 0
Delayed writes 0
Flush commands 39
Handler commit 1650
Handler delete 8608
Handler discover 0
Handler read first 36915
Handler read key 18523545
Handler read next 21289537
Handler read prev 300598
Handler read rnd 1649061
Handler read rnd next 3103943834
Handler rollback 1866
Handler update 2455431
Handler write 7371000
Variable Wert
Key blocks not flushed 0
Key blocks unused 113904
Key blocks used 18352
Key read requests 41875593
Key reads 7938
Key write requests 35458
Key writes 28528
Max used connections 44
Not flushed delayed rows 0
Open files 226
Open streams 0
Open tables 128
Opened tables 1901
Qcache free blocks 4535
Qcache free memory 13605888
Qcache hits 3953509
Qcache inserts 557382
Qcache lowmem prunes 15355
Qcache not cached 47874
Qcache queries in cache 9083
Qcache total blocks 23052
Variable Wert
Rpl status NULL
Select full join 612
Select full range join 0
Select range 1250
Select range check 0
Select scan 398002
Slave open temp tables 0
Slave retried transactions 0
Slave running OFF
Slow launch threads 0
Slow queries 0
Sort merge passes 0
Sort range 7938
Sort rows 4258421
Sort scan 187368
Table locks immediate 1453475
Table locks waited 1771
Threads cached 5
Threads connected 22
Threads created 65694
Threads running 1

 
Hallo,

hier mal meine Daten:

QUOTE Dieser MySQL-Server läuft bereits 9 Tage, 7 Stunden, 12 Minuten und 38 Sekunden. Er wurde am 05. November 2006 um 13:10 gestartet.

* Servertraffic: In diesen Tabellen wird der Netzwerktraffic dieses MySQL-Servers seit dessen Start aufgeführt.
Traffic ø pro Stunde
Empfangen 2.657 MB 12.189 KB
Gesendet 1.267 MB 5.812 KB
Insgesamt 3.924 MB 18.001 KB

Verbindungen ø pro Stunde %
Fehlgeschlagen 36 0,16 0,00 %
Abgebrochen 152 0,68 0,01 %
Insgesamt 1.483.162 6.644,68 100,00 %
* Abfragestatistik: Seit seinem Start wurden 39.362.244 Abfragen an diesen MySQL-Server gesandt.
Insgesamt ø pro Stunde ø pro Minute ø pro Sekunde
39.362.244 176.345,80 2.939,10 48,98
Abfrageart ø pro Stunde %
admin commands 0 0,00 0,00 %
alter db 0 0,00 0,00 %
alter table 6 0,03 0,00 %
analyze 0 0,00 0,00 %
backup table 0 0,00 0,00 %
begin 25 0,11 0,00 %
change db 1.487.887 6.665,85 3,93 %
change master 0 0,00 0,00 %
check 0 0,00 0,00 %
checksum 0 0,00 0,00 %
commit 25 0,11 0,00 %
create db 2 0,01 0,00 %
create function 0 0,00 0,00 %
create index 0 0,00 0,00 %
create table 0 0,00 0,00 %
dealloc sql 0 0,00 0,00 %
delete 20.816 93,26 0,05 %
delete multi 0 0,00 0,00 %
do 0 0,00 0,00 %
drop db 2 0,01 0,00 %
drop function 0 0,00 0,00 %
drop index 0 0,00 0,00 %
drop table 0 0,00 0,00 %
drop user 0 0,00 0,00 %
execute sql 0 0,00 0,00 %
flush 0 0,00 0,00 %
grant 0 0,00 0,00 %
ha close 0 0,00 0,00 %
ha open 0 0,00 0,00 %
ha read 0 0,00 0,00 %
help 0 0,00 0,00 %
insert 77.417 346,83 0,20 %
insert select 0 0,00 0,00 %
kill 0 0,00 0,00 %
load 0 0,00 0,00 %
load master data 0 0,00 0,00 %
load master table 0 0,00 0,00 %
lock tables 27 0,12 0,00 %
optimize 0 0,00 0,00 %
preload keys 0 0,00 0,00 %
prepare sql 0 0,00 0,00 %
purge 0 0,00 0,00 %
purge before date 0 0,00 0,00 %
rename table 0 0,00 0,00 %
repair 0 0,00 0,00 %
replace 2.109 9,45 0,01 %

Abfrageart ø pro Stunde %
replace select 9 0,04 0,00 %
reset 0 0,00 0,00 %
restore table 0 0,00 0,00 %
revoke 0 0,00 0,00 %
revoke all 0 0,00 0,00 %
rollback 0 0,00 0,00 %
savepoint 0 0,00 0,00 %
select 34.455.222 154.361,97 90,96 %
set option 10.184 45,63 0,03 %
show binlog events 0 0,00 0,00 %
show binlogs 48 0,22 0,00 %
show charsets 691 3,10 0,00 %
show collations 691 3,10 0,00 %
show column types 0 0,00 0,00 %
show create db 28 0,13 0,00 %
show create table 1.766 7,91 0,00 %
show databases 10 0,04 0,00 %
show errors 0 0,00 0,00 %
show fields 2.718 12,18 0,01 %
show grants 38 0,17 0,00 %
show innodb status 0 0,00 0,00 %
show keys 303 1,36 0,00 %
show logs 0 0,00 0,00 %
show master status 0 0,00 0,00 %
show new master 0 0,00 0,00 %
show open tables 0 0,00 0,00 %
show privileges 0 0,00 0,00 %
show processlist 7 0,03 0,00 %
show slave hosts 0 0,00 0,00 %
show slave status 0 0,00 0,00 %
show status 1 0,00 0,00 %
show storage engines 4 0,02 0,00 %
show tables 4.423 19,82 0,01 %
show variables 4.485 20,09 0,01 %
show warnings 0 0,00 0,00 %
slave start 0 0,00 0,00 %
slave stop 0 0,00 0,00 %
stmt prepare 0 0,00 0,00 %
stmt execute 0 0,00 0,00 %
stmt send long data 0 0,00 0,00 %
stmt reset 0 0,00 0,00 %
stmt close 0 0,00 0,00 %
truncate 45 0,20 0,00 %
unlock tables 27 0,12 0,00 %
update 1.804.865 8.085,93 4,76 %
update multi 0 0,00 0,00 %
* Weitere Statusvariablen
Variable Wert
Binlog cache disk use 0
Binlog cache use 0
Created tmp disk tables 328927
Created tmp files 2049
Created tmp tables 330122
Delayed errors 0
Delayed insert threads 0
Delayed writes 0
Flush commands 1
Handler commit 52
Handler delete 25620
Handler discover 0
Handler read first 389604
Handler read key 34486264
Handler read next 955242895
Handler read prev 50156589
Handler read rnd 200662604
Handler read rnd next 43824934
Handler rollback 3006
Handler update 18673480
Handler write 100553836

Variable Wert
Key blocks not flushed 0
Key blocks unused 115195
Key blocks used 788
Key read requests 148066313
Key reads 98360
Key write requests 5577547
Key writes 34693
Max used connections 26
Not flushed delayed rows 0
Open files 295
Open streams 0
Open tables 256
Opened tables 1552
Qcache free blocks 0
Qcache free memory 0
Qcache hits 0
Qcache inserts 0
Qcache lowmem prunes 0
Qcache not cached 0
Qcache queries in cache 0
Qcache total blocks 0

Variable Wert
Rpl status NULL
Select full join 15
Select full range join 0
Select range 45696
Select range check 0
Select scan 18840948
Slave open temp tables 0
Slave running OFF
Slave retried transactions 0
Slow launch threads 119
Slow queries 24
Sort merge passes 6
Sort range 185
Sort rows 183558721
Sort scan 5519409
Table locks immediate 36386917
Table locks waited 15757
Threads cached 5
Threads connected 3
Threads created 10755
Threads running 1


Gruß

Andi
smile.gif
 
1. die slow querys kannst dir ja mal ansehen (auch wenns die nicht ausmachen werden)

2. mehr ram bringts bei dbservern immer

3. schnelle platten sind für dbserver enorm wichtig, solltest du dir mal ansehen, was dich das kosten würde, eventuell mit nem raid nochmal mehr speed rausholen, da du sonst ne böse iowait bekommst (=> iowait im top mal ansehen)

4. eventuell db ganz auslagern, ist besser skalierbar, zudem haben apache-rechner andere anforderungen als reine dbserver

viele grüße!

benjamin lochmann

 
Ich habe meinen Server bereits mit nur 512 MB RAM betrieben, und da lief MySQL bei vergleichbarem Load auch. Mehr RAM wird Deine Probleme wahrscheinlich nur zeitweise lösen. Sobald Du mehr Load bekommst, wächst er dann exponential sobald Dein Server anfängt zu swappen.

Ok, das hier sind schon Mal Werte, die nicht so gut sind:

QUOTE Created tmp disk tables 328927
Created tmp files 2049
Created tmp tables 330122


Das bedeutet, dass Dein Server fast alle temporäre Tables auf Festplatte anlegt, statt in der RAM (nicht gut).
Könnte auf einen zu kleinen tmp-table_space hindeuten


QUOTE Handler read first 389604
Handler read key 34486264
Handler read next 955242895
Handler read prev 50156589
Handler read rnd 200662604
Handler read rnd next 43824934


Du hast auch relativ hohe Handler read rnd / next Werte. Die deuten darauf hin, dass entweder die Queries schlecht programmiert sind, oder die Indexe in den Tables schlecht gemacht sind, so dass Du viele Full Table Scans mit anschliessender sortierung machst. Die hohen tmp table Werte sprechen auch dafür.

Mehr Argumente dafür sind hier:

QUOTE Select scan 18840948
...
Sort rows 183558721
Sort scan 5519409


Diese Werte sind zu hoch, und werden durch Full Table Scans verursacht, wegen schlechter oder fehlenden Indexen.

Poste doch hier Mal Deine /etc/mysql.ini
Vielleicht kann man wenigstens dort etwas rumschrauben (wegen dem tmp_table_space), aber ich denke, die Tabellen müssen mit Indexen versehen werden, und die Queries so gestaltet, dass die die Indexe benutzen.

Ach so, und weisst Du vielleicht noch, ob Dein Server viel "swappt" ? I.e. wenn die RAM alle ist, geht er auf die Festplatte. (ist als Momentaufnahme in "top" im shell ersichtlich)
 
Was ich gestern noch vergass:

QUOTE Qcache free blocks 0
Qcache free memory 0
Qcache hits 0
Qcache inserts 0
Qcache lowmem prunes 0
Qcache not cached 0
Qcache queries in cache 0
Qcache total blocks 0


vielleicht solltest Du auch mal den Query Cache aktivieren, wenn Deine Seite oft die gleiche Query ausführt (was bei Webservern meist der Fall ist).

 
Ausserdem hast Du einen ziemlich hohen Traffic auf Deiner Datenbank, obwohl die Anzahl Queries überschaubar ist.
Daten alleine sollten weniger Traffic verursachen, ich tippe Mal darauf, dass Du Bilder in der Datenbank speicherst?

Das verursacht natürlich mehr Load, aber macht die Datenbank auch unglaublich gross, was für Backups und Wiederherstellungen hinderlich ist.

Vielleicht solltest Du Dir überlegen, in der Datenbank nur die URI der Bilder zu speichern und die Bilder selbst als Datei in Verzeichnissen?
 
Auch interessant: wie viele Seitenaufrufe hast Du durchschnittlich pro Tag?
 
QUOTE (BLochmann @ Di 14.11.2006, 21:50) 3. schnelle platten sind für dbserver enorm wichtig, solltest du dir mal ansehen, was dich das kosten würde, eventuell mit nem raid nochmal mehr speed rausholen, da du sonst ne böse iowait bekommst (=> iowait im top mal ansehen)

Wobei Raid 5 ungeeignet ist für einen Datenbankserver. Entweder Raid 1 oder gleich Raid 10!

Viel wurde schon gesagt;
Query-Cache optimieren, Indexe optimieren, Datentypen seriös bestimmen, keinen Binärmüll (Bilder, Dokumente..) in die DB laden, Abfragen optimieren (keine SELECT * FROM... !!!), einen PHP-Cache installieren (Z.B. Zend Optimizer, APC..). Wenn du nur ein Projekt auf dem Server betreibst, PHP als Modul laufen lassen, nicht als CGI. Wenn du keine explizite PHP5-Applikation betreibst, dann nimm die 4.4.0, die läuft fast 10x schneller..

Beim Apache ev. die "Hostnamelookups" auf OFF setzten, wenn du die nicht zwingend brauchst. Den Apache 2 (sofern vorhanden) seriös parametrisieren. Dieser kann extrem zickig sein im vergleich zum 1.3.x. Nicht verwendete Module deaktivieren etc..

Was bei solchen Aktionen auch wichtig ist; Logge den Serverload (Traffic, CPU-Load, Requests, Memory), z.B. mit MRTG.

Noch eine persönliche Anmerkung
wink.gif

Suse ist nach meiner Ansicht ungeeignet für den Serverbereich. BSD oder Debian performen wesentlich besser ;-) Und natürlich nur per Konsole betreiben..
wink.gif


Einer meiner Kunden betreibt eine Community auf nem Dedicated-Server bei nur 1GB Ram und nem P4-2.8 Ghz mit Raid 1. Selbst bei 250 Usern online liegt die PHP-Parsingzeit bei knapp 100ms
wink.gif
CPU geht nie über 35%.
 
Na ja im Apache kann man ja extrem viel tunen noch. Wenn ich SuSE so kenne haben die eh tausend Module installiert bei dem und 500 davon aktiviert
wink.gif
Da kann man sicher noch viel einstellen.
 
Bleibt doch Mal beim Thema, Leute.
Andi will doch nur seine Datenbank zum laufen bringen - ich wär froh, wenn ich die mysql.ini zu sehen bekäme, dann könnte ich ihm direkt helfen.

 
QUOTE Andi will doch nur seine Datenbank zum laufen bringen




QUOTE ich wollte hier bei euch mal nachfragen ob jemand Tips und Infos für mich hat, wie ich einen Server für meine Seite optimieren kann.


Bis jetzt sehe ich keinen wirklichen OT Beitrag in diesem Thread..
biggrin.gif
 
QUOTE Die Hauptlast wird durch SQL Abfragen verursacht.


und aufgrund der von ihm geposteten Laufzeit-Infos wundert es ja nicht wirklich.
Also ist MySQL erstmal Priorität No. 1
 
Zurück
Oben