Öffnen und Schließen von 16000 Mongo DB-Instanzen in PHP

8

Ich arbeite gerade an einigen persönlichen Tests und Benchmarks, um den Arbeitsablauf und die Effizienz zwischen der Verwendung von MongoDB und MySQL mit echten Beispieldaten zu vergleichen.

Um meine Daten in jeder Datenbank einzurichten, mache ich mehrere tausend Schleifen und erzeuge zufällig Datenobjekte, die in die Datenbank eingefügt werden.

Allerdings habe ich einige Probleme mit der Mongo-Klasse in PHP, die ich nicht lösen kann. Das Problem ist so:

Ich habe eine Schleife, die eine neue Mongo-Instanz und Verbindung erstellt, ein kleines Array in eine Sammlung einfügt und dann die Verbindung schließt. Diese Schleife sollte 20000 Mal ausgeführt werden. Allerdings scheitert es immer an der 16300. Schleife (mit einem Minimum von 16200 und Max von 16350, würde ich nach ein paar Läufen sagen), wenn es versucht, die Instanz zu erstellen / eine Verbindung herzustellen.

Der Code in der Schleife ist unten:

%Vor%

get_random_user_data () gibt nur ein einfaches assoziatives Array zurück.

Der Fehler, den ich bekomme, ist:

%Vor%

In der Zeile:

%Vor%

Irgendwelche Ideen? Gibt es etwas Grundlegendes, das mir fehlt, wie Sicherheit oder Spam-Schutz?

Vielen Dank im Voraus.

Zusätzliche Informationen:

Das Skript stirbt bei ungefähr 114,9797 Sekunden. Es ist kein PHP-Speicher oder zeitbasiertes Problem, da alle Limits angehoben werden und ich meine MySQL-Benchmarks gestern ausgeführt habe und 120000 Zeilen (mit der gleichen Methode der offenen Verbindung, Einfügen, Verbindung schließen) über eine Stunde ohne Probleme eingefügt habe.

Ausführen von PHP Version 5.3.5

phpinfo Mongo-Info:

%Vor%     
Chrisui 14.01.2012, 21:37
quelle

3 Antworten

6

Ihr Betriebssystem hat eine begrenzte Anzahl von Sockets, die es zu öffnen bereit ist. Wenn Sie einen Socket öffnen und ihn dann schließen, wird er vom Betriebssystem nicht sofort wieder in den "verfügbaren" Pool gestellt, es bleibt eine Weile im "Time Wait" -Zustand hängen, dass Nat in seiner Antwort .

Sie können die Anzahl der Sockel erhöhen, die Ihr Betriebssystem öffnen wird, siehe Ссылка ( jeder Socket ist eine offene "Datei").

Sie verwenden auch eine ziemlich alte Version des Treibers, die Sie vielleicht in Erwägung ziehen sollten, zu aktualisieren.

    
kristina 17.01.2012, 21:11
quelle
3

Ich bestätige, dass das gleiche Verhalten auch vom Ruby-Treiber herrührt. Ich replizierte ähnlichen Fall mit Ruby Mongo, der 20000 Datensätze durch Öffnen / Schließen Mongo-Instanz jedes Mal einfügt. Und es fällt weiterhin zwischen 14110 und 14200.

Dies ist die Fehlermeldung

%Vor%

Dies ist die komplette Stapelverfolgung

%Vor%

Auch wie @ Chrisisui sagte, ich habe auch keine Gedächtnisverluste.

Dies ist das Skript, das ich versucht habe

%Vor%     
RameshVel 15.01.2012 09:01
quelle
1
___ answer8995581 ___

