【问题标题】:Fields as Doc_Values to drop Memory Usage作为 Doc_Values 的字段以删除内存使用情况
【发布时间】:2015-01-21 22:27:11
【问题描述】:

目前我们面临很多这样的例外:

ElasticsearchException[org.elasticsearch.common.breaker.CircuitBreakingException: Data too large, data for field [field1] would be larger than limit of [24108466176/22.4gb]]

经过对上述异常的一些调查,field1 似乎占用了很多fielddata cache size 以及另一个字段让我们称之为field2

GET /_stats/fielddata?fields=field1,field2的结果:

"total": {
         "fielddata": {
            "memory_size_in_bytes": 260456614595,
            "evictions": 1226307,
            "fields": {
               "field1": {
                  "memory_size_in_bytes": 76629429704
               },
               "field2": {
                  "memory_size_in_bytes": 97600838429
               }
            }
         }
      }

注意:两个字段都是not_analyzed。 Field1 在搜索查询中被大量使用,而 field2 没有那么多。

因此,通过 es 文档的 doc value 部分,这些字段可以存储为 doc values 以减少堆使用。

这是解决上述异常等内存问题的好方法吗?

文档还说,通过将字段存储为 doc 值,索引会变大,有没有办法计算这种增加?

【问题讨论】:

  • 在这种情况下建议使用 doc-values,因为您对堆施加的所有压力都将转移到磁盘上。不过,缺点是性能略有下降。而且由于您将堆的那部分从内存移动到磁盘,我猜想增加的堆使用量与减少的堆使用量相似。

标签: caching elasticsearch


【解决方案1】:

Doc_Values 太棒了!

  • 对于新索引,这些字段的fielddata size 位于 0:

    "total": {
       "fielddata": {
          "memory_size_in_bytes": 5394813851,
          "evictions": 112,
          "fields": {
             "field1": {
                "memory_size_in_bytes": 0
             }
          }
       }
    }
    
  • 在这些字段上执行查询时不再出现 Data too largeexceptions,更不用说这些查询现在执行得更快了,我猜是因为 CircuitBreaker 不会经常出错。

  • 对于性能...索引方面略有下降,不用担心。

  • 在我们的例子中,索引大小现在大约增加了 20%。

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2017-05-17
    相关资源
    最近更新 更多