2017-10-14 64 views
0

我在Linux上使用Gemfire v7.0.1.3。以下是我的緩存xml。Gemfire持久溢出

<?xml version.....> 
<!DOCTYPE....> 
<cache is-server="true"> 
    <disk-store name="myStore" auto-compact="false" max-oplog-size="1000" queue-size="10000" time-interval="150"> 
     <disk-dirs> 
     <disk-dir>.....</disk-dir> 
     </disk-dirs> 
    </disk-store> 
    <region name="myRegion" refid="PARTITION_PARSISTENT_OVERFLOW"> 
     <region-attributes disk-store-name="myStore" disk-synchronous="true"> 
     <eviction-attributes> 
      <lru-entry-count maximum="500" action="overflow-to-disk" /> 
     </eviction-attributes> 
     </region-attributes> 
    </region> 
    </cache> 

現在我開始緩存服務器分配8GB。當我使用String作爲緩存鍵和自定義對象(每個對象具有4個雙倍數組,每個數值爲10000)作爲值時,我可以在緩存中存儲500萬個對象,而不會出現任何問題。我可以看到磁盤存儲目錄有.crf,.krf,.drf文件。如果我重新啓動緩存,元素正在恢復,所有的好東西。但是,如果我使用自定義對象作爲鍵和值,則在創建區域中的25000(大約)條目後,我開始獲取低內存異常。它預期的行爲?由於Gemfire文檔說當我們一起使用持久性和溢出時,所有鍵和最近最少使用的值都會溢出到磁盤,並且大多數活動條目值都會保存在內存中。所以,我期待着,只要我的磁盤存儲空間可用,我就可以在該區域存儲任意數量的對象。但是我得到了低內存異常。請幫助我理解。

感謝

回答

0

密鑰永遠不會溢出到磁盤,那麼你的內存一定要大到足以容納所有鍵。對於持久區域,密鑰也寫入磁盤,但這僅用於恢復目的。因此,如果您的對象鍵的大小遠大於您的字符串鍵的大小,則會出現此行爲。

+0

謝謝Swapnil。我從gemfire服務器收集了.gfs文件,並使用gemfire提供的VSD打開它。在VSD中有很多統計數據。對於所有區域快捷區域爲「PARTITION_PERSISTENT_OVERFLOW」的區域,VSD顯示「entriesInMemory」和「entriesOnlyOnDisk」,並且這兩個數字的總和與GFMon/Pulse上顯示的數字相匹配。我瞭解作爲關鍵值對的條目。正如VSD所說,「entriesOnlyOnDisk」,這意味着很少的條目不在內存中並且僅駐留在磁盤上,這意味着僅駐留在磁盤上的條目完全從內存中逐出。不是嗎? – Biswajit

+0

該統計名稱有點誤導。對於每一個條目,gemfire都會在內存中維護鍵值和相應的磁盤位置值,以便即使該值被逐出磁盤,我們也可以在一次磁盤搜索中獲取它。 – Swapnil

+0

謝謝Swapnil。在我的緩存中有大約30個區域。當我使用lru-entry-count配置驅逐時,我的緩存支持更多數量的記錄,但是當我將驅逐屬性更改爲lru-memory-size時,緩存在幾條記錄後失敗。我懷疑,由於某種配置,驅逐不會發生。有什麼方法可以檢查哪個區域沒有發生驅逐?或者哪個操作導致內存錯誤率低? – Biswajit