elasticsearch,nest,.net,Lucene,Amazon Ec2,elasticsearch,Nest" /> elasticsearch,nest,.net,Lucene,Amazon Ec2,elasticsearch,Nest" />

.net 由于索引和文档数量不变,elasticsearch批量索引速度会随着时间的推移而变慢

.net 由于索引和文档数量不变,elasticsearch批量索引速度会随着时间的推移而变慢,.net,lucene,amazon-ec2,elasticsearch,nest,.net,Lucene,Amazon Ec2,elasticsearch,Nest,我体验到使用.NET NEST客户端和ElasticSearch的批量索引性能会随着时间的推移而下降,索引数量和文档数量会保持不变 我们正在一个m1.5的大型Amazon实例上运行ElasticSearch版本:0.19.11,JVM:23.5-b02,该实例使用Ubuntu服务器12.04.1 LTS 64位和Sun Java 7。除了Ubuntu安装附带的内容外,此实例上没有其他运行内容 亚马逊M1大型实例:来自 ES_MAX_MEM设置为4g,ES_MIN_MEM设置为2g 每天晚上,我们

我体验到使用.NET NEST客户端和ElasticSearch的批量索引性能会随着时间的推移而下降,索引数量和文档数量会保持不变

我们正在一个m1.5的大型Amazon实例上运行
ElasticSearch版本:0.19.11,JVM:23.5-b02
,该实例使用Ubuntu服务器12.04.1 LTS 64位和Sun Java 7。除了Ubuntu安装附带的内容外,此实例上没有其他运行内容

亚马逊M1大型实例:来自

ES_MAX_MEM设置为4g,ES_MIN_MEM设置为2g


每天晚上,我们在.NET应用程序中使用NEST索引/重新索引约15000个文档。在任何给定时间,只有一个指数仅用于猜测:

随着索引性能的下降,您是否注意到索引会占用更多磁盘空间

可能是这样的,在重新编制索引时,您没有替换旧索引或旧文档,而是添加了一堆新文档,实际上文档数量翻了一番,而数据可能大量重复。可能值得抓取一个陈旧、缓慢的索引并将其加载到某个查看器中进行调试(例如)。如果您看到的文档比预期的多得多,那么您可以考虑让您的重建创建一个新索引来替换旧索引

由于重新启动守护进程并不能解决问题,我认为可以排除打开文件句柄、运行进程、连接等情况,不过我希望检查这些统计信息,并确定是否在服务器上看到任何可疑行为


另外,关于优化,您可能会看到一些性能增强,当然,但这是一个非常昂贵的操作。我建议只在完整重建完成后运行优化,而不是在每次增量批量索引操作后运行优化。

对不起,我刚刚开始写另一条很长的评论,我想我应该把它全部放在一个答案中,以防它对其他人有利

ES_堆大小

我在这里注意到的第一件事是,您说您将elasticsearch的最大和最小堆值设置为不同的值。这些应该是相同的。在configuration/init.d脚本中,应该有一个可以设置的EX_HEAP_大小。请确保仅设置该值(而不是最小值和最大值),因为它会将最小值和最大值设置为您想要的相同值。如果您不这样做,当您开始需要更多内存时,JVM将阻止java进程—这是github最近的一次中断(这里引用):

设置ES_HEAP_SIZE环境变量,以便JVM对最小和最大内存使用相同的值。将JVM配置为具有不同的最小值和最大值意味着每次JVM需要额外的内存(最多)时,它都会阻塞Java进程来分配内存。结合旧的Java版本,这解释了当我们的节点向公共搜索开放时,当引入更高的负载和连续的内存分配时所表现出的暂停。elasticsearch团队建议将系统RAM设置为50%

也可以从战壕中查看更多elasticsearch配置

锁定内存以停止交换

从我的研究中,我发现您还应该锁定java进程可用的内存量,以避免内存交换。我不是这方面的专家,但有人告诉我,这也会降低性能。您可以在elasticsearch.yml配置文件中找到bootstrap.mlockall

升级

Elasticsearch仍然很新。计划相当频繁地升级,因为在您使用的版本(0.19.11)和当前版本(0.20.4)之间引入的错误修复非常重要。有关详细信息,请参阅。您使用的是Java7,这绝对是正确的选择。我从Java6开始,很快意识到它还不够好,尤其是对于批量插入

插件

最后,对于其他遇到类似问题的人,请安装一个像样的插件来概述您的节点和JVM。我建议-运行bigdesk,然后用一些大容量插入点击elasticsearch,注意奇怪的堆内存模式、大量线程等,一切都在那里

希望有人觉得这个有用

干杯,
詹姆斯

谢谢你的指点!我们并没有注意到磁盘使用率的增加,也并没有注意到内存和CPU的增加。Mem通常约为70%,CPU的空闲率高达60-80%。我删除索引并在批量索引中添加
Optimize
,已经四天了。到目前为止,我们还没有看到索引性能下降,希望它能保持下去,但我确实感到不安,因为我无法找出问题所在。如果情况再次出现,我会调查卢克并翻阅日志。当然,优化可以解决这个问题是很有可能的。积累大量未优化的删除和插入(而更新只是删除+插入)肯定会降低搜索性能。另一件需要注意的事情是,在这种情况下,可能是您的合并策略,对于NEST和Elasticsearch,15000应该是breeze,几天后实际的文档计数和索引大小是多少?您在ES配置中遇到了这个问题,您的情况如何?我注意到这里有一件事肯定需要解决;您已将最大和最小ES堆内存设置为不同的值。它们应该是相同的;系统可用内存总量的50%到60%之间。我目前在一个使用NEST作为客户端的回填应用程序中每分钟批量索引100000个文档,因此15000个文档应该是微不足道的。您还使用了一个非常旧的ES版本-自19.11(当前为0.20.4)以来,它在专用服务器上有了一些很大的改进,除了设置
bootstrap.mlockall=true
之外,您还应该调用
ulimit-l
7.5 GiB memory
4 EC2 Compute Units (2 virtual cores with 2 EC2 Compute Units each)
850 GB instance storage
64-bit platform
I/O Performance: High
EBS-Optimized Available: 500 Mbps
API name: m1.large