PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP - Netzlast messen


ethrandil
2003-04-16, 14:39:19
Hiho,
ich (asche über mein haupt) hab mir in meiner Not mal PHP angesehen :kotz:



Nun was ich brauche: ich will auf einer größeren LAN einen FTP / HTTP-Server mirroren.
Denn ich gehe davon aus, dass 40 leute gleichzeitig saugen können wollten ;)
Nun: Ich möchte ein PHP-Script, welches die netzlast der einzelnen Mirrors testet und dann denn besten auswählt für den aktuellen download!

Soweitsogut. ich hab das ganze nun mit exec("ping -c 1 ip") gelöst.
Schön ist das nicht und ich kann irgendwie keinen weiteren parameter angeben!! bei "ping -c 1 -s 2048 ip" bekomme ich garkeine ausgabe!

Kann man nicht irgendwie mit Sockets dafür benutzen?

mfg Eth

Demirug
2003-04-16, 18:51:33
von php habe ich wirklich kaum ahnung aber ich versteh nicht so ganz was dir die Pingzeiten bei der Wahl eines downloadserver nutzen sollen.

Die Pingzeiten sagen ja relative wenig darüber aus wie belastet ein server ist.

ethrandil
2003-04-16, 21:58:32
ja, eben.
Also brauch ich n anderes mass ...
'N paket ab 2 mb größe könnte mir durchaus auskunft geben, aber das geht ja auch nicht...

Ne andere Möglichkeit wäre, ne minütlich aktualisierte Datei auf den servern zu platzieren, aber das wäre ja wieder arbeit ... und wie seh ich den Datentransfer unter linux ... Fragen über fragen

Captain America
2003-04-17, 15:38:52
bastel eine client-server umgebeung. jeder ftp-server hat eine PHP seite, die beim aufruf folgendes ausgibt:



$last = *deincodehier*;

header("Content-Type: text/plain");
echo($last);



$last könnte zb "17" sein, das heisst 17 leute saugen.

eine weitere seite (auf dem server der die last verteilt) läuft per cronjob jede minute ein mal, und sammelt daten über alle server, und speichert sie, zb in XML:


<?xml version="1.0"?>

<serverload>
<server ident="1" load="17" />
<server ident="2" load="5" />
<server ident="3" load="8" />
</serverload>


die 3 und letzte seite in diesem compound ist die seite die der user aufruft, sie lädt die xml datei, sucht den am wenigsten belastetsten raus und leitet dorthin weiter.

ich lehne mich mal weit aus dem fenster und sage man kann sowas in 30 minuten zur marktreife bringen. :D

Fragen?

ethrandil
2003-04-17, 15:54:14
Originally posted by Captain America
ich lehne mich mal weit aus dem fenster und sage man kann sowas in 30 minuten zur marktreife bringen. :D
Du, das trifft sich ganz gut, ich muss jetzt nähmlich mal 2 std- weg. kann ich dann bei meiner ankunft damit rechnen *frechsei*?

Mein Info-lehrer meinte man könnte nen ping schicken, die ID merken, dann nochmal senden und von der ip-differenz rückschlüsse auf den traffic schließen ;)

(nehmen wir mal einfach für o.g. an, dass php nur auf dem server läuft ;) )

Woher bekommt das script die anzahl der saugenden?

Captain America
2003-04-17, 16:17:31
Originally posted by ethrandil

Du, das trifft sich ganz gut, ich muss jetzt nähmlich mal 2 std- weg. kann ich dann bei meiner ankunft damit rechnen *frechsei*?

Mein Info-lehrer meinte man könnte nen ping schicken, die ID merken, dann nochmal senden und von der ip-differenz rückschlüsse auf den traffic schließen ;)

(nehmen wir mal einfach für o.g. an, dass php nur auf dem server läuft ;) )

Woher bekommt das script die anzahl der saugenden?

Dein Lehrer hat den After offen, sowas macht man nicht. Und du hast ihn auch offen, ich mache nix für dich, NIX! ;D

Skript 1: auf dem FTP server
Skript 2: auf dem HTTP Server, Backend
Skript 3: auf dem HTTP Server, Frontend

Skript 2 läuft alle x sekunden und speichert die daten in eine xml datei. die anzahl der saugenden erhält es von skript 1. skript 3 sieht der user, die daten liesst es aus der xml datei.

wie du in Skript 1 die Anzahl der saugenden erhälst...

