2017-05-27 109 views
2

注意 - 在Stackoverflow的其他地方有類似的問題,但它與Spring Data有關,而且我沒有使用Spring Data。Neo4J「GC Monitor:應用程序線程被阻塞10000ms」

我有一個從Twitter數據構建的簡單的社交圖。到目前爲止約有120,000個節點和約200,000個關係。

的Neo4j的表現似乎有點打了小姐,像這樣的查詢偶爾服用200秒:

MATCH p=(:User {twId: 838853137247141888})-[:FOLLOWS*0..3]->(:User {twId: 40002648}) 
RETURN SUM(REDUCE(s = 1.0, n IN NODES(p)[0..-1] | s/SIZE((n)-->()))) AS connectedness 

我看着在logs/debug.log並注意以下的常規流,即使沒有疑問發生在圖上:

2017-05-27 18:50:40.041+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 2436ms. 
2017-05-27 18:50:46.831+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 5705ms. 
2017-05-27 18:50:55.631+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 8699ms. 
2017-05-27 18:50:56.450+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 719ms. 

.neo4j-community.vmoptions僅包含以下

-Xmx6G 

(我嘗試了一大堆,看是否可以解決這個問題 - 它沒有)

我在MacOS塞拉利昂運行的Neo4j社區v3.1.3 10.12.4

說實話,我在分析Neo或確定服務器的性能時,我不知道從哪裏開始,並且文檔對我的特定問題沒有太大的幫助。

提示非常感謝。

更新:

我也看到在啓動時在我debug.log以下

2017-05-27 19:23:06.439+0000 ERROR [o.n.k.a.i.s.LuceneSchemaIndexProvider] Failed to open index:3, requesting re-population. Lock held by this virtual machine: /Users/chris/social-graph/schema/index/lucene/3/1/write.lock 
org.apache.lucene.store.LockObtainFailedException: Lock held by this virtual machine: /Users/chris/social-graph/schema/index/lucene/3/1/write.lock 
     at  org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:127) 
     at  org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41) 
     at  org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45) 

更新:

Indices

Query Plan

顯示所有JVM ARGS: JVisualVM Overview

奇怪的VisualVM的輸出不與 的debug.log JVisualVM output

+1

您能確認一下您是否有一個唯一的約束或索引:User(twId)?如果沒有該索引,您的查詢將會抓取。您可以使用PROFILE爲查詢添加前綴以獲取查詢執行的可視計劃。你可以運行它,展開計劃的所有元素,導出它並將圖像添加到描述中? – InverseFalcon

+0

感謝您回覆我@InverseFalcon - 我添加了:schema的輸出,以及查詢計劃。我確實有一個索引:用戶(twId) –

+1

您可能已經意識到了這一點,但要注意在這裏除以零錯誤,看起來如果路徑中的節點沒有外向關係,則可能會有風險。 – InverseFalcon

回答

1

提示報告10秒的GC相符:jvisualvm會給你很多信息對您運行jvms,比如使用哪個GC(在overview選項卡中,可能會有-XX:+ UseG1GC)。

+0

感謝您的建議。我用JVisualVM的屏幕截圖更新了我的問題 –

+1

沒有jvm內存參數。 Max不是6G。 看看你是否沒有env vars劫持那個價值。 另外,看看你的conf/neo4j.conf文件 –

+0

同意 - 這很奇怪,但是,當我按照Neo4J啓動器應用程序的指示,它告訴我編輯/Users/chris/Documents/Neo4j/.neo4j-community。 vmoptions 我這樣做了,並且包含-Xmx6G –

1

就調整查詢本身而言,您可能希望使用索引提示來強制計劃在運行擴展之前首先在兩個節點上進行匹配,而不是從一個節點擴展然後過濾結束節點的默認行爲。

看到這是如何爲你工作,無論是在速度和外形方面:

MATCH (start:User {twId: 838853137247141888}), (end:User {twId: 40002648}) 
USING INDEX start:User(twId) 
USING INDEX end:User(twId) 
MATCH p=(start)-[:FOLLOWS*0..3]->(end) 
RETURN SUM(REDUCE(s = 1.0, n IN NODES(p)[0..-1] | s/SIZE((n)-->()))) AS connectedness 

注意,這可能不會在Neo4j的3工作。2,我認爲他們已經移除了RULE planner,這是利用索引提示所需要的。

編輯

存在......它不會像在3.1.X以上查詢作爲高性能(根據異形DB命中)圍繞上述3.2限制的方式,但它應該是更好的性能比原始查詢。

MATCH (start:User {twId: 838853137247141888}), (end:User {twId: 40002648}) 
MATCH p=(start)-[:FOLLOWS*0..3]->(x) 
WHERE x = end 
RETURN SUM(REDUCE(s = 1.0, n IN NODES(p)[0..-1] | s/SIZE((n)-->()))) AS connectedness 
+0

非常感謝您的建議。我剛剛升級到3.2,因爲它發生了:-s 我得到「無法完成查詢的提示。無法解決這些提示:'USING INDEX end:User(twId)'」 –

+0

說了上面所述,我按照您的示例(兩個匹配語句)重組了查詢,它運行速度提高了10倍! –

+1

聽起來很棒,雖然要小心,如果你打算跳到3.2,因爲多個索引提示目前正在出錯,而且我不確定這是否會被修復,因爲它似乎依賴於使用RULE規劃師,這是與3.2刪除。我將添加這個查詢的一個變體,該變體應該在3.2版本上工作,並且比默認的更具性能,儘管它不會像我提供的第一個版本那樣高性能。 – InverseFalcon