Wir verwenden ArangoDB und PostgreSQL, um fast identische Daten zu speichern. PostgreSQL wird verwendet, um allgemeine Arten von Abfragen durchzuführen, die relationale Datenbanken gut ausführen können. ArangoDB wurde ausgewählt, um eine Art von Abfragen wie Graph Traversals, Suche nach einem kürzesten Pfad usw.Wie verbessert man ArangoDB Leistung unter Last (mehrere gleichzeitige Abfragen)?
Im Moment haben wir eine Tabelle mit 160000 Datensätze in PostgreSQL und eine Sammlung mit der gleichen Anzahl von Dokumenten in ArangoDB.
Die API, an der wir arbeiten, wird von mehreren Benutzern gleichzeitig verwendet. Daher wollte ich zuerst überprüfen, wie ArangoDB und PostgreSQL unter der Last funktionieren. Ich habe einen einfachen Lasttest erstellt, der als Workload eine einfache Select-Abfrage mit dem Filter für ArangoDB und PostgreSQL durchführt.
Die Abfrage wählt die obersten N Datensätze/Dokumente mit dem Feld nach Datum filtern aus.
Wenn ich Lasttest ausführen, werden alle Anfragen an PostgreSQL innerhalb von 0,5 Sekunden ausgeführt, ich die Anzahl der Benutzer von 10 auf 100 erhöhen und die Ausführungszeit überhaupt nicht beeinflusst.
Die gleichen Anfragen an ArangoDB dauern ungefähr 2 Sekunden, wenn Sie mit einem einzelnen Benutzer beginnen, dann wächst die Antwortzeit im direkten Verhältnis zur Anzahl gleichzeitiger Benutzer. Bei 30 gleichzeitigen Benutzern würden alle Abfragen nach dem Warten auf 60 Sekunden für die Antwort eine Zeitüberschreitung aufweisen.
versuchte ich arangojs Anschluss zu debuggen und fanden diese:
var maxTasks = typeof agent.maxSockets === 'number' ? agent.maxSockets * 2 : Infinity;
und diese:
Connection.agentDefaults = {
maxSockets: 3,
keepAlive: true,
keepAliveMsecs: 1000
};
was bedeutet, dass Standard arangojs Verhalten bei der nicht mehr als 6 gleichzeitige Abfragen zu ArangoDB senden ist Dieselbe Zeit, die dazu führt, dass alle übrigen Abfragen auf Node.js Seite in die Warteschlange gestellt werden. Ich habe versucht, die Nummer zu erhöhen, aber es hat nicht geholfen und jetzt sieht es so aus, als ob alle Anfragen auf der Seite von ArandoDB in der Warteschlange stehen. Nun, wenn ich die Last leite und versuche, eine Abfrage mit ArangoDB Web Interface auszuführen, würde die Abfrage für die unvorhersehbare Zeit (abhängig von der Anzahl der Benutzer im Moment) reichen, dann das Ergebnis zurückgeben und würde mir zeigen, dass es ausgeführt wurde in ungefähr 4 Sekunden, was nicht wahr ist. Für mich sieht es so aus, als ob ArangoDB nur eine Abfrage pro Zeit ausführen kann, während alle anderen Abfragen in der Warteschlange stehen ...
Fehle ich etwas? Gibt es eine Einstellung, um ArangoDB einzustellen und seine Leistung unter Last zu verbessern?
Update:
Wir verwenden ArangoDB 3.0 und als Docker Behälter (von offiziellen Bild) laufen mit 1,5 GB RAM.
Beispieldokument (wir haben etwa 16 000 davon):
{
"type": "start",
"from_date": "2016-07-28T10:22:16.000Z",
"to_date": "9999-06-19T18:40:00.000Z",
"comment": null,
"id": "13_start",
"version_id": 1
}
AQL Abfrage:
FOR result IN @@collection
FILTER (result.version_id == 1)
FILTER (result.to_date > '2016-08-02T15:57:45.278Z')
SORT result._key
LIMIT 100
RETURN result
Könnten Sie bitte Ihre Systemspezifikationen, die von Ihnen verwendete ArangoDB-Version und vielleicht ein Beispieldokument und die eigentliche Abfrage hinzufügen? – CoDEmanX
Dem obigen Beitrag hinzugefügt. –
mit 'db._explain (yourQuery)' verwenden Ihre Abfragen Indizes? Obwohl Sie die Ergebnismenge "LIMITIEREN", führt "SORTIEREN" dazu, dass alle Artikel überprüft werden müssen, nur das zurückgegebene Ergebnis ist begrenzt. Abhängig von der Ergebnisgröße Die verfügbare RAM-Menge ist möglicherweise etwas niedrig. Abhängig von den verfügbaren CPU-Ressourcen können mehr 'server.threads' helfen, die Geschwindigkeit zu erhöhen. – dothebart