File-Server Anforderungen für 10.000 Verbindungen



romanm

New Member
Hallo Leute,

ich wollte einen File-Server aufsetzen, der zum größten Teil dafür dienen soll, Grafiken bereitzustellen.

Es müssen min. 10.000 gleizeitige Verbindungen möglich sein.
Die Grafiken haben je ca. 30 KB.

Ich dachte an folgende Hardware:

CPU: DualCore 2,8 - 3,0 GHz
RAM: 4 GB
HDD: 500 GB (ist ausreichend)
Uplink: 1 Gbit.

und folgende Softwarekonfoguration:
Webserver: lighttpd
Alles (mysql, postfix, etc.) was nicht gebraucht wird deaktivieren


Was haltet ihr davon?
Vielleicht habt ihr auch noch Anregungen zur Softwarekonfiguration.
 
Für 10.000 Verbindungen gleichzeitig musst du mal ein paar tausender im Monat einplanen. Mit der Hardware die du geplant hast wirst du das nicht bewältigen...
 
Flaschenhals wird die Festplatte, die den Kram schnell genug lesen muss. Nimm nginx oder nen anderen kleinen Server, der fix statische Sachen ausliefert. Wenn du eher immer änliche Bilder auslieferst, hilft viel RAM und viel Cachen. RAID-Verbünde aus SolidStates holen auch noch etwas raus.

Was heißt gleichzeitig? Ist 10.000 / Sekunde gleichzeitig, auch wenn sie eigentlich nacheinander kommen?

Bau dir ein System und teste es aus, es gibt gute Benchmarks, die dir belastbare Ergebnisse liefern. Wenn ein dicker Rechner nicht reicht, nimm mehrere und nutze LoadBalancing.

Eins ist klar: mit dem angedachten System wird's knapp.
 
Sofern die 10k Verbindungen a 30kb ernsthaft gleichzeitig sein sollen, reicht bereits der Uplink nicht aus (30*10000*8=2400000=2,4GBit). Auch die HDDs werden keine 2,4GBit liefern und selbst eine RAM-Disk kommt da langsam ins Schwitzen...
 
Was würdet ihr denn vorschlagen?

3 Server nach nem LoadBalancer und mehr RAM?
Dazu noch nginx anstatt lighttpd.

Diese Last tritt nur bei Volllast auf. Im Durchschnitt sind es 3-5k die Sekunde.
 
3-5k grosse Bilder?

Demnach 3-5k x 10000 Verbindungen pro Sekunde?

Wie wäre es mit:

1 Server
2 NICs
nginx
1 SSD oder SAS im RAID
8 bis 16GB RAM für umfangreiches Caching, abhängig von der gesamten Datenmenge
DNS RoundRobin LoadBalancing

CPU sehe ich nicht als Flaschenhals im Moment.
 
Hi,

ich wollte einen File-Server aufsetzen, der zum größten Teil dafür dienen soll, Grafiken bereitzustellen.
Es müssen min. 10.000 gleizeitige Verbindungen möglich sein.
Die Grafiken haben je ca. 30 KB.

Ich habe vor kurzen auf dem 27C3 ein ähnliches System aufgesetzt.

Ich dachte an folgende Hardware:

CPU: DualCore 2,8 - 3,0 GHz
RAM: 4 GB
HDD: 500 GB (ist ausreichend)
Uplink: 1 Gbit.

Sollte ausreichend sein.

und folgende Softwarekonfoguration:
Webserver: lighttpd
Alles (mysql, postfix, etc.) was nicht gebraucht wird deaktivieren

Die Softwarekonfiguration wurde ich anders vorschlagen.
Ein Linux System mit Gentoo. nginx >= 0.8.5 mit den cache_purge_modul

Was genau hast du im Kopft.

In mein System habe ich die Folien aufgenohmen und mit nginx zu verfügung gestellt. Ein zweites Server, das Frontend, holt sich die Bilder jede Minute vom Backendserver. Falls in der zwischen Zeit ein neues Bild erstellt wird, wird das Frontend benachrichtigt und sein Cache wird geloscht, auf diese Art und Weise, wenn eine neue Anfrage kommt, holt er sich das neuste Bild vom Backend.

So kann man mit eine Verzögerung von etwa 2 sek. die Bilder direkt im Browser schauen.

Wenn das ist was du machen willst, kann ich dir weitere Details sagen.
Sonsts, erkläre genau was du bauen willst, so kann ich besser helfen.

MfG

Rei
 
3-5k grosse Bilder?
Nein, 3-5k Verbindungen. Die Bildgröße ist ca. 30KB je Bild.

skydrak said:
Woher hast du diese Zahlen? Geschätzt? Auswertung?
Diese Zahlen sollen in Zukunft erreicht werden.


reixd said:
Wenn das ist was du machen willst, kann ich dir weitere Details sagen.
Sonsts, erkläre genau was du bauen willst, so kann ich besser helfen.

