2013-11-22 51 views
4

我跑了一个搜索,第一次,它花了3-4秒。 我跑了同样的搜索第二次,它花了不到100毫秒(如预期,因为它使用缓存) 然后我清除缓存通过调用“http://host:port/index/_cache/clear” 接下来我跑了相同的搜索,并期待它采取3- 4秒,但它花费少于100毫秒Elasticsearch缓存清除似乎没有做我所期望的

因此清除缓存不起作用? 这个网址究竟干净了什么? 我该如何让ES每次都做原始搜索(即不缓存)?

我正在做一些负载测试的一部分。

回答

5

清除缓存将清空:

  • 场数据(使用由小面,分选,地理位置等)
  • 过滤器高速缓存
  • 父/子缓存
  • 布隆过滤器对倒排列表

您看到的效果可能是由于操作系统文件系统缓存。由于lucene段的不变性,Elasticsearch和Lucene充分利用了操作系统文件系统缓存。这意味着小指数往往会被您的操作系统完全缓存在内存中,并成为无盘。

另外,在Elasticsearch的“无缓存”状态下进行基准测试并没有什么意义。它的设计和构建是为了在缓存环境中运行 - Elasticsearch众所周知的性能很大程度上归功于它对缓存的卓越使用。为了完全准确,您的基准测试应该真正考虑一个完全加热JVM(适当调整新的Eden空间,优化JIT输出等)的系统,并使用真实的,类似生产的数据来模拟ES和OS级别的“真实世界”缓存填充和驱逐。

合成测试如“无缓存环境”没有多大意义。

+0

父/子缓存正是我想清楚了。 如何启用该功能?但我想我仍然会受到文件系统缓存的冲击。 我同意在正常情况下,我不会清除缓存,但在我的情况下,我正在测试父/子,多搜索类型的查询组合,其中一些嵌套查询是相同的,因此被缓存命中。 – newbie

+0

糟糕,我检查了它,并且默认情况下也会清除父/子。我会更新我的帖子。我猜你看到的效果几乎完全是操作系统缓存,我不知道一个有效的方法来打败 – Zach

+0

@Zach你可以使用'echo 3>/proc/sys/vm/drop_caches'来清除OS缓存 –