簡體   English   中英

如何在Java或Python中使用文件系統緩存?

[英]How to make use of the filesystem cache in Java or Python?

最近在Elasticsearch網站上發表的博客文章討論了他們新的1.4測試版的功能。

我很好奇他們如何使用文件系統緩存:

最近的版本增加了對doc值的支持。 實質上,doc值提供與內存中fielddata相同的功能,但它們在索引時寫入磁盤。 它們提供的好處是它們占用的堆空間非常小。 Doc值是從磁盤讀取的,而不是從內存中讀取的。 雖然磁盤訪問速度很慢,但doc值會受益於內核的文件系統緩存。 與JVM堆不同,文件系統緩存不受32GB限制的約束。 通過將fielddata從堆轉移到文件系統緩存,您可以使用更小的堆,這意味着更快的垃圾收集,從而更穩定的節點。

在此版本之前,doc值明顯慢於內存中fielddata。 此版本中的更改顯着提高了性能,使其幾乎與內存中的fielddata一樣快。

這是否意味着我們可以操縱文件系統緩存的行為而不是被動地等待操作系統的影響? 如果是這種情況,我們如何在正常的應用程序開發中使用文件系統緩存? 說,如果我正在編寫Python或Java程序,我該怎么做?

文件系統緩存是與OS內部工作相關的實現細節,對最終用戶是透明的。 它不是需要調整或改變的東西。 Lucene在管理索引段時已經使用了文件系統緩存。 每次將某些內容索引到Lucene(通過Elasticsearch)時,這些文檔都會寫入段,這些段首先寫入文件系統緩存,然后在一段時間后(當translog - 一種跟蹤文檔被索引的方式 - 是例如,完整的緩存內容被寫入實際文件。 但是,雖然要編制索引的文檔位於文件系統緩存中,但仍可以訪問它們。

doc值實現的這種改進將此功能稱為能夠立即使用文件系統緩存,因為它們從磁盤讀取,放入緩存並從那里訪問,而不是占用堆空間。

這個優秀的博客文章描述了如何訪問此文件系統緩存:

在我們之前的方法中,我們依賴於使用系統調用來復制文件系統緩存和本地Java堆之間的數據。 如何直接訪問文件系統緩存? 這就是mmap的作用!

基本上mmap就像處理Lucene索引作為交換文件一樣。 mmap()系統調用告訴O / S內核將我們的整個索引文件虛擬映射到前面描述的虛擬地址空間,並使它們看起來像我們的Lucene進程可用的RAM。 然后我們可以在磁盤上訪問我們的索引文件,就像它是一個大的byte []數組一樣(在Java中,這是由ByteBuffer接口封裝的,以使Java代碼可以安全使用)。 如果我們從Lucene代碼訪問這個虛擬地址空間,我們不需要做任何系統調用,處理器的MMU和TLB為我們處理所有映射。 如果數據僅在磁盤上,則MMU將導致中斷,O / S內核將數據加載到文件系統緩存中。 如果它已經在緩存中,MMU / TLB將其直接映射到文件系統緩存中的物理內存。

與在Java程序中使用mmap的實際方法相關,我認為這是這樣做的類和方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM