1

次の構成のシステムでしばらくの間、neo4j 1.8.1 コミュニティ エディションを喜んで使用していました。

システム仕様:

  • OS : 32 ビット Ubuntu 12.04.3 LTS。カーネル バージョン 3.2.0-52-generic-pae #78-Ubuntu
  • メモリー:4GB
  • スワップ: 8GB (スワップファイル - パーティションではありません)
  • プロセッサー: Intel® Core™ i5-2430M CPU @ 2.40GHz - クアッドコア
  • ハードディスク: 500GB Seagate ATA ST9500420AS デュアル ブート - Ubuntu は 100 GB を使用し、残りは万能の Windows 7 で使用します。

neo4j 2.0.1 エンタープライズ エディションに切り替えたところ、アプリケーションの応答時間が 4 倍遅くなりました。そこで、http://docs.neo4j.org/chunked/stable/embedded-configuration.htmlでアドバイスされているように、ファイルシステム、仮想メモリ、I/O スケジュール、および JVM 構成の調整を開始しました。

性能調整

  • スケジューリング優先度が最も高いサーバーとして Neo4j を開始しました (nice 値 = -20)

  • /etc/sysctl.conf で vm.dirty_background_ratio=50 および vm.dirty_ratio=80 を設定して、ダーティ メモリ ページがディスクに頻繁にフラッシュされるのを減らします。

  • Neo4j の起動で提案されているように、開いているファイルの最大数を 1024 から 40,000 に増やしました。

  • /etc/fstab の neo4j ext4 パーティションに noatime,nodiratime を設定して、ファイル/ディレクトリ アクセスがあるたびに inode が更新されないようにします。

  • http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/に記載されているように、I/O scheular を「cfq」から「noop」に変更しました 。

  • JVM パラメーター: つまり、最大ヒープ サイズは 1GB で、neostore メモリ マップ ファイル サイズは 425 MB です。

    Xms および Xmx から 1GB まで。GC からコンカレント マーク スイープ。neostore.nodestore.db.mapped_memory=25M、neostore.relationshipstore.db.mapped_memory=50M neostore.propertystore.db.mapped_memory=90M neostore.propertystore.db.strings.mapped_memory=130M neostore.propertystore.db.arrays.mapped_memory=130M

悲しいことに、これは何の違いもありませんでした。より良い全体像を得るために、N 個のノードとこれらのノード間に M 個のランダムな関係を作成する簡単なスクリプトを作成しました。

Oracle Java バージョン「1.6.0_45」を使用した Neo4j 1.8.1 コミュニティ エディション:

new-sys-admin@ThinkPad:~/temp$ php perftest.php    
Creating 1000 Nodes with index 
Time taken : 67.02s

Creating 4000 relationships 
Time taken : 201.27s

Oracle Java バージョン「1.7.0_51」の Neo4j 2.0.1 エンタープライズ版:

new-sys-admin@ThinkPad:~/temp$ php perftest.php 
Creating 1000 Nodes with index 
Time taken : 75.14s

Creating 4000 relationships 
Time taken : 206.52s

上記の結果は、2 回のウォームアップ実行後のものです。2.0.1 の結果は 1.8.1 より遅いようです。関連する構成を調整して neo4j 2.0.1 のパフォーマンスを向上させるための提案をいただければ幸いです。

編集1

すべてのクエリは、Everyman Neo4j ラッパーを介して Gremlin を使用して発行されます。

http://grokbase.com/p/gg/neo4j/143w1fen8c/gremlin-plugin-extremely-slow-on-neo4j-2-0-1

その間、私は neo4j-enterprise-edition-1.9.6 (2.0.1 より前の最新の安定版) に移行し、正常に戻りました。

4

1 に答える 1

3

PHP を使用しているという事実と、わずか 1000 個のノードを作成するのに 67 秒かかることから、通常の REST API (例: POST /db/data/node) を使用していると思います。これが正しければ、2.0.1 はこれらの CRUD 操作で 1.8 よりも数パーセント遅いということは正しいかもしれません。2.0 では、Cypher と新しいトランザクション エンドポイントの最適化に重点を置きました。

そのため、最高のパフォーマンスを得るために、次のことをお勧めします。

  1. 新しいトランザクション エンドポイント /db/data/transaction を使用する

  2. 暗号を使用し、それを使用してサーバーに「一度に」できるだけ多くの作業を送信します

  3. 可能であれば、同じ HTTP 要求で複数の暗号クエリを送信します。これは、トランザクション エンドポイントを介して行うこともできます。

  4. 可能であれば、必ず TCP 接続を再利用してください。これが PHP でどのように機能するかは正確にはわかりませんが、「Connection: Keep-alive」ヘッダーを送信し、同じ TCP 接続を再利用するようにすると、オーバーヘッドが大幅に節約されます。 TCP 接続を何度も再確立する必要はありません。

1 つのサイファー クエリで数千のノードを作成するのに、数ミリ秒以上かかることはありません。私のラップトップとPythonから( https://github.com/jakewins/neo4jdb-pythonを使用して)1秒あたりに送信できるサイファーステートメントの数に関しては、同時セットアップで1秒あたり約10 000のサイファーステートメントを取得します( 10 クライアント)。

于 2014-04-02T09:16:50.537 に答える