HI, Alexander
Das spricht für eine organisch gewachsene Anwendung ("Krebsgeschwür"), die jetzt plötzlich attraktiv geworden ist.
So plötzlich ist es nicht gewachsen. Google mag meine Inhalte...
Du brauchst jemanden, der sich WIRKLICH damit auskennt.
Hab keinen ;O) und mit Linux kenne ich mich nur oberflächlich aus.
Es geht nicht um Größe, es geht um Geschwindigkeit. Wenn Deine Anwendung 80% der Zeit mit dem Shared Memory rumfummelt, obwohl es nur 10KByte groß ist, ist es Dein Problem.
1 mal lesen + 1 mal schreiben pro Zugriff im Ram das sollte den Server nicht plattmachen.
Finde den Bottleneck.
JA ABER WO??? Oder besser gesagt wie??
Messen, messen, messen, und nochmal messen.
Kannst Du mir bitte sagen wie! Programme die sowas unter Linux das machen sind mir nicht bekannt.
Hast Du passende Indices in der DB angelegt? Ich denke schon.
Hast Du oder hast Du nicht? Nicht raten, prüfen!
Die Prozessliste sieht gut aus.
Das ist der falsche Meßwert. Die Prozessliste zeigt Dir bestenfalls kumulierte Symptome.
Hast Du je eine Liste der am häufigsten und am längsten laufenden SQL-Queries? Wenn nein, warum nicht?
Nein, das habe ich mir auch schon überlegt. Gibt es zum Auswerten der Mysql Querie logs Programme. Bzw. wiekann ich das bewerkstelligen?
Hast Du überprüft, auf welchen Spalten und Spaltenkombinationen die Queries laufen? Und das für diese schweren Fälle passende Indices vorhanden sind?
Zumindest das was mir bekannt ist Explain Select .......... usw.
Mysql liegt bei 65% von der CPU.
Das bestätigt meine Vorurteile. ;-) Ich halte das für wesentlich zu viel.
Meine Vermutung ist auch das es an Mysql liegen kann. Mir fehlen einfach Vergleichswerte.
Laufzeit-Informationen Dieser MySQL-Server läuft bereits 0 Tage, 14 Stunden, 14 Minuten und 15 Sekunden. Er wurde am 12. Januar 2009 um 20:49 gestartet.
Abfragestatistik: Seit seinem Start wurden 1.608.278 Abfragen an diesen MySQL-Server gesandt. Insgesamt ø pro Stunde ø pro Minute ø pro Sekunde 1.608.278 112.960,70 1.882,68 31,38
Abfrageart ø pro Stunde % admin commands 186 13,06 0,01 % alter table 0 0,00 0,00 % analyze 0 0,00 0,00 % backup table 0 0,00 0,00 % begin 0 0,00 0,00 % change db 155.905 10.950,31 10,69 % change master 0 0,00 0,00 % check 470 33,01 0,03 % commit 0 0,00 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 % delete 69.747 4.898,82 4,78 % delete multi 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 % 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 % insert 356.186 25.017,45 24,43 % 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 0 0,00 0,00 % optimize 20.824 1.462,62 1,43 % purge 0 0,00 0,00 % rename table 0 0,00 0,00 % Abfrageart ø pro Stunde % repair 0 0,00 0,00 % replace 0 0,00 0,00 % replace select 0 0,00 0,00 % reset 0 0,00 0,00 % restore table 0 0,00 0,00 % revoke 0 0,00 0,00 % rollback 0 0,00 0,00 % savepoint 0 0,00 0,00 % select 398.842 28.013,49 27,35 % set option 0 0,00 0,00 % show binlog events 0 0,00 0,00 % show binlogs 2 0,14 0,00 % show create 0 0,00 0,00 % show databases 4 0,28 0,00 % show fields 0 0,00 0,00 % show grants 0 0,00 0,00 % show keys 0 0,00 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 processlist 1 0,07 0,00 % show slave hosts 0 0,00 0,00 % show slave status 0 0,00 0,00 % show status 3 0,21 0,00 % show innodb status 0 0,00 0,00 % show tables 60 4,21 0,00 % show variables 1 0,07 0,00 % slave start 0 0,00 0,00 % slave stop 0 0,00 0,00 % truncate 0 0,00 0,00 % unlock tables 0 0,00 0,00 % update 109.894 7.718,63 7,54 %
Weitere Statusvariablen Variable Wert Created tmp disk tables 99375 Created tmp tables 129594 Created tmp files 9 Delayed insert threads 0 Delayed writes 0 Delayed errors 0 Flush commands 1 Handler commit 0 Handler delete 1550 Handler read first 2543 Handler read key 1978625 Handler read next 635034987 Handler read prev 71805 Handler read rnd 4532770 Handler read rnd next 2701195363 Handler rollback 0 Handler update 437814 Handler write 3654345495 Key blocks used 124690 Key read requests 529305367 Variable Wert Key reads 244033 Key write requests 297290 Key writes 202698 Max used connections 46 Not flushed key blocks 0 Not flushed delayed rows 0 Open tables 541 Open files 1006 Open streams 0 Opened tables 548 Qcache queries in cache 46987 Qcache inserts 244529 Qcache hits 347917 Qcache lowmem prunes 117797 Qcache not cached 145059 Qcache free memory 30957920 Qcache free blocks 9253 Qcache total blocks 107411 Rpl status NULL Variable Wert Select full join 289 Select full range join 0 Select range 127462 Select range check 0 Select scan 132134 Slave open temp tables 0 Slave running OFF Slow launch threads 0 Slow queries 184 Sort merge passes 3 Sort range 117899 Sort rows 4594592 Sort scan 147808 Table locks immediate 607781 Table locks waited 2376 Threads cached 17 Threads created 95 Threads connected 9 Threads running 6
Speicherfresser (Counter usw.) habe ich vernichtet. Ich dachte erst das es daran liegt.
Definitiv nicht. Deine Load ist um 500% bis 1000% zu hoch, weil zu viele Prozesse gleichzeitig laufen müssen, was darauf zurückzuführen ist, dass Du die Requests nicht SCHNELL genug abarbeitst.
Werden statische Resourcen schnell ausgeliefert? Dann ist der Apache aus der Nummer raus, und das Problem ist deine Anwendung.
Evtl. kann es an mod_rewrite liegen. PHP > *.html
Nichr raten, messen, messen, messen.
Ja womit und wie?
Je komplexer deine Rewrite Rules sind, desto mehr Zeit muß der Apache dort verbrennen. Wenn Du nur ein oder zwei einfache Regeln hast, ist es nicht mod_rewrite.
Warum willst Du Deine Anwendung unbedingt mit einem ".html" am Ende der URL ausliefern? Dem Browser ist das Ende der URL vollkommen egal, umd dem Server macht es weniger Arbeit, wenn Du auf so einen Unsinn verzichtest.
Geht nicht bin auch ein wenig SEO
Nutzt Du Caching-Funktionen in Deiner Anwendung? Cachst Du die Sachen, die lange dauern, oder was Dir gerade einfiel? Übertreibst Du es mit dem Caching?
Ja! ca. 24 Stunden als *.zip File. Mysql Cache ist on. Hauptdatenbänke im Cache ohne upload und co.
Du hast keine Ahnung, wovon ich rede, oder?
Kann schon sein. Bei der Entwicklung der Seite habe ich mir überlegt wenn ich Datenbankabfragen der letzten 24h als File bzw. fertiges *.html im Cache Ordner lege gewinne ich Zeit und entlaste den MysqlServer.
Wenn Du 20x eine Liste aller Uploads eines Users brauchst, machst Du dann 20x "SELECT FROM UPLOADS WHERE userid=x"? Oder machst Du den SELECT nur beim ersten Mal und merkst Dir das Ergebnis für die nächsten 19 Mal?
Das macht der Mysql Cache
Was außer Apache und MySQL benutzt Du? PHP
Version? Libraries? Frameworks?
Da habe ich keine Ahnung was Du meinst. Ich nutze so gut wie keine fertigen Programme.
MySQL Version 4.0.23_Debian-7 Php Version 4.3.10,
Ein Update möchte ich nicht weil ich nicht weis ob dann noch alles läuft!
Noch eine Überlegung:
(D)ein Webserver hat genau dann alle Hände voll zu tun, wenn ein Request kommt: Request verarbeiten, PHP-Interpreter starten, PHP Interpretieren, Datenbank-Abfragen machen, Ergebnis ausrechnen, Ergebnis zurückschreiben, Logs schreiben. Und all das passiert, grob betrachtet, gleichzeitig. In dem Moment, in dem Deine Anwendung die CPU braucht, will auch die DB reichlich CPU haben. Und um RAM und Festplatte streiten sich auch beide.
Daraus folgt: Du könntest die Datenbank auf eine separate Maschine packen, so dass sich DB und Applikation bei CPU, RAM und HDD nicht gegenseitig im Weg stehen. Dann wird allerdings die Netzwerkverbindung u.U. ein Bottleneck.
Ich habe einen managed Server weil ich kein Linux Mensch bin.
Ein Patch-Kabel direkt zwischen den Servern wäre optimal, aber eine gewitchte Umgebung tut's meistens auch. Je schneller das Netzwerk ist, um so besser. 100 MBit/s sollten es schon sein, 1 GByte/s wäre schöner. Und die Absicherung wird natürlich extrem wichtig. Ein dediziertes Kabel zwischen Web- und DB-Server mit IP-Adressen aus dem privaten bereich (z.B. 192.168.42.1 und 192.168.42.2) wäre optimal und absolut dicht, wenn Du auf einen zweiten Mietserver gehst, muß die DB sich selbst schützen, damit nur der Webserver Zugriff hat.
Es gibt natürlich auch andere Optimierungsmöglichkeiten: Es wäre blöd, den PHP-Code Deiner Anwendung für jeden Request komplett neu zu parsen und zu interpretieren, obwohl sich der Code nicht ändert. Deswegen gibt es gerade für PHP einiges an Software, um PHP zu beschleunigen, in der Regel dadurch, dass ein permanent laufender Prozess den Code einmal einliest und den geparsten Code im Speicher hält, um so pro Request das Parsen einzusparen. Google ist Dein Freund, http://en.wikipedia.org/wiki/PHP_accelerator ist ein brauchbarer Anfang.
»» Habe ich mir mal vor längerer Zeit angesehen. Aber irgendwie sind damals nur die kostenpflichtigen Versionen stabil gewesen.
Und dann bleibt natürlich noch Deine Anwendung. Überlege, was Du jedes Mal neu berechnen mußt und was Du vorberechnen kannst. Vermeide, ALLE Resourcen per PHP auszuliefern. Dateien auf dem Webserver durch PHP zu schleusen ist in den meisten Fällen unsinnig. Javascripte und Stylesheets sowie die meisten (alle) Bilder kann der Webserver ohne PHP wesentlich schneller ausliefern.
Passen Deine Datenformate zu Deiner Anwendung? Wenn Du für jeden Request erst einmal ein 20 MByte großes XML-File durchkauen mußt, hast Du Deine Daten falsch abgelegt. Berechnet Deine Anwendung irgendwelche Sachen auf Verdacht bzw. auf Vorrat? Raus damit, wenn die Berechnung in den meisten Fällen nicht benötigt wird.
Das ist nicht soeinfach umzusetzen. Bei den Anwendungen kann kein reines Filesystem aus statischen Seiten Anwendung finden.
Danke für Deine Ausführungen.
Und nochmals eine Frage welche Programme / Befehle eignen sich unter Linux / Php zum finden von Laufzeitintensiven Prozessen.
Also eine Auswertung / Überwachung von:
top
1546 nobody 16 0 143m 4912 3540 R 19.1 0.2 0:00.50 0 /usr/sbin/httpd -k restart
Simone