2009-07-12 6 views
0

Mein Programm ist ICAPServer (ähnlich mit httpserver), es ist Hauptaufgabe, Daten von Clients zu empfangen und die Daten in DB zu speichern.Python Programmwahl

Es gibt zwei Hauptschritte und zwei Themen:

  1. ICAPServer Daten von Clients empfängt, setzt die Daten in einer Warteschlange (50kb < 1ms);
  2. ein anderer Thread löscht Daten aus der Warteschlange und schreibt sie in DB SO. Wenn der zweite Schritt zu langsam ist, füllt die Warteschlange den Speicher mit diesen Daten.

fragen sich, ob jemand irgendwelche Vorschläge haben ...

Antwort

0

Ein Hinweis: Bevor Sie sich für Optimierungen entscheiden, ist es sehr wichtig, eine gute Messung und Profilerstellung zu erhalten.

Das heißt, ich würde wetten, der langsame Teil im zweiten Schritt ist Datenbankkommunikation; Sie könnten versuchen, die SQL-Anweisung und ihren Ausführungsplan zu analysieren. und dann optimieren Sie es (es ist einer der features von SQLAlchemy); Wenn es immer noch zu langsam ist, überprüfen Sie die Datenbankoptimierungen.

Natürlich ist es möglich, dass der Engpass an einem völlig anderen Ort wäre; In diesem Fall haben Sie immer noch die Chance, mit C-Code, dediziertem Netzwerk oder mehreren Threads zu optimieren - um nur drei mögliche Beispiele für völlig unterschiedliche Optimierungen zu nennen.

Ein weiterer Punkt: Da I/O-Operationen normalerweise die GIL freigeben, könnten Sie auch versuchen, die Leistung zu verbessern, indem Sie einfach einen weiteren Reader-Thread hinzufügen - und ich denke, dass dies eine viel billigere Lösung sein könnte.

+0

Vielen Dank für die Tipps, Roberto! Ich weiß nicht, ob ich Profil auf dem Reaktor von twisted verwenden kann, denn es ist eine kreisförmige Funktion. Was ich getan habe, ist Zeitstempel an jedem Punkt zu machen, den Zeitunterschied von ihnen zu testen. Und der Zeitunterschied von jedem commit() ist etwa 30 ms (2. Schritt), während der erste Schritt <1 ms ist. Ich denke, das bedeutet etwas für die Leistung - 2. Schritt ist zu langsam. – Ryan

+0

Ich habe die Antwort aktualisiert; Im Grunde würde ich Ihnen auch vorschlagen, mehr Threads zu verwenden, weil sie billig zu implementieren sind, und wenn der Engpass im Netzwerk ist, dann wird die GIL während des Wartens freigegeben, so dass Sie eine gute Leistungsverbesserung erzielen können. –

+0

Tks Roberto, ich testen Sie Ihren Vorschlag - weitere Threads hinzufügen, verwendet jeder Thread seine eigene Sitzung, DB zu schreiben, scheint die Leistung erhöht. Ich weiß, wir können DB parallel betreiben, hat Multi-Threading parallel implementiert? Oder sollte ich etwas auf sqlalchmey tun, um einen parallelen DB-Betrieb zu implementieren? – Ryan

0

eine Obergrenze für die Menge an Daten, die in der Warteschlange setzen?

+0

aber der erste Schritt wartet auf einen freien Steckplatz aus der Warteschlange, was dazu führt, dass Clients warten ... – Ryan

2

Es ist schwer zu sagen, aber vielleicht hilft die Verwendung von zwei Prozessen anstelle von Threads in dieser Situation. Da Python über die Global Interpreter Lock (GIL) verfügt, kann ein Thread nur Python-Anweisungen jederzeit ausführen.

ein System entwickelt, um Prozesse zu haben, können folgende Vorteile haben:

  • Höhere Gleichzeitigkeit, insbesondere auf Multi-Prozessor-Maschinen
  • Höherer Durchsatz, da Sie wahrscheinlich mehrere Warteschlangen Verbraucher/DB Schreiber Prozesse laichen können, um sich auszubreiten die Arbeit. Dies könnte jedoch minimal sein, wenn es sich bei der DB tatsächlich um den Engpass und nicht um den Prozess handelt, der in die DB schreibt.
+0

Aber was ich in die Warteschlange stelle, sind Objekte mit Dateihandleattribut, und Dateihandle kann nicht zwischen Prozessen geteilt werden Es könnte also sehr schwierig sein, das zu tun ... – Ryan

+0

In diesem Fall müsste man Pfade zwischen den Prozessen teilen, anstatt offene Dateigriffe zu öffnen. Wenn die DB-Writer-Prozesse geöffnet und verarbeitet werden, kann der Durchsatz möglicherweise noch weiter verbessert werden. – Doug

+0

Tks für den Vorschlag Aber die Datei-Handles sind vorübergehend und dynamisch erstellt, ich weiß nicht, wie Sie den Pfad der temporären Datei übergeben ... und es könnte komplex sein ... – Ryan