2017-01-23 35 views
1

我正在使用C# Datastax connector以及單個羣集和會話對象在cassandra中執行許多異步插入操作。我也正在使用準備好的語句並將其重用於所有操作。cassandra連接中的大內存使用

最近我注意到,運行的應用程序的幾分鐘後變得很慢,因爲它已開始在機器上使用虛擬內存,32 GB的內存。 我追蹤了內存使用情況,發現它全部被cassandra連接使用。

爲了測試我跑,直到內存爲1 GB,注意到以下幾點:

943 MB的Cassandra.Connection在Cassandra.OperationState
890 MB
802 MB的RequestExecution在RequestHandler

738 MB

我也注意到,有在ConcurrentQueue大約934 MB其根源在於Cassandra.Connection._writeQueue。

這是否意味着應用程序正在排隊寫入比節點能夠處理更快? 所有邏輯都是使用預備語句使用異步等待執行的。

不知道我該如何做不同的事情。這是cassandra的基本用法。

這是張貼在official google group。然而,看起來SO可能是一個更好的位置。我坦率地不確定。

回答

3

簡短的回答是,是的,這聽起來像你扔在集羣的寫入速度過快而無法承認它們,因此寫入隊列備份。這聽起來像你已經遵循最佳實踐,如使用單個會話對象,準備好的語句等,但有幾件事你可以嘗試,看看它是否有助於解決問題:

  1. 當你創建Session對象會查看定製PoolingOptions(即在集羣構建器上使用.WithPoolingOptions(yourCustomPoolingOptions).有可能增加每個節點的連接數或最大數量的進行中請求可能會有所幫助,但請記住,您仍然可以使用更多的內存爲所有的簿記(即任務等)有發生的異步請求。在應用程序中瞭解更多關於connection pooling in the driver
  2. 油門下的寫,如果你有控制源。例如,如果您正在從平面文件中讀取數據,然後將行寫入Cassandra,請記錄您在飛行中寫入了多少寫入數據,並且只有在某個閾值以下才能從文件中提取更多數據,從而爲您提供穩定狀態在應用程序中。這是我見過的用於批量加載數據或將大批量數據加載到Cassandra中的非常常見的模式。
  3. 也檢查卡桑德拉方面的事情。這可能是因爲你有一些事情正在減慢寫入速度,從而備份你的客戶端(停止世界垃圾收集,壓縮等)。一個好的起點是日誌中的警告/錯誤(例如system.log)。您還可以從nodetool(其中tablestatstablehistograms命令可能有用)獲得大量指標。

希望有所幫助。

+0

謝謝。如果所有事情都像你想象的那樣神奇地工作,那肯定會很好,但畢竟這是真實的世界。 :( – Telavian