2013-09-23 44 views
2

我嘗試使用neo4j做一些關於SNS的實驗。我創建了一個由100萬個用戶組成的隨機圖表,10萬個項目,每個用戶有大約100個朋友和100個最喜歡的項目。所以圖中有大約100萬個節點和2億個關係,圖形文件佔用4.8GB。所有節點只有一個ID,我爲它們創建了索引。 現在我已經使用Java API來設置一個小型集羣來維護這個由三個虛擬機組成的圖。每個VM有16GB ram,Intel Xeon CPU 2.00GHz(8核心)。以下是一些配置:如何配置使neo4j更快?

config.put("neostore.nodestore.db.mapped_memory", "150M"); 
config.put("neostore.relationshipstore.db.mapped_memory", "5G"); 
config.put("neostore.propertystore.db.mapped_memory", "100M"); 
config.put("neostore.propertystore.db.strings.mapped_memory", "130M"); 
config.put("neostore.propertystore.db.arrays.mapped_memory", "130M"); 
config.put("node_auto_indexing", "true"); 
config.put("use_memory_mapped_buffers", "true"); 
config.put("neostore.propertystore.db.index.keys.mapped_memory", "150M"); 
config.put("neostore.propertystore.db.index.mapped_memory", "150M"); 

我使用gcr cache_type。我只是通過遍歷熱身圖:

for (Node n : GlobalGraphOperations.at(db).getAllNodes()) { 
    n.getPropertyKeys(); 
    for (Relationship relationship : n.getRelationships()) { 
     start = relationship.getStartNode(); 
    } 
} 

Cypher支架查詢:

start user=node:users({key}={value}) match user-[:FRIEND]->(friend)-[:LIKES]->(item) return item, collect(friend), count(0) order by count(0) desc limit 32; 

,這意味着找出一個人的朋友的喜愛的物品。 我運行命令的jar:java -d64 -server -XX:+UseConcMarkSweepGC -XX:+UseNUMA -Xms10752m -Xmx10752m -Xmn2688m -jar Neo4J-1.0-SNAPSHOT.jar

現在,我的實驗結果: (1)單個線程 每個查詢的費用平均約70毫秒。 (2)8線程 每個查詢平均花費約160毫秒,許多查詢花費超過500毫秒。 RPS約爲50 /秒。

我想提高性能,但不知道如何。看來內存不足以保存所有數據,是嗎? 此外,我已經嘗試過軟和強大的cache_type,並且當它變熱時,內存很快就會滿了。

請幫助我,教我如何改善它。 非常感謝。

回答

0

如果堆大小/可用RAM太小而無法將全數據集保存在對象高速緩存中,則可以使用企業版。通過在你的n個Neo4j實例之前放置一個負載平衡器,它將圖的某個部分的所有請求路由到同一個實例,你基本上可以完成對象緩存分片。 Jim Webber在此方法博客:http://jim.webber.name/2011/02/scaling-neo4j-with-cache-sharding-and-neo4j-ha/

對於性能關鍵的查詢,它可能是一個想法,使用traversal API或甚至核心API重構Cypher查詢等價物。

+0

我試過遍歷API,它確實效果更好。現在,每個查詢花費約40毫秒。但是當我使用多線程(如8線程)時,一次查詢的平均時間大約需要200毫秒。有16個內核,我不知道如何改進這個以獲得更高的RPS。謝謝! – GameBoy