Ihre Benchmark macht keinen Sinn. Halten Sie die Verbindung nicht offen / geschlossen. Sie sollten die dauerhafte Verbindung wiederverwenden, anstatt sie jedes Mal zu öffnen / schließen. Wenn Sie den Socket schnell öffnen und schließen, haben Sie zu viele Sockets im Time-Wait-Status, die immer noch Dateideskriptoren verwenden

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123mongodb ___ MongoDB ist eine skalierbare, hochleistungsfähige Open-Source-Dokumenten-orientierte NoSQL-Datenbank. Es unterstützt eine große Anzahl von Sprachen und Anwendungsentwicklungsplattformen. Fragen zur Serververwaltung können unter http://dba.stackexchange.com gestellt werden. ___ qstnhdr ___ Öffnen und Schließen von 16000 Mongo DB-Instanzen in PHP ___ tag123nosql ___ NoSQL (manchmal erweitert auf "nicht nur SQL") ist eine breite Klasse von Datenbankverwaltungssystemen, die sich in einigen wesentlichen Punkten vom klassischen Modell des relationalen Datenbankverwaltungssystems (RDBMS) unterscheidet. ___ answer8868588 ___

Ich bestätige, dass das gleiche Verhalten auch vom Ruby-Treiber herrührt. Ich replizierte ähnlichen Fall mit Ruby Mongo, der 20000 Datensätze durch Öffnen / Schließen Mongo-Instanz jedes Mal einfügt. Und es fällt weiterhin zwischen 14110 und 14200.

Dies ist die Fehlermeldung

%Vor%

Dies ist die komplette Stapelverfolgung

%Vor%

Auch wie @ Chrisisui sagte, ich habe auch keine Gedächtnisverluste.

Dies ist das Skript, das ich versucht habe

%Vor%     
___ answer8901781 ___

Ihr Betriebssystem hat eine begrenzte Anzahl von Sockets, die es zu öffnen bereit ist. Wenn Sie einen Socket öffnen und ihn dann schließen, wird er vom Betriebssystem nicht sofort wieder in den "verfügbaren" Pool gestellt, es bleibt eine Weile im "Time Wait" -Zustand hängen, dass Nat in seiner Antwort .

Sie können die Anzahl der Sockel erhöhen, die Ihr Betriebssystem öffnen wird, siehe Ссылка ( jeder Socket ist eine offene "Datei").

Sie verwenden auch eine ziemlich alte Version des Treibers, die Sie vielleicht in Erwägung ziehen sollten, zu aktualisieren.

    
___ qstntxt ___

Ich arbeite gerade an einigen persönlichen Tests und Benchmarks, um den Arbeitsablauf und die Effizienz zwischen der Verwendung von MongoDB und MySQL mit echten Beispieldaten zu vergleichen.

Um meine Daten in jeder Datenbank einzurichten, mache ich mehrere tausend Schleifen und erzeuge zufällig Datenobjekte, die in die Datenbank eingefügt werden.

Allerdings habe ich einige Probleme mit der Mongo-Klasse in PHP, die ich nicht lösen kann. Das Problem ist so:

Ich habe eine Schleife, die eine neue Mongo-Instanz und Verbindung erstellt, ein kleines Array in eine Sammlung einfügt und dann die Verbindung schließt. Diese Schleife sollte 20000 Mal ausgeführt werden. Allerdings scheitert es immer an der 16300. Schleife (mit einem Minimum von 16200 und Max von 16350, würde ich nach ein paar Läufen sagen), wenn es versucht, die Instanz zu erstellen / eine Verbindung herzustellen.

Der Code in der Schleife ist unten:

%Vor%

get_random_user_data () gibt nur ein einfaches assoziatives Array zurück.

Der Fehler, den ich bekomme, ist:

%Vor%

In der Zeile:

%Vor%

Irgendwelche Ideen? Gibt es etwas Grundlegendes, das mir fehlt, wie Sicherheit oder Spam-Schutz?

Vielen Dank im Voraus.

Zusätzliche Informationen:

Das Skript stirbt bei ungefähr 114,9797 Sekunden. Es ist kein PHP-Speicher oder zeitbasiertes Problem, da alle Limits angehoben werden und ich meine MySQL-Benchmarks gestern ausgeführt habe und 120000 Zeilen (mit der gleichen Methode der offenen Verbindung, Einfügen, Verbindung schließen) über eine Stunde ohne Probleme eingefügt habe.

Ausführen von PHP Version 5.3.5

phpinfo Mongo-Info:

%Vor%     
___
Nat 17.01.2012 13:40
quelle

Tags und Links