perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 23
Click for quality!




11.02.2012 / 16:30

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragServer mit vielen Clients und hohem Datendurchsatz
Seitenanfang
Hallo,

ich möchte für eine Clusterumgebung eine Client-Server-Strucktur aufbauen. Dabei sollen ca. 400 Clients an einen Server Daten schicken. Die Clients erzeugen kontinuierlich mittlere Mengen an Daten, bei einigen Clients kann es aber auch schon mal wesentlich mehr sein. Nun zu meiner Frage:

Wie implementiert man den Server am geschicktesten:

1. Variante
Ein Multi-Prozess-Server, der dynamisch forkt
Vorteil: Jeder Client bekommt seinen eigenen Server-Prozess
Nachteile: Server ist viel mit forken beschäftigt

2. Variante
Ein Multi-Prozess-Server, der statisch die benötigte Anzahl Forks erzeugt
Vorteil: Jeder Client bekommt seinen eigenen Server-Prozess
Nachteil: Extremer Speicherverbrauch (quasi 400 mal perl)

3. Variante
Wie 1. und 2., aber mit Threads
Vorteil: Jeder Client bekommt einen fast eigenen Server
Nachteil: Speicherverbrauch

4. Variante
Ein Server Prozess, Abfrage der Sockets nacheinander mit IO::Select
Vorteile: Server bleibt schön klein
Nachteile: Frage, ob das Sinnvoll ist, da die Client kontinuierlich Daten senden und ein kaputter Client alle anderen ausbremst

Was meint ihr dazu? Sehe ich bei einer Varianten etwas falsch? Hat jemand noch eine andere Idee?

Besten Dank schon mal
Nicolas

Datum: 03.05.2006-21:52

Beitragre: Server mit vielen Clients und hohem Datendurchsatz
Seitenanfang
Hi,

nach meiner Ansicht ist Variante 1 die geeignete. In erster Linie geht es ja darum die Speicherauslastung in Grenzen zu halten, damit nicht das komplette System ausgebremst wird.

Und bei genauer Betrachtung ist das Forken keine ressourcenfressende Angelegenheit. Man muss nur aufpassen, dass die geforkten Prozesse nach getaner Arbeit wieder korrekt beendet werden, damit Du keine Zombies im Prozessbaum hängen hast. Das lässt sich ja duch einen SignalHandler recht simpel machen.

Der Server sollte in jedem Falle so aufgebaut sein, dass Speicherbereiche, die nicht mehr benötigt werden, auch sofort wieder freigegeben werden, sprich "undef" setzen. Weiterhin sollte komplett auf lokale Variablen und Referenzen gesetzt werden. Auch wäre es nach meiner Ansicht sinnvoll, Objekte für das DatenHandling erst nach dem Fork einzubinden, nämlich dann wenn sie benötigt werden. So kannst Du den Server im Speicher schön schmal halten.

Außerdem würde ich zusehen, dass die temporäre Datenspeicherung (falls erforderlich) NICHT in /tmp passiert, sondern auf einer anderen Partition, die groß genug ist Temporärdaten von 400 Datenübertragungen aufzunehmen. Denn wenn /tmp voll läuft, kannst Dir vorstellen was passiert.

Wie das mit den Threads ist weiß ich ehrlich gesagt gar nicht. Ich habe selbst noch keine solche Anwendung programmiert. Ich denke hier wären Semaphoren ein geeignetes Mittel. Aber damit habe ich noch keine Erfahrung, sondern nur theoretisches Halbwissen.

-uw

Datum: 04.05.2006-13:00

-






-
-