Es ist sowas in etwa. Es sollen auf einem zentralen Server Bilder hochgeladen werden, die dann auf die File-Server hochgespielt werden. Sobald ein neues Bild existiert, bekommt der File-Server eine Benachrichtigung und lädt sich das neue Bild runter. Da auf dem zentralen Server noch weitere Dienste laufen, möchte ich diesen nicht mit der Auslieferung der Bilder beanspruchen.
Wenn du mehr Informationen zur Konfiguration hast und sie mir zuschicken würdest, dann wäre das super.

Tom09 said:
Du wirst wahrscheinlich mehr als einen Server benötigen. Auf den Loadbalancer würde ich verzichten und die Daten über verschiedene Hostnamen ausliefern (http://host1/bild1.jpg, http://host2/bild1000.jpg, etc), sofern das Anwendungsszenario es zulässt.

Das Szenario lässt es so leider nicht zu. Ich könnte alle Bilder auf mehreren Servern plazieren. Und per DNS eine Domain auf 2 IPs leiten. So hätte man ein LoadBalancing auf DNS-Ebene.


Nach euren Aussagen würde ich dann folgende Konfiguration wählen:

Hardware
Code:
CPU: DualCore 2,8 - 3,0 GHz
RAM: 4 GB
HDD: 500 GB (am besten SAS oder SSD)
kein RAID, da Sicherungen immer zentral existieren
Uplink: 1 Gbit.

2 Server mit dieser Austattung an unterschiedlichen Standorten
Die Last wird mit Hilfe von DNS verteilt.

Software
Code:
Debian 5.0 minimal
Webserver: nginx >= 0.8.5 mit den cache_purge_modul
 
Naja, ein Raid dient nicht primär der Datensicherung, sondern doch eher der Verfüg- bzw. Erreichbarkeit. Wenn da nur eine Festplatte im Server vorhanden sein sollte und die crasht, dann steht die ganze Schose erst einmal. Dann muss du die Platte erst getauscht und dann noch das dezentrale Backup eingespielt werden. Das wäre ein klassicher single point of failure. Alles unter Raid 5 würde mir da als Admin nur schlaflose Nächte bereiten.
 
Alles unter Raid 5 würde mir da als Admin nur schlaflose Nächte bereiten.
Ich schlafe mit RAID 1 ganz gut, danke.

Die Hardware passt, ich würde nur - wenn möglich - etwas mehr RAM einbauen und zumindest RAID 1 einsetzen um einen Zeitpuffer bei Hardware-Schäden zu haben.

Ob du einen zweiten Server brauchst ist gar nicht mal gesagt, erhöht aber die Zuverlässigkeit. Nur: Wie hältst du den Datenbestand synchron? rsync in Sekunden-Abständen?

Ich würde eher noch eine zweite NIC wählen um die Bandbreite zu erhöhen. Die CPU wird nicht das Problem darstellen.
 
Ben. said:
Nur: Wie hältst du den Datenbestand synchron? rsync in Sekunden-Abständen?
Ja, das hatte ich mit rsync geplant. Da ich weiß, wann ein Bild hinzugekommen ist, kann ich den Synchronisationszeitpunkt entsprechend wählen.

tomasini said:
Naja, ein Raid dient nicht primär der Datensicherung, sondern doch eher der Verfüg- bzw. Erreichbarkeit.

Das klingt einleuchtend. Ich werde dann zusehen, dass ich es als Raid laufen lassen kann.


Vielen Dank für die Hilfe.

Ich habe mir mal die config von nginx angeschaut. Hatte davor noch nicht viel damit zu tun gehabt.

Die default-config sieht so aus:
Code:
user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Ich denke, man sollte da die worker_processes und worker_connections anpassen. Damit man die Einstellungen dem RAM entspreched wählen kann, würde ich sagen, da dort eh nur der Webserver läuft, können wir 3,5 GB dafür nutzen.
0,5 GB bleiben für das System dann übrig.

Die Frage ist: Wie viel RAM benötigt eine Verbindung und wie aktiviert man da das caching?
 
Pro CPU-Kern ein worker.

Die Anzahl der Connections kannst du anhand deiner Erfahrungen erhöhen. Richtwert: Anzahl gleichzeitiger Verbindungen / Anzahl Worker ;)
 
Diese Zahlen sollen in Zukunft erreicht werden
Ich glaube, du bist dir nicht ganz im Klaren darüber, wieviel 10.000 gleichzeitige Verbindungen wirklich sind... denn: es sind extrem viele ;)

Ich weiss nicht, was für ein Projekt das ist, aber ich bezweifle ernsthaft, dass du jemals auch nur in die Nähe dieser 10.000 Verbindungen kommst. Wieviele Verbindungen sind es denn momentan (wie gemessen?).
Wenn z.B. in einer Forensoftware oder ähnlichem angezeigt wird, dass gerade "500 User online" sind, dann heisst das nicht, dass jetzt gerade wirkliche 500 User aktiv sind und schon garnicht, dass es 500 gleichzeitige Verbindungen sind. Hier wird meistens ein Zeitraum von 15-30 Minuten verwendet.

