【问题标题】:Elasticsearch Java using very high CPU and MEMORYElasticsearch Java 使用非常高的 CPU 和内存
【发布时间】:2016-06-13 18:05:41
【问题描述】:

由于 CPU 使用率过高,Elasticsearch 突然停止工作,现在当我重新启动它时,它一直在使用大约 100% 的 CPU 和 58% 的内存,它并没有下降。大约有 1.300.000 条数据链接到 Elasticsearch。使用 Linux 服务器 Ubuntu 15.04

默认/弹性搜索

ES_HEAP_SIZE=2g (half of my memeory)
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited

limits.conf

elasticsearch - nofile 65535
elasticsearch - memlock unlimited

elasticsearch.yml

bootstrap.mlockall: true

curl http://localhost:9200/_nodes/hot_threads?pretty=true

::: {elasticnode}{wrdxzFcXT0aTXnp4R5KFbA}{127.0.0.1}{localhost/127.0.0.1:9300} 2016-03-01T10:24:09.884Z 的热线程,interval=500ms,busiestThreads=3,ignoreIdleThreads=true: 线程“elasticsearch[elasticnode][clusterService#updateTask][T#1]”的 CPU 使用率为 93.7%(500 毫秒中的 468.4 毫秒) 10/10 快照共享以下 29 个元素 sun.nio.fs.UnixNativeDispatcher.readdir(本机方法) sun.nio.fs.UnixDirectoryStream$UnixDirectoryIterator.readNextEntry(UnixDirectoryStream.java :168) sun.nio.fs.UnixDirectoryStream$UnixDirectoryIterator.hasNext(UnixDirectoryStream.java:201) org.elasticsearch.index.translog.Translog$OnCloseRunnable.handle(Translog.java:726) org.elasticsearch.index.translog.Translog$OnCloseRunnable.handle(Translog.java:713) org.elasticsearch.index.translog.ChannelReference.closeInternal(ChannelReference.java:67) org.elasticsearch.common.util.concurrent.AbstractRefCounted.decRef(AbstractRefCounted.java: 64) org.elasticsearch.index.translog.TranslogReader.close(TranslogReader.java:143) org.apache.lucene.util.IOUtils.close(IOUtils.java:97) org.elasticsearch.index.translog.Translog.close(Translog.java:425) org.apache.lucene.util.IOUtils.close(IOUtils.java:97) org.apache.lucene.util.IOUtils.close(IOUtils.java:84) org.elasticsearch.index.engine.InternalEngine.closeNoLock(InternalEngine.java:990) org.elasticsearch.index.engine.Engine.close(Engine.java:1147) org.apache.lucene.util.IOUtils.close(IOUtils.java:97) org.apache.lucene.util.IOUtils.close(IOUtils.java:84) org.elasticsearch.index.shard.IndexShard.close(IndexShard.java:837) org.elasticsearch.index.IndexService.closeShardInjector(IndexService.java:443) org.elasticsearch.index.IndexService.removeShard(IndexService.java:416) org.elasticsearch.indices.cluster.IndicesClusterStateService.failAndRemoveShard(IndicesClus terStateService.java:743) org.elasticsearch.indices.cluster.IndicesClusterStateService.applyMappings(IndicesClusterSt ateService.java:364) org.elasticsearch.indices.cluster.IndicesClusterStateService.clusterChanged(IndicesClusterS tateService.java:164) org.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalCluste rService.java:600) org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterServ 冰.java:762) org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPriorit izedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231) org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPriorit izedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745)

0.1%(263.4micros out of 500ms)线程'elasticsearch[elasticnode][transport_clie
的cpu使用率 nt_timer][T#1]{散列轮计时器#1}' 10/10 快照共享以下 5 个元素 java.lang.Thread.sleep(本机方法)

org.jboss.netty.util.HashedWheelTimer$Worker.waitForNextTick(HashedWheelTimer.java:445) org.jboss.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:364) org.jboss.netty.util .ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) java.lang.Thread.run(Thread.java:745)

查询示例。这是elasticsearch.php中的代码:

public function advancedquery($type, $query) {
    return $this->call($type . '/_search', 'POST', $query);
}

知道这是怎么回事吗?我可以根据需要提供任何其他信息。

【问题讨论】:

  • 你能提供你用来发出请求的代码吗?尽管无论是否提出请求,这听起来像是 100% 的红线,这是正确的吗?
  • 另外,为了清楚起见,您使用的是 AWS ElasticSearch?
  • @iskore public function advancedquery($type, $query) { return $this -> call($type . '/_search', 'POST', $query); } 这是 elasticsearch.php 中的代码。是的,不提出任何请求使用总是非常高的 PS。不,我们没有使用 AWS ES。
  • 嗯。你想在 Java 环境中运行 PHP 还是什么?不确定这是如何连接的。另外,您可以暂时阻止实例向 ElasticSearch 发出任何请求吗?这将显示实例是否导致峰值。如果实例没有导致峰值,您可能需要扩展您的 ElasticSearch 集群
  • 没问题。所以让我们先把你的架构弄下来。您有一个运行 Java 的 EC2 实例 - 将此请求发送到 ES?看起来您实际上在 Java 环境中运行了 PHP 或其他东西。是这样吗?

标签: java linux node.js amazon-web-services elasticsearch


【解决方案1】:

根据评论。您有一个 cronjob 每 10 分钟运行一次,其中 node.jsJavaScript 中运行一个文件。根据您的问题,您有 JS 文件 ping 同一服务器上的 PHP 文件。在同一台服务器上,您有一个 Java 核心运行您的 posix 东西。

您的 CPU 过载问题的答案是:

选择一个系统。您在同一个实例上运行了三个环境。 Java 和 PHP 在 Apache 上运行,Node.JS 在 NGINX 上运行。你甚至不应该跨越 Java 和 PHP。那就是问题所在。就像同时运行 AutoCad、Final Cut Pro 和 Unreal Game Engine 一样……不是那样工作的。

将您的系统压缩成您选择的一种语言,当然,AWS SDK's 支持。

【讨论】:

  • 网站在 Apache2 上,而 Elasticsearch 在 Nginx 上的不同服务上,我们总是分开运行,如果 ES 出现故障,网站保持正常运行。我认为这没有任何故障连接。我们运行那个 cronjob 半天没有问题,然后这个问题就发生了。并删除了这份工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2022-07-26
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多