2012-04-04 15 views
2

Ich schreibe eine Oracle-von-Bacon-Website, die eine breite erste Suche auf einem sehr großen gerichteten Graphen (> 5 Millionen Knoten mit einem Durchschnitt von vielleicht jeweils 30 ausgehenden Kanten) beinhaltet. Dies ist auch im Wesentlichen alles, was die Website tun wird, abgesehen von ein paar meist Textseiten (wie es funktioniert, Kontaktinformationen, etc.) anzuzeigen. Ich habe derzeit eine Test-Implementierung in Python ausgeführt, aber selbst mit Python-Arrays zur effizienten Darstellung der Daten, dauert es> 1,5 GB RAM, um das Ganze zu halten. Offensichtlich ist Python die falsche Sprache für ein algorithmisches Problem dieser Art, daher plane ich das meiste davon in C mit den Python/C-Bindings umzuschreiben. Ich schätze, dass dies etwa 300 MB RAM benötigt.Maximieren von Apache-Server-Instanzen mit großer mod_wsgi-Anwendung

Basierend auf meiner aktuellen Konfiguration läuft dies über mod_wsgi in Apache 2.2.14, welches auf mpm_worker_module eingestellt ist. Jeder untergeordnete Apache-Server lädt dann das gesamte Python-Setup (welches die C-Erweiterung lädt) und verwendet dabei 300 MB, und ich habe nur 4 GB RAM. Das Laden wird einige Zeit dauern und es scheint, als würde es die Anzahl der Server-Instanzen möglicherweise niedriger halten, als es sonst sein könnte. Wenn ich richtig verstehe, würden datenlastige (und nicht klienteninteraktionsintensive) Aufgaben wie diese normalerweise vom Server getrennt, indem eine SQL-Datenbank oder etwas von der Art eingerichtet wird, die alle Serverprozesse dann abfragen könnten. Aber ich kenne kein Datenbankframework, das meinen Bedürfnissen entspricht.

Also, wie weiter? Lohnt es sich, eine vom Webserver getrennte Datenbank zu erstellen oder die Anwendung auf andere Weise einen Schritt weiter als mod_wsgi zu verschieben, um vielleicht noch ein paar weitere Server-Instanzen laufen zu lassen? Wenn ja, wie könnte dies geschehen?

Mein erster Eindruck ist, dass die Datenbank, und nicht der Server, immer der begrenzende Faktor sein wird. Es sieht so aus, als ob die typische Apache mpm_worker_module Konfiguration ServerLimit 16 sowieso hat, also würde ich wahrscheinlich nur ein paar mehr Server bekommen. Und wenn ich die Datenbank vom Server scheiden würde, müsste ich eine Möglichkeit haben, mehrere Instanzen der Datenbank auszuführen (ich weiß bereits, dass nur einer wahrscheinlich nicht für die Verkehrsstufen, die ich unterstützen möchte, abgeschnitten hat) und Lass sie gut mit dem Server spielen. Also habe ich vielleicht meistens meine eigene Frage beantwortet, aber das ist eine seltsame Situation, also dachte ich, es wäre sehenswert, wenn jemand einen festeren Umgang damit hätte. Alles was ich vermisse? Ist diese Implementierung sinnvoll? Danke im Voraus!

Technische Details: es ist eine Django-Website, die ich mit Apache 2.2.14 auf Ubuntu 10.4 bedienen werde.

Antwort

1

Zuerst, schauen Sie sich den Daemon-Modus von mod_wsgi an und verwenden Sie nicht den eingebetteten Modus, da Sie die Anzahl der Python-WSGI-Anwendungsprozesse getrennt von Apache-Kind-Prozessen steuern können. Zweitens wäre es besser, die speicherhungrigen Bits in einem separaten Backend-Prozess zu verwenden. Sie können XML-RPC oder ein anderes Message-Queuing-System verwenden, um mit den Backend-Prozessen zu kommunizieren oder sogar zu sehen, ob Sie Sellery in irgendeiner Weise verwenden können.

+0

Hmmm ... Ich denke, ich bin schon im Daemon-Modus, aber ich wusste nicht, dass es diese Funktionalität hatte. Ich muss mich genauer damit befassen und die anderen Vorschläge für die Zukunft berücksichtigen. Danke, das war sehr hilfreich! – TomNysetvold

+0

Basierend auf Ihrer Beschreibung sehe ich genug, um darauf hinzuweisen, dass Sie den Daemon-Modus nicht verwenden. Das oder dein Verständnis davon, wie der Daemon-Modus funktioniert, ist falsch. Überprüfen Sie, was Sie verwenden, indem Sie http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode überprüfen –