1.) entweder anpassen für den FTP server (der FTP server hat bestimmt einen status-monitor)

2.) per netstat tricksen ;D

3.) per ps ax | grep ftp tricksen ;D

4.) das ganze system so bauen, dass das verteilerskript nix über die anzahl der saugenden weiss, sondern bei den downloads immer im kreis geht (1 user startet download bei server 1, 2 user startet download bei server 2, 3 user startet download wieder bei server 1, ...). unter der annahme dass alle dateien ungefähr gleich gross sind und alle user ungefähr gleich schnell sind sollte das klappen. know what i mean?

ethrandil
2003-04-17, 18:52:07
Originally posted by Captain America
Dein Lehrer hat den After offen, sowas macht man nicht.

Mein Lehrer lernt von mir nicht umgekehrt, merk dir das!
;)
Originally posted by Captain America
know what i mean?
klar ;D

govou
2003-04-21, 23:05:51
mmhh...
warum so kompliziert?
Verteile die "Sauger" doch mitm Script gleichmäßig auf die Mirrors.

ethrandil
2003-04-21, 23:16:05
das ist zu einfach ;)

Angenommen mirror 1 bekommt zufällig nur Treiber-DLs von 5 MB und der 2. immer 120 MB Introvideo ...

Captain America
2003-04-21, 23:40:26
Originally posted by ethrandil
das ist zu einfach ;)

Angenommen mirror 1 bekommt zufällig nur Treiber-DLs von 5 MB und der 2. immer 120 MB Introvideo ...

Firlefanz...

ethrandil
2003-04-22, 00:23:32
Und mal ganz hypotetisch angenommen das ganze ist inoffiziell auf ner LAN ...:D

Captain America
2003-04-22, 09:59:19
Originally posted by ethrandil
Und mal ganz hypotetisch angenommen das ganze ist inoffiziell auf ner LAN ...:D

Will da etwa jemand das DL-Verbot umgehen? :nono:

ethrandil
2003-04-22, 15:28:58
naja, es handelt sich ja, vielleicht, um legale Dinge =)

(Eigene Filme, Fotos, Treiber, Freeware ;) )

micki
2003-04-24, 16:26:50
für sowat wäre ein kleiner eigener http server vielleicht besser als php.

die könnten ja selber auf ein html abrufbar haben mit der aktuellen auslastung, die müßten ja wissen was sie verschicken ;)

sowas mal eben zu coden sollte nicht die welt sein, man bekommt im reqeust "get.." und die datei öffnen man und schickt sie zurück (nach einer leerzeile die den header vom body trennt)

und redirect geht wohl mit 303 glaube ich, also auf einen nicht so ausgelasteten server.

MfG
micki

ethrandil
2003-04-24, 19:49:51
Originally posted by micki
für sowat wäre ein kleiner eigener http server vielleicht besser als php.
Zeig mir mal php ohne webserver ;)

die könnten ja selber auf ein html abrufbar haben mit der aktuellen auslastung, die müßten ja wissen was sie verschicken ;)
Peil ich jetzt grade nicht ... wie kann man denn bitte ein html abrufbar haben? Die spec. bringt ihnen nix.
Wie soll ich denn deiner meinung nach die Auslastung dynamisch anzeigen, ohne php / perl ??

sowas mal eben zu coden sollte nicht die welt sein, man bekommt im reqeust "get.." und die datei öffnen man und schickt sie zurück (nach einer leerzeile die den header vom body trennt)
Sorry, aber ich versteh das deutsch irgendwie net ... bin ich blöde?

und redirect geht wohl mit 303 glaube ich, also auf einen nicht so ausgelasteten server.
Da kenn ich mich ehrlich gesagt nicht aus, kannst das genauer erklären? wie man an den Errors sieht, wie schnell ein server ist :?

Sorry, aber ich werd daraus echt net schlau

micki
2003-04-24, 20:49:47
mit eigener server meinte ich einen selbst gecodeten... nun sollte vielleicht alles klar sein :)

MfG
micki

ethrandil
2003-04-24, 21:11:34
japp, hab nur leider keine erfahrung damit.
Ich werd mich mal ranmachen, danke.

Captain America
2003-04-24, 22:06:16
Originally posted by micki
für sowat wäre ein kleiner eigener http server vielleicht besser als php.

