Wie benutze ich alle CPUs?

Alles, was den Apache betrifft, kann hier besprochen werden.

Wie benutze ich alle CPUs?

Postby d3javu » 19. March 2010 10:27

Hi Leute,

folgendes Problem:

Der Apache2/MySQL mit PHP5 verteilt Prozesse nicht auf alle Prozessoren.
Dachte es liegt daran, dass ich den MPM-Prefork installiert hatte und habe dann den MPM-Worker mit PHP5-cgi installiert.

Wie man sieht, ist nur CPU7 ausgelastet ...
Die Abfrage ist viel langsamer als unter Windows, denn da verteilt er auf alle Prozessoren. Was mach ich falsch?

Code: Select all
Code: Alles auswählen
    top - 15:10:58 up 16 days, 22:57,  5 users,  load average: 0.15, 0.23, 0.45
    Tasks: 133 total,   2 running, 131 sleeping,   0 stopped,   0 zombie
    Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu3  :  0.7%us,  0.3%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Cpu7  : 98.7%us,  1.3%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3960284k total,  1051388k used,  2908896k free,   108604k buffers
    Swap:  1949688k total,        0k used,  1949688k free,   694020k cached

      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    28342 phpuser    20   0 22608 7492 4760 R   99  0.2   0:09.02 php5-cgi
    28217 root      20   0  8156 2744 2256 S    1  0.1   0:11.96 sshd
    28341 root      20   0  2388 1160  884 R    1  0.0   0:00.36 top
    23704 mysql     20   0  267m 172m 5344 S    1  4.5   3:22.04 mysqld
    28235 root      20   0  2388 1152  884 S    1  0.0   0:26.00 top
        1 root      20   0  1980  640  552 S    0  0.0   0:08.50 init
        2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd
        3 root      RT  -5     0    0    0 S    0  0.0   0:00.00 migration/0
        4 root      15  -5     0    0    0 S    0  0.0   0:16.28 ksoftirqd/0
        5 root      RT  -5     0    0    0 S    0  0.0   0:00.28 watchdog/0
        6 root      RT  -5     0    0    0 S    0  0.0   0:00.00 migration/1
        7 root      15  -5     0    0    0 S    0  0.0   0:01.24 ksoftirqd/1
        8 root      RT  -5     0    0    0 S    0  0.0   0:00.00 watchdog/1
[/quote][code]




Installiert ist es jetzt so:
http://www.christophfischer.com/linux/1 ... n-50-lenny


Was kann ich tun damit er alle CPUs verwendet?

System:

Debian Linux Lenny 2.6.26-2-686 #1 SMP
d3javu
 
Posts: 7
Joined: 19. March 2010 10:22

Re: Wie benutze ich alle CPUs?

Postby Pitze » 19. March 2010 23:17

Was kann ich tun damit er alle CPUs verwendet?

Sich mit dem Installierten Betriebssystem auseinander setzen
Der grösste Vertrauensbruch ist der Blitzableiter auf der Kirchturmspitze
User avatar
Pitze
 
Posts: 210
Joined: 20. November 2003 21:38
Location: Huskvarna-Schweden
Operating System: Windows Vista

Re: Wie benutze ich alle CPUs?

Postby d3javu » 22. March 2010 09:20

Danke Pitze,

tolle Antwort!
Hoffe das deine anderen 164 Beiträge konstruktiver waren.

Bitte um konkrete Vorschläge was ich tun kann, damit es funktioniert!

MfG

D3javu
d3javu
 
Posts: 7
Joined: 19. March 2010 10:22

Re: Wie benutze ich alle CPUs?

Postby Nobbie » 22. March 2010 10:53

So weit ich weiß, kann man das nicht zu Laufzeit konfigurieren, sondern wird vom Compiler entschieden, wahrscheinlich muss sogar mit einer bestimmten Library gelinkt werden, ggf. sogar entsprechende Funktionen vom Programm benutzt werden.

Es ist ja eine bekannte Tatsache (auch unter Windows), dass viele Programme nur einen CPU Kern benutzen.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Wie benutze ich alle CPUs?

Postby d3javu » 22. March 2010 10:54

Da ich Debian verwende, hab ich ja fest kompilierte Pakete und möchte das wegen der bequemen Update Mechanismen auch beibehalten.
Habt ihr da Tipps, wie das richtige Paket heißen könnte?
Dachte dass der MPM Worker genau das sein sollte ....
d3javu
 
