2014-10-29 110 views
4

A recent blog post on Elasticsearch網站正在談論他們新的1.4 beta版本的功能。如何在Java或Python中使用文件系統緩存?

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

最近發佈加入了對DOC值的支持。基本上,doc值提供的功能與內存中的fielddata相同,但是它們在索引時刻寫入磁盤。他們提供的好處是它們消耗的堆空間非常少。 Doc值是從磁盤讀取的,而不是從內存讀取。雖然磁盤訪問速度慢,但文檔值受益於內核的文件系統緩存。與JVM堆不同,文件系統緩存不受32GB限制的限制。通過將字段數據從堆轉移到文件系統緩存,您可以使用更小的堆,這意味着更快的垃圾回收以及更穩定的節點。

在此版本之前,doc值顯着低於內存中的fielddata。 此版本中的更改顯着改善了性能,使它們幾乎與內存中的fielddata一樣快。

這是否意味着我們可以操縱文件系統緩存的行爲,而不是等待來自操作系統的效果被動?如果是這樣的話,我們如何在正常的應用開發中利用文件系統緩存呢?假如我正在編寫一個Python或Java程序,我該怎麼做?

+0

我相信這是ES內部的東西。 「操縱文件系統緩存的行爲」是什麼意思?你想用它做什麼? – 2014-10-29 09:55:42

+0

http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html – 2014-10-30 07:05:31

+0

@AndreiStefan您提供的博客文章是關於Lucene(或ES?)如何使用文件系統緩存的極好參考。你想突出那篇文章中的一些關鍵點並作爲答案嗎?我會接受:) – shihpeng 2014-10-30 15:15:23

回答

2

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

doc值實現的這種改進將此功能稱爲現在可以使用文件系統緩存,因爲它們是從磁盤讀取的,放入緩存並從那裏訪問,而不是佔用堆空間。

如何這個文件系統緩存中this excellent blog post描述被訪問:

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

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

有關在Java程序中使用mmap的實際方法,我認爲this is the class and method to do so

相關問題