alibaba / havenask

Apache License 2.0
1.59k stars 299 forks source link

索引数据挂载在分布式存储searcher无法正常启动 #38

Open breeent opened 1 year ago

breeent commented 1 year ago

将构建好的索引数据挂载到分布式存储后searcher一直无法成功启动,查看ha3.log发现如下ERROR: [ERROR] [201, build/release64/indexlib/file_system/mmap_file_node.cpp -- LoadData():309] [lock file:[/home/xxx/cases/normal/workdir/local_search_12000/in0_0/runtimedata/in0/generation_0/partition_0_65535/segment_14_level_0/index/title/bitmap_posting] FAILED, errno: 12, errmsg: Cannot allocate memory] 查看代码是mmap_file_node.cpp中的mlock报错

            if (mlock(base + offset, lockLen) < 0)
            {
                INDEXLIB_FATAL_ERROR(FileIO, "lock file: [%s] FAILED"
                        ", errno: %d, errmsg: %s",
                        GetPath().c_str(), errno, strerror(errno));
            }

查看mlock相关文档时认为是 ENOMEM (mlock(), mlock2(), and munlock()) Some of the specified address range does not correspond to mapped pages in the address space of the process. 这个问题导致的,目前通过cp的方式将数据拷贝进来后searcher才能过成功启动。 请问这个问题有没有更好的解决方式呢?

foreverhy commented 1 year ago

引擎可以通过 fslib 组件来统一对下层不同文件系统的访问,对于在分布式存储上的索引来说:

  1. 如果需要类似 lock 的效果,可以在 fslib 中重载 mmap 来实现
  2. 不需要 lock 性质,可以在 fslib 中实现对应的 read/pread 接口,配合引擎的 block cache 使用
xuxijie commented 1 year ago

现在fslib等底层代码还在逐步开源,目前远端访问的话只支持cache的形式,如果是mmap的话确实是需要先下载到本地才能成功。

breeent commented 1 year ago

现在fslib等底层代码还在逐步开源,目前远端访问的话只支持cache的形式,如果是mmap的话确实是需要先下载到本地才能成功。

嗯嗯明白了,期待这些代码的进一步开源。

troycheng commented 1 year ago

这个问题是影响线上大规模使用的,等待进一步解决