die könnten ja selber auf ein html abrufbar haben mit der aktuellen auslastung, die müßten ja wissen was sie verschicken ;)

sowas mal eben zu coden sollte nicht die welt sein, man bekommt im reqeust "get.." und die datei öffnen man und schickt sie zurück (nach einer leerzeile die den header vom body trennt)

und redirect geht wohl mit 303 glaube ich, also auf einen nicht so ausgelasteten server.

MfG
micki

Klar geht das, aber warum sollte man ein Gerüst dass einem die ganze Scheiss HTTP Parserei abnimmt (Apache zb) durch ein eigenes Ersetzen? Das Rad neu erfinden! ;)

PHP gibt noch ein fertiges Session-Management dazu.

micki
2003-04-24, 22:28:27
mit dem WInet api geht es einfach

MFC hat auch alles fertig für nen http server/client (hab nen server in ca 2h gecodet), ist echt viel zu einfach geworden... wo bleibt da der spass :)

MfG
micki

Marcel
2003-04-25, 14:03:12
Originally posted by ethrandil

Zeig mir mal php ohne webserver ;)



ohne laufenden Webserver:


D:\PHP>echo "<? echo 'honk!'; ?>" > x.php

D:\PHP>php x.php
X-Powered-By: PHP/4.0.6
Content-type: text/html

"honk!"

D:\PHP>


Kann sogar graphische Oberflächen (mit dem GTK-Toolkit, glaube ich).

ethrandil
2003-04-25, 14:50:45
mhh, ja von sowas abartigem habe ich mal gehört ;)

PHP ist soooo hässlich, das taugt imo höchstens für WEB, das ja schon durch mangelnde Kompatibilität geschädigt ist ...

Zum thema Webserver:
Ich mach das ganze mal in Java...
Habe schon eine halb funktionierende Version, leider recht dreckig danke learning by doing ;)
Ich arbeite grade an ner Hübschen VErsion.
Die Architektur wird folgendermaßen aussehen (vielleicht verkauf ichs ja mal ...):

Soll ich die diagramme erklären, oder besteht da kein bedarf?
oder hat gar jemand noch bessere Vorschläge ;)

Grundsätzlich isses so:
Der normale server stellt ne anfrage an den Controller (irgendwo im netz), welcher als redirect die Adresse des am wenigsten ausgelasteten servers zurückgibt.

EDIT: Der redirect-GET wird mit einem bestimmten TAG versehen, momentan ist es (noch) /LAN

micki
2003-04-25, 15:28:40
sowas kann ziemlich "dreckig" sein.
wenn den kontroller ausfällt, ist alles tod.
es wäre besser, meiner bescheiddenen meinung nach, wenn jeder server jeden anderen fragen könnte wie hoch seine last ist und anhand dessen dem client mitteilt von welchem der download laufen soll.

das mit dem tag versteh ich nicht ganz, benutzt du etwa nicht http?

wenn du http benutzen würdest, dann könntest du dir den client sparen, weil du ein redirekt schon im http protokoll hast.

wenn also jemand wat downloaden wollen würde, würde ich ihn an deiner stelle an einen redirekt port schicken z.B. ich:81/windows.zip und dort würde dann die abfrage der server laufen und zum besten könnte man den user dann mittels (ich bin mir nicht ganz sicher) 303 leiten, z.B. er:82/windows.zip

dann würde jeder mit brwoser bedient werden können.


Mfg
micki

ethrandil
2003-04-25, 15:37:47
Client = Browser

Natürlich benutze ich Http =)
Der Tag ist zum identifizieren von Redirecten Links, da diese ja ansonsten nicht als redirect zu erkennen sind, und so wieder abgestimmt würde, und wieder, und wieder, ...

Zum Thema selber abstimmen: Ja, theoretisch wäre das natürlich möglich, aber das ist mir momentan noch zu schwer... Ich bau erstmal das hier fertig. Vielleicht baue ich eine Methode ein, bei der der Server einfach von sich aus schickt, wenn er den server nicht erreichen kann.

micki
2003-04-25, 15:42:45
deswegen hab ich im beispiel ja die verschiedenen ports gemacht, kannst ja machen, dass an port 81 zu nem server mit port 82 redirektet wird.

MfG
micki

ethrandil
2003-04-25, 15:57:48
hmm stimmt ........ gute idee =) thx!!

Captain America
2003-04-25, 16:01:52
keep it simple, eth!

