1

ArangoDB と PostgreSQL を使用して、ほぼ同一のデータを保存します。PostgreSQL は、リレーショナル データベースが適切に実行できる一般的なタイプのクエリを実行するために使用されます。ArangoDB は、グラフ トラバーサル、最短パスの検索などの種類のクエリを実行するために選択されました。

現時点では、PostgreSQL に 160000 レコードのテーブルがあり、ArangoDB に同じ量のドキュメントがあるコレクションがあります。

私たちが取り組んでいる API は同時に複数のユーザーによって使用されるため、最初に確認したかったのは、ArangoDB と PostgreSQL の両方が負荷の下でどのように動作するかということでした。ワークロードとして、ArangoDB と PostgreSQL の両方に対してフィルターを使用して単純な選択クエリを実行する単純な負荷テストを作成しました。

クエリは、日付フィールドによるフィルターで上位 N のレコード/ドキュメントを選択します。

負荷テストを実行すると、PostgreSQL へのすべてのクエリが 0.5 秒以内に実行されます。ユーザー数を 10 から 100 に増やしても、実行時間にはまったく影響しません。

ArangoDB への同じクエリは、1 人のユーザーで開始すると約 2 秒かかります。その後、応答時間は同時ユーザーの数に正比例して増加します。同時ユーザー数が 30 の場合、応答を 60 秒間待機すると、すべてのクエリがタイムアウトになります。

arangojs コネクタをデバッグしようとしたところ、次のことがわかりました。

var maxTasks = typeof agent.maxSockets === 'number' ? agent.maxSockets * 2 : Infinity;

この:

Connection.agentDefaults = {
  maxSockets: 3,
  keepAlive: true,
  keepAliveMsecs: 1000
};

これは、デフォルトの arangojs の動作が、同時に ArangoDB に 6 つ以下の同時クエリを送信することであることを意味します。これにより、残りのすべてのクエリが Node.js 側でキューに入れられます。数を増やそうとしましたが、役に立ちませんでした。現在、すべてのクエリが ArandoDB 側でキューに入れられているようです。ここで、ロードを実行し、ArangoDB Web Interface を使用していくつかのクエリを実行しようとすると、(その時点でのユーザーの数に応じて) 予測できない時間がクエリに渡され、結果が返され、実行されたことが示されます。約 4 秒で、これは正しくありません。私にとっては、他のすべてのクエリがキューに入れられている間、ArangoDBは一度に1つのクエリしか実行できないようです...

何か不足していますか?ArangoDB を調整して、負荷がかかった状態でのパフォーマンスを向上させる設定はありますか?

アップデート:

ArangoDB 3.0 を使用し、1.5 GB の RAM を備えた Docker コンテナー (公式イメージから) として実行します。

サンプル ドキュメント (約 16,000 個あります):

{
  "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 クエリ:

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
4

1 に答える 1

1

次のクエリを使用して、16 万個のサンプル ドキュメントを作成しました。

LET v = [1,1,1,1,1,2,2,2,3,3,4]
LET d = DATE_NOW()

FOR i IN 1..160000
INSERT {
  "type": "start",
  "from_date": DATE_SUBTRACT(d, RAND()*4000, "days"),
  "to_date": DATE_ADD(d, RAND()*4000+100, "days"),
  "comment": null,
  "id": CONCAT(i, "_start"),
  "version_id": v[RAND()*LENGTH(v)]
} INTO @@collection
RETURN NEW

ディスクに同期すると、データファイルは約 30MB になります。ジャーナル ファイルは 32MB です。

そのデータセットでクエリを実行すると、報告される実行時間は平均で0.35 秒です。

さまざまなインデックスを試してみましたが、skiplist を使用version_idするとパフォーマンスが最高に向上するようで、インデックス用に最大 18MB のメモリを消費して 0.20 秒に短縮されました。サーバーの再起動直後、最初のアクセスでコレクションをロードし、インデックスを再構築する必要があるため、クエリに 1.5 秒かかります。ただし、後続のクエリには常に 0.2 秒かかります。

私は ArangoDB 3.0.devel を使用しました。これは、安定した 3.0.x リリースとほぼ同じパフォーマンスを示すはずです。Web インターフェイスによると、クエリを数回実行した後、DBMS が使用する RAM は最大 440MB でした。

クエリ時間が 1.0 秒を超える場合は、何かが正しくありません。コレクションが自動的にアンロードされた場合 (RAM が不足している可能性があります)、クエリ間で確認できますか? その場合は、メモリを消費するものを確認し (ArangoDB の場合でも)、RAM を増やしてクエリ時間に影響するかどうかを確認してください。大容量ストレージや CPU など、別のリソースがパフォーマンスを制限していませんか?

于 2016-08-04T18:30:40.640 に答える