Interessant dazu: http://en.wikipedia.org/wiki/C10k_problem
 
Hallo,
ich habe ein Teil der Doku kopiert. Diese Lösung habe ich bei den 27C3 getestet und ist reibungslos gelaufen.
Wenn du weitere Fragen hast kannst du mich per mail oder pm erreichen.

====== Slides Only System + DVBackup ======

===== Aufbau =====

==== Saal-Barebones ====

Die drei P4 Barebones werden in jeder Saal eingesetzt. Die Terratec Grabby USB Doongles[1] besitzen eine S-Video (nicht genügend getestet) und Composite Eingang. Das Video Signal von den Folien bekommt man durch den Scanline Converter an die Barebones.

Der Videostrom wird von Motion[2][3] überwacht und wenn innerhalb einer halbe Sekunde über 1500 Pixels (Option einstellbar) sich geändert haben wird ein Snapshot gemacht und gespeichert. Zusätzlich jede 5. Sekunde noch wird noch ein Snapshot gespeichert.

Speicherformat:<code>%Y.%m.%d_%H-%M-%S.jpg</code>

Jedes mal, wenn ein Bild gespeichert wird, wird das Script "on_picture_save.sh"[4] aufgerufen (Event gesteuert).

Das „on_picture_save“ Script schneidet das Bild zurecht, d.h. Ränder zurecht kriegen

Anschließend wird das Bild zum Webserverrootordner kopiert und die Slides-Webverteilersever benachrichtigt, dass es ein neues Bild gibt.

Auf den Barebones läuft ein nginx[6] Server, wo seine einzige Aufgabe ist, die Bilder zum Slides-Webverteilersever zu Verfügung stellen bzw. per HTTP liefern.


==== Slides-Webverteilersever ====

Die Webserver sind die Kisten, die die Slides an Welt verteilen. Es läuft ein nginx mit cache_purge und http_stub_status module. nginx.conf[7]

Die Webserver dienen als Reverseproxys.

In den Rootordner werden die Index Webseiten pro Saal mit Nameschema "saalX.html".


Voraussetzung:

* Gigabit Anbindung

* >= 512 MB RAM

* 5 GB für Betriebssystem (Gentoo empfohlen)

TODO: * TCP Optimierung, offene Connections max Anzahl testen


=== Slides Übertragung ===


Die Bilder werden im cache für maximal einer Minute gespeichert, nach Ablauf des Caches wird ein neues Bild von den Bareboneswebserver per HTTP geholt, wenn eine neue Anfrage für dieses Bild ankommt.

Der Server bekommt jede Sekunde (Zeit einstellbar) eine Request vom Klient. Falls das Bild sich noch im Cache befindet wird die geliefert.

Wenn ein neues Bild in eine Saal erzeugt wird (Siehe Sektion Saal-Barebones), wird ein Cache-Purge aufgerufen, die das Bild im Cache des Webservers ungültig macht. So wird ein neues Bild geholt, wenn eine neue Anfrage ankommt.

In den Webserver ist zwar die Cache Zeit auf eine Minute gestellt. Bilder werden aber maximal 2 pro Sekunde und maximal jede 5. Sekunde.


===== Kernel Hacking/Options =====

TCP Optimierung:

<code>
-> Networking Support (NET [=y])

-> Networking options

-> TCP/IP networking (INET [=y])

-> TCP: advanced congestion control (TCP_CONG_ADVANCED [=y])
</code>

Um die Datenübertragungen zu Beschleunigen wird tief in das TCP gewerkelt. Für alle Kisten wurde als Congestion Avoidance Algorithm "H-TCP" gewählt.

Extrakt aus der Kernel-Help:

<code>

H-TCP is a send-side only modifications of the TCP Reno protocol stack that optimizes the performance of TCP congestion control for high speed network links. It uses a modeswitch to change the alpha and beta parameters of TCP Reno based on network conditions and in a way so as to be fair with other Reno and H-TCP flows.

</code>

* em28xx, Treiber für Terratec Grabby USB

* V4L2

* Netzwerk Kernel Treiber


===== Links =====

[1] [[http://www.terratec.net/de/produkte/Grabby_82247.html | Terratec Grabby USB ]]

[2] [[http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome | Motion Homepage ]]

[3] MotionConf

[4] on_picture_save.sh Was zu tun wenn ein Bild aufgenohmen wurde

[6] saal.nginx.conf

[7] webverteiler.nginx.conf
 

Attachments

Hi,

Das Szenario lässt es so leider nicht zu. Ich könnte alle Bilder auf mehreren Servern plazieren. Und per DNS eine Domain auf 2 IPs leiten. So hätte man ein LoadBalancing auf DNS-Ebene.

Das skaliert nicht besonders gut. Ich würde nochmal prüfen, ob die Bilder nicht auf mehrere Server verteilt werden können. Prinzipiell sollte sich das mit etwas Aufwand bei nahezu allen Anwendungsfällen realisieren lassen.

CU
Tom09
 
Back
Top