micki, erklär mir bitte warum jetzt ports ins spiel kommen, verstehe ich nicht.

ethrandil
2003-04-25, 16:22:16
Der ein ePort ist zuständig für alle direkten anfragen von den Browsern. Also, wenn man die Datei aufruft.
Das ganze wird dann durch den Controller mit dem Richtigen server versetzt und dann auf nem anderen Port zur verfügung gestellt, als normalen HTTP-Download.

Die Ports machen es einfacher =) Da ich so sicher weiß, welche GET-Requests wozu da sind, ob sie bereits den richtigen Server enthalten.

Captain America
2003-04-25, 16:33:42
Originally posted by ethrandil
Der ein ePort ist zuständig für alle direkten anfragen von den Browsern. Also, wenn man die Datei aufruft.
Das ganze wird dann durch den Controller mit dem Richtigen server versetzt und dann auf nem anderen Port zur verfügung gestellt, als normalen HTTP-Download.

Die Ports machen es einfacher =) Da ich so sicher weiß, welche GET-Requests wozu da sind, ob sie bereits den richtigen Server enthalten.

Du könntest auch einfach einen QueryString anhängen:

GET /file.php?id=123&noredir=true HTTP/1.1

Das spart administrativen Aufwand beim Webserver.

Bei einer Variante mit nur einem Controller hast du den Vorteil dass du Server leicht hinzufügen kannst, ohne dass man extra Software installieren muss.b Dezentral würde ja jeder Server jeden Anderen abfragen.

If you can get 90 percent of the desired effect for 10 percent of the work, use the simpler solution.

ethrandil
2003-04-25, 16:50:24
Der Server ist momentan 100 pro von mir gecoded, da hält sich der Administrative aufwand, dank Hardcoding (;D) in Grenzen ;)

Mit angehängter ID hatte ichs ja vorher quasi, aber mit 2 ports ist es leichter zu coden, da man keinen switch-mechanismus mehr braucht

viele grüße an die stimme aus dem off ;)

micki
2003-04-26, 20:07:45
und,läuft das scho?

MfG
micki

ethrandil
2003-04-26, 20:27:37
ja, läuft.

Aaber das ganze hat so seine Probleme mit der Geschwindigkeit.
Ich habe für jeden Download einen extra Thread und lasse die parallel senden, das ganze kommt aber nicht auf 50% für jeden ...
Ich habe mir überlegt ich bau mir einfach ein Programm, welches Systemprogramme nutzt, um das zu ermitteln.
Das Ganze wird dann protokolliert (zentral, wie jetzt auch) und dann macht PHP den rest.

Es ist einfach unmöglich qualitativ an Apache heranzukommen.

Die Frage wäre nur: Wie bekomme ich die Übertragene Datenmenge, und wie bekomme ich die downloads?

für letzteres fällt mir ein - apache-threads zählen...

ps -A | grep httpd | wc

aber wie bekomme ich die übertragungsgeschwindigkeit?

micki
2003-04-27, 12:22:13
naja, threads sind nicht so optimal, sag ich schon immer ;)

"Ich habe für jeden Download einen extra Thread und lasse die parallel senden, das ganze kommt aber nicht auf 50% für jeden " 50% der maximal übertragung?

codest du das in java?, da könntest du nach dem senden eines blocks den thread wechseln, vielleicht würde das dann besser laufen?

wie groß sind die datenblöcke die du sendest? davon könnte auch die performance abhängen.

MfG
micki

ethrandil
2003-04-27, 14:27:43
datebblöcke sind 1024 Bytes. Ich habs aber auch mal mit 10240 versucht, bringt (im lan) keinen uspürbaren unterschied.

Thread.yield() hab ich ganz vergessen, bau ich mal ein =)

micki
2003-04-28, 01:01:06
ich glaube datenblocke (so absurt das auch sein mag) sind im lan 1536 oder 1568 oder so groß, versuch das vielleicht damit.

MfG
micki

Captain America
2003-04-28, 15:22:45
Originally posted by micki
ich glaube datenblocke (so absurt das auch sein mag) sind im lan 1536 oder 1568 oder so groß, versuch das vielleicht damit.

MfG
micki

Da wäre der TCP/IP Header noch mit drin, also sollte eth weniger als das senden. IMHO bringen Datenblöcke hier nix. Ethrandil, du benutzt doch brav Buffered-Classes?