Posts: 7
Joined: 19. March 2010 10:22

Re: Wie benutze ich alle CPUs?

Postby Nobbie » 22. March 2010 11:45

Ich habe mir übrigens mal diesen Link durchgelesen, nach dem Du den Server konfiguriert hast.

Das ist ein ziemlich mittelmäßiger Beitrag mit sehr viel gefährlichem Halbwissen, der Autor weiß offensichtlich nicht alles, was er wissen müßte. Einige Punkte sind sogar richtiggehend falsch (die Behauptung, man könne unter mod_php nur eine zentrale php.ini angeben - das ist schlicht unwahr, man kann für jeden VirtualHost beispielsweise eine eigene php.ini definieren).

Also auf das Geschreibsel würde ich mich nicht verlassen und ich kann die mpm-Worker nicht empfehlen, weil sie insgesamt instabiler läuft. Der Prefork braucht zwar (bei sehr hoher Last) mehr Speicher, aber wenn man 4GB einbaut, ist das schon recht opulent für einen Single-Site-Webserver.

So oder so hat die Wahl von Worker oder Prefork keinen Einfluss auf die Ausnutzung der CPUs. Ich glaube ohnehin nicht, dass die Performanceverschlechterung einer einzigen MySQL Abfrage (falls ich Dein Problem richtig verstanden habe) davon abhängt, wieviele CPUs physikalisch genutzt werden. Ich habe sehr viele Artikel über MulticoreCPUs in Webservern studiert und es kommen alle zu dem Ergebnis, dass bei wenigen Anfragen die CPU ohnehin "Däumchen dreht". Erst bei 10.000(!) Anfragen pro Minute und mehr wird es interessant, ob die Prozesse auf verschiedene CPUs verteilt werden. So oder so wird ein einzelner Thread immer nur auf einer einzigen CPU durchgeführt. Und eine Anfrage ist nie mehr als ein Thread.

Vielleicht stimmt etwas ganz anderes nicht, wenn die Performance so dramatisch schlechter ist. Dazu müßtest Du aber mal genauer beschreiben, was denn nun langsamer ist in welchem Kontext.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Wie benutze ich alle CPUs?

Postby d3javu » 22. March 2010 11:50

Hallo Nobbie,

erstmal danke für die ausführliche und wirklich konstruktive Antwort. Manch anderer Post oben könnte sich da eine Scheibe abschneiden.

Das Problem ist folgendes:
Die Machine hat physikalisch 4 CPUs!
Die Abfrage dauert aber im Vergleich zu einem anderen Server (Windows) mit fast gleicher Hardware deutlich länger (Windows: 16 Sek, Linux: 32 Sek).

Wenn ich bei Windows die Abfrage starte, seh ich im Taskmanager wie alle CPUs ausschlagen.
Die gleiche MySQL Abfrage aus einem PHP File zeigt bei Linux aber nur, wie eine CPU auf 100% läuft (siehe Ausschnitt oben).
Ich denke mir ganz einfach: Warum verteilt Linux die Abfrage nicht auf alle CPUs gleichzeitig wie Windows, dann wäre sie sicher schneller.

Danke für den wirklich wichtigen Hinweis zu der Installationsanleitung!

Gruß
D3javu
d3javu
 
Posts: 7
Joined: 19. March 2010 10:22

Re: Wie benutze ich alle CPUs?

Postby Nobbie » 22. March 2010 12:06

d3javu wrote:Die Abfrage dauert aber im Vergleich zu einem anderen Server (Windows) mit fast gleicher Hardware deutlich länger (Windows: 16 Sek, Linux: 32 Sek).


Das sind aber beides mittlere Katastrophen und für einen Webserver um Welten(!) zu lang. Auch bei 16 sekunden dreht jeder Anwender vorher ab und klickt nochmal oder klickt ganz weg.

Was ist das für eine "Abfrage"?
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Wie benutze ich alle CPUs?

Postby d3javu » 22. March 2010 12:08

Das is nur eine riesen Abfrage zum Performance Check und um mal zu gucken wie sich die beiden Machinen verhalten!
Und sie verhalten sich sehr sehr unterschiedlich!
Nix für den Anwender - um Gottes Willen!! ;-)
d3javu
 
Posts: 7
Joined: 19. March 2010 10:22

Re: Wie benutze ich alle CPUs?

Postby Nobbie » 22. March 2010 12:18

Das ist aber wenig sinnvoll, natürlich verhalten sich die Systeme unterschiedlich. Daraus läßt sich aber überhaupt keine qualitative Aussage herleiten, da dieser "Test" viel zu grob ist und man nicht sehen kann, was die Ursache des Verhaltens ist.

Außerdem heißt das überhaupt nichts in Bezug auf die Serverperformance, es ist durchaus möglich, dass das beispielsweise lediglich unterschiedliches Caching als Ursache hat. Vielleicht ist es auch ein MySQL Problem und hat mit Apache gar nichts zu tun. Oder vielleicht ist fcgi Schuld daran, vielleicht liefe es unter mod_php viel schneller - ist es denn unter Windows auch mit fcgi konfiguriert? Usw. etc. pp. - einfach irgendeine "riesige" Task zu veranlassen ist wie ein Schuss in den Wald.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Wie benutze ich alle CPUs?

Postby d3javu » 22. March 2010 12:23

Ja da hast du recht.
Ich frage mich aber trotzdem: warum verwendet der Linux Server nur eine CPU?
Warum verteilt er es nicht auf alle CPUs ...

Habe zuerst auch mod_php benutzt, dann auf worker gewechselt um zu sehen ob das schneller ist. Jedoch keine Veränderung.

Mein Ziel ist es jetzt einfach, dass er alle CPUs für die Abfrage und Berechnung verwendet ...
d3javu
 
Posts: 7
Joined: 19. March 2010 10:22

Re: Wie benutze ich alle CPUs?

Postby Nobbie » 22. March 2010 12:49

d3javu wrote:JIch frage mich aber trotzdem: warum verwendet der Linux Server nur eine CPU?
Warum verteilt er es nicht auf alle CPUs ...


Weil man nicht einfach Processe und Threads beliebig verteilen kann. Dazu müßtest Du herausfinden, was denn nun genau verteilt wird. Da sind eine ganze Menge Komponenten beteiligt, ich kenne den Test nicht einmal ansatzweise. Da ist aber mindestens Apache dabei, vielleicht ein paar Module (sind die für beide Systeme identisch konfiguriert?), ebenso PHP, auch dort vielleicht ein paar Module (sind auch die alle gleich konfiguriert), dann sind noch MySQL Dienste beteiligt (ist auch das gleich konfiguriert?), sind die Datenbanken identisch, wird vielleicht eine Grafik generiert, wenn ja, werden die gleichen Werkzeuge benutzt, ist ein Browser involviert, wird vielleicht Ajax oder zumindest JavaScript benutzt und und und und - das muss man alles granular in seine Bestandteile zerlegen und einzeln betrachten.

Denn eines ist sicher: auch unter Windows wird Dein Benchmark nicht "einfach so" gerecht auf die vorhandenen CPUs verteilt. Irgendeine (vielleicht auch mehrere) Komponente ist offensichtlich so kompiliert worden, dass es parallele Threads auf mehrere CPUs verteilen kann. Aber was oder wer das ist, das wissen wir noch bei weitem nicht. Wir wissen ja noch nicht einmal, was an diesem Test die lange Laufzeit (auch unter Windows) verursacht. Und persönlich weiß ich überhaupt nichts, deswegen kann ich da auch nur ganz allgemeine und rudimentäre Tipps geben.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Wie benutze ich alle CPUs?

Postby d3javu » 22. March 2010 17:09

Hi Nobbie,

das is klar.
Der Test macht eigentlich nur eine riesen Abfrage auf die MySQL DB über PHP5 - also nichts spektakuläres.

Komponente ist offensichtlich so kompiliert worden, dass parallele Threads auf mehrere CPUs verteilen kann.

Ist nur nen Testsystem und deshalb ein XAMPP installiert, also nicht fcgi.
Ich frage mich nur warum das Paket für Debian dann nicht auch standardmäßig so kompiliert ist, dass es für Server alle CPUs verwendet ...

Im Top sehe ich welche Komponente das ist, die nicht mehrere CPUs nutzen kann:
mit mod_php: /usr/sbin/apache2
ohne mod_php: php5-cgi


Deine allgemeinen und rudimentären Tipps finde ich jedoch super ;-)
d3javu
 
Posts: 7
Joined: 19. March 2010 10:22


Return to Apache

Who is online

Users browsing this forum: No registered users and 20 guests