Frage

ich brauche spezialisierten HTTP-Server zu erstellen, für diesen I-Plan Verwendung epoll sycall, aber ich mag mehr Prozessoren / Kern nutzen, und ich kann mit Architekturlösung nicht kommen. ATM meine Idee ist followng: Erstellen Sie mehrere Threads mit eigenen epoll Deskriptoren, übernimmt Hauptgewindeverbindungen und verteilt sie an Fäden epoll. Aber gibt es bessere Lösungen? Welche Bücher / articles / Führer kann ich lesen auf hohen Last-Architekturen? Ich habe nur C10K Artikel gesehen, aber die meisten Links zu Beispielen sind tot :( und noch nicht in -depth Bücher zu diesem Thema. (

Vielen Dank für Antworten.

UPD:. Bitte konkretisieren, ich brauche Materialien und Beispiele (nginx ist kein Beispiel, weil es zu komplex und hat Schichten mehrere Abstraktions mehrere Systeme unterstützen)

War es hilfreich?

Lösung

libevent und libev Quellen. sie sind sehr gut lesbar, und bereits eine gute Infrastruktur zu nutzen.

Auch libev Dokumentation hat viele Beispiele von mehreren bewährten Strategien. Auch wenn Sie direkt an epoll() schreiben möchten, können die Beispiele auf mehrere Einsichten führen.

Andere Tipps

.. meine Idee ist followng: Erstellen Sie mehrere Threads mit eigener epoll Deskriptoren, übernimmt Hauptgewindeverbindungen und verteilt sie zwischen Threads epoll.

Ja, das ist derzeit der beste Weg, dies zu tun, und es ist, wie Nginx es tut. Die Anzahl der Threads erhöht oder verringert werden kann, je nach Last und / oder die Anzahl der physischen Kerne auf der Maschine.

Der Kompromiss zwischen zusätzlichen Fäden (mehr als die Anzahl der physischen Kerne) und Veranstaltungen ist eine Latenzzeit und Durchsatz. Threads verbessern Latenz, da sie präventiv aber auf Kosten der Durchsatz durch Overhead-Kosten, die Kontext-Umschaltung und Thread-Erzeugung / Löschung ausführen kann. Event verbessern den Durchsatz, haben aber den Nachteil, dass lang laufender Code den gesamten Thread zu Stillstand verursacht.

Die zweitbeste ist, wie Apache2 macht es einen Thread-Pool von blockierenden Threads. Keine Veranstaltung hier die Verarbeitung, so dass die Implementierung einfacher ist und die Pool mittels Gewinde werden nicht erstellt und unnötig zerstört, aber es kann mit einer gut umgesetzt Thread / Asynchron-Hybrid wie nicht wirklich konkurrieren, was Sie versuchen zu implementieren oder Nginx.

Die drittbeste ist asynchron Ereignisverarbeitung allein wie Lighttpd oder Node.js. Nun, es ist die zweite am besten, wenn Sie keine schweren Verarbeitung auf dem Server zu tun. Aber wie bereits erwähnt, ein einzelner langer Lauf while-Schleife blockiert den gesamten Server.

Wenn Sie ein Terabit-Uplink haben und Plan-Service 10000 gleichzeitige Verbindungen aus einem einzelnen Server, vergessen Sie epoll. Es ist nur unentgeltlich Nicht-Übertragbarkeit; poll oder sogar select tun genauso gut. Beachten Sie, dass durch die Zeit Terabit-Uplinks und so ist Standard, Ihr Server auch ausreichend schneller sein, dass Sie noch nicht epoll benötigen.

Wenn Sie nur statische Inhalte dienen, vergessen auch über Themen und die sendfile syscall Linux verwenden. Auch das ist nicht dem Standard entsprechende, aber zumindest bietet es große Leistungsvorteile der realen Welt.

Beachten Sie auch, dass andere Design-Entscheidungen (vor allem überschüssige Komplexität) wird viel mehr ein Faktor dafür, wie viel Last der Server verarbeiten kann. Ein Beispiel nur schauen, wie die bescheidene Single-Threaded, single-Prozess thttpd bläst Apache und Freunde in der Leistung auf statischen Inhalt entfernt - und in meiner Erfahrung, auch auf traditionellen cgi dynamischen Inhalten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top