爱喝咖啡的程序员 2020-04-09 23:53 采纳率: 0%
浏览 464

Elasticsearch 堆内存和OS Cache 以及搜索、聚合数据的实现原理问题

我有以下想法,不知道是否正确,请各位指教:
1. buffer和尚未写入系统缓存的index segment(就是一段倒排索引)存储在堆内存,其大小受jvm参数控制。
2. 系统缓存 OScache在这里可以被看做是"文件系统缓存",用于缓存打开后的segment file(段文件),存储在非堆内存,受操作系统控制。

非堆内存越大,能够打开并缓存的segment file(段文件)就越多,搜索和聚合时,能够直接从内存中获取的热数据也就越多(不需要通过IO,在磁盘中找到尚未打开的segment file,读取文件内容)。

搜索数据时,首先在OS Cache中进行搜索,如果找不到数据,则在磁盘中找到对应的index segment文件并打开,读取数据至堆内存中(ES由java开发,因此一定是读取到堆内存,而不是OS Cache),接着,在堆内存中对数据进行聚合、排序等操作,最后把数据返回给协调节点,整理后交给调用方。此外,新读取到堆内存的segment file会被Lucense缓存至OS Cache中(如果非堆内存不够用,则新按照写入时间顺序,放弃最早的数据,腾出空间,写入新数据)。

  • 写回答

1条回答

      报告相同问题?

      相关推荐 更多相似问题

      悬赏问题

      • ¥15 sql 时间计算问题
      • ¥15 51单片机按钮控制流水灯
      • ¥15 4元红包8人抢 可以预测尾数 0 9的位置吗
      • ¥20 Java项目在线求解
      • ¥40 Selenium 内核修改
      • ¥15 微信小程序选修课课程作业 急急急今晚10点前
      • ¥15 python写一下 if问题
      • ¥15 opencv c++虚拟画家
      • ¥35 python 生成exe报错问题
      • ¥30 基于香农-费诺-埃利斯编码实现对英文文本的压缩和解压缩