不为失败找理由,要为成功找方法。

Elasticsearch7.3之后FST一定会存到堆外内存吗?可以参数调整吗?

Elasticsearch | 作者 zmc | 发布于2021年07月29日 | 阅读数:2688

7版本之后 index.store有多种模式,选择不同的fs,默认hybridfs模式,看到issue上说的是该模式下,会将FST放到堆外,对于原来的mmapfs和niofs的场景,没有提及,看代码是fst的持久化文件都会走mmap的模式,也就是放到堆外了(没有完全理解),求解惑~

如果是都会放到堆外,有没有什么办法控制FST放到堆内
已邀请:

Charele - Cisco4321

赞同来自: zmc

再来看看新版Lucene的处理:
 
    long numBytes = metaIn.readVLong();
    this.fstStore.init(in, numBytes);
 
它把这个交给fstStore去处理,
有两个子类:OnHeapFSTStore和OffHeapFSTStore
 
OnHeap就和上面老版本的一样,
 
OffHeap的做法:看下它的解释
Provides off heap storage of finite state machine (FST),using underlying index input instead of byte store on heap
就是不加载进内存,依赖于index input。
它用的是OffHeap。
 
所以我的看法,Lucene底层是这么做的,上层的ES是无法改变的。
 
 
 
 
 
 
 

Charele - Cisco4321

赞同来自:

https://elasticsearch.cn/question/11447
看了这个贴子,我比较了新旧版本的ES,在加载tip(就是FST所在),没有发现有什么改变。
后来找到了我的理解,不过过于复杂,我的理解也不一定正确,就没有回复。
 
 
“FST一定会存到堆外内存”,这种变化是Lucene的改变,不是ES的改变。
先看下旧版本的Lucene的做法:

QQ图片20210729162752.png

它的做法是,如果FST小于1G,就直接建个byte[]读进来,
(大于1G的话,是用别的类去读,不过本质上也是byte[]的形式)
所以说是在heap里的
 
 

zmc - ES PAAS、JuiceFS

赞同来自:

11111elastic.png

 

Charele - Cisco4321

赞同来自:

"还有一个就是看到有些博客描述是说 直接 mmap,所以写到堆外"
 
你是不是认为用mmap,就是堆外。如果设置成其它的格式,比如NIOFS,就是on-heap了?
 
上面旧版本的Lucene的处理方式,它都是直接把FST读到byte[]里面,它并不管你是mmap还是NIO,
所以说这种方式是完全on-heap的。
 
 
而新版本的Lucene的处理方式,是依赖于格式的处理方式,就是不直接全部读进内存。
不管你是mmap还是NIO,都可能用到了缓冲,只是方式不一样。
比如mmap用到了内存映射(memory mapping)技术,而NIO用的其它的方式。
 
打个比方,比如你的电脑内存是8G,就不能放16G的高清电影了???
如果事先要把电影全部读到内存,肯定要oom。
 
 
 
 
 
 
 
 
 
 
 

Charele - Cisco4321

赞同来自:

你说的变化,“7.3版本中将tip文件加上了”,
 
我们看下ES 6.8.16的代码
    static final class HybridDirectory extends NIOFSDirectory {
        private final FSDirectory randomAccessDirectory;
        ...
        @Override
        public IndexInput openInput(String name, IOContext context) throws IOException {
            String extension = FileSwitchDirectory.getExtension(name);
            switch(extension) {
                case "nvd":
                case "dvd":
                case "tim":
                case "cfs":
                    ensureOpen();
                    ensureCanRead(name);
                default:
                    return super.openInput(name, context);
            }
        }
 
这里是好像并没有tip文件。你是不是就认为tip就会用父类NIOFSDirectory去读了(也就是on-heap了)?
 
别忘了,ES用的是复合文件格式(肯定是的,这不能设置),所以有的时候是包括在cfs文件里面的,
可能包括在cfs里面,也可能是独立的tip文件,这种情况又该如何去判断呢?
 
所以我的观点是,文件格式(mmap或者nio),并不是FST在off-headp或者在on-heap的判断标准
 

要回复问题请先登录注册