【发布时间】: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