2013-08-23 45 views
3

根據我的使用的Neo4j REST API表現不佳

GraphClient.Create() 

性能創建節點的基準極不理想。我有約每秒10個空節點在我的機器上(Core i3,8 GB RAM)。

即使我使用多線程執行創建時間到每個Create()調用速度線性增加(當使用N個線程〜N次)。

我測試了穩定1.9.2和2.0.0-M04。結果完全一樣。

有人知道有什麼問題嗎?

編輯:我試圖用Neo4j的REST API,我得到了類似的結果:每秒〜20個空節點和多線程也給沒有任何好處。

編輯2:同時批量REST API,允許批量創作提供了更好的性能:每秒約250個節點。看起來好像在處理單個請求時有很大的開銷...

回答

1

neo4jclient本身使用REST API,因此與直接API調用相比,您已經限制了性能(通過帶寬,網絡延遲等) (爲此你需要Java)。

  • 你以後表現如何?
  • 你在運行什麼代碼?

一些初步想法&測試嘗試:

顯然有一些事情,如CPU等,這會造成一定的限制,一些事情要考慮:

  1. 是在同一臺機器上的Neo4j服務器?
  2. 您是否通過Visual Studio嘗試過您的應用程序而不是? (即不調試)

在我的測試代碼(如下圖),我得到10個條目中〜200ms的 - 你可以嘗試在一個簡單的控制檯應用程序的代碼,看看你得到了什麼?

private static void Main() 
{ 
    var client = new GraphClient(new Uri("http://localhost.:7474/db/data")); 
    client.Connect(); 

    for (int i = 0; i < 10; i++) 
     CreateEmptyNodes(10, client); 
} 

private static void CreateEmptyNodes(int numberToCreate, IGraphClient client) 
{ 
    var start = DateTime.Now; 
    for (int i = 0; i < numberToCreate; i++) 
     client.Create(new object()); 

    var timeTaken = DateTime.Now - start; 
    Console.WriteLine("For {0} items, I took: {1}ms", numberToCreate, timeTaken.TotalMilliseconds); 
} 

編輯:

這是一個原始的HttpClient的方法來調用「創建」,我相信很是類似什麼neo4jclient引擎蓋下是這樣做的:現在

private async static void StraightHttpClient(int iterations, int amount) 
{ 
    var client = new HttpClient {BaseAddress = new Uri("http://localhost.:7474/db/data/")}; 

    for (int j = 0; j < iterations; j++) 
    { 
     DateTime start = DateTime.Now; 
     for (int i = 0; i < amount; i++) 
     { 
      var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Post, "cypher/") { Content = new StringContent("{\"query\":\"create me\"}", Encoding.UTF8, "application/json") }); 
      if(response.StatusCode != HttpStatusCode.OK) 
       Console.WriteLine("Not ok"); 
     } 
     TimeSpan timeTaken = DateTime.Now - start; 
     Console.WriteLine("took {0}ms", timeTaken.TotalMilliseconds); 
    } 
} 

,如果你根本不在意這個迴應,你可以直接打電話Client.SendAsync(..),這會讓你的速度達到每秒2500個。但是顯然這裏最大的問題是,你不一定發送了任何這些創建,你基本上已經排隊,所以關閉你的程序後,很可能你會沒有任何條目,或者一個非常少數。因此..清楚的代碼可以處理一秒鐘內觸發x千次調用而沒有任何問題,(我已經使用ServiceStack和RestSharp完成了類似的測試,兩者都採用與HttpClient相似的時間)。

它所不能做的就是以同樣的速度發送這些實際的服務器,所以我們通過窗戶限制HTTP棧和/或如何快速n4j可以處理該請求並提供響應。

+0

我已經跑了你的代碼:平均它(創建10個節點)需要400毫秒〜。此應用程序產生約40 KB/s的網絡活動 - 我認爲網絡吞吐量不是瓶頸。我根本沒有看到瓶頸,但速度很慢......而當我使用4個線程時,每10個節點需要大約4 * 400毫秒。 –

+0

請參閱此鏈接:http://comments.gmane.org/gmane.comp.db.neo4j.user/11002。他們正在談論每秒超過500個節點。而且他們也使用REST API –

+0

我已經使用HttpClient添加了一個示例(上圖),我相信n4jclient會在引擎蓋下進行操作。我不知道他們是如何每秒實現500個節點的,當然我的(有限的)關於.net的基於靜止的直接通信的知識似乎並不明顯。 我懷疑Tatham能夠解釋這個問題,並且比我更好地解釋它。 –