nodexy
(nodexy)
December 2, 2014, 9:55am
1
Hi,
I got this issue when build a basic search service by ElasticSearch in
Java as belown:
SearchResponse resp = client
.prepareSearch(ElasticSearchManager.INDEX_NAME)
.setTypes(ElasticSearchManager.INDEX_TYPE)
// way 1
// .setQuery(QueryBuilders.termQuery("pkgName",
// pkgName.toLowerCase()))
// way 2
.setQuery(QueryBuilders.matchAllQuery())
.setPostFilter(
FilterBuilders.termFilter("pkgName",
pkgName.toLowerCase())).execute().actionGet
();
And this method is invoked in a for loop on a list with 20 elements .
When we run this service in Tomcat container under 500 concurrent thread,
so many threads are waiting like this(TPS is about 1500):
名称: catalina-exec-15
状态: org.elasticsearch.common.util.concurrent.BaseFuture$Sync@23772759上的
WAITING
总阻止数: 1,136, 总等待数: 166,545
堆栈跟踪:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(
AbstractQueuedSynchronizer.java:834)
java.util.concurrent.locks.AbstractQueuedSynchronizer.
doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994)
java.util.concurrent.locks.AbstractQueuedSynchronizer.
acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303)
org.elasticsearch.common.util.concurrent.BaseFuture$Sync.get(BaseFuture.java
:274)
org.elasticsearch.common.util.concurrent.BaseFuture.get(BaseFuture.java:113)
org.elasticsearch.action.support.AdapterActionFuture.actionGet(
AdapterActionFuture.java:45)
com.xxx.service.elastic.ElasticSearchService.getByPkgName(
ElasticSearchService.java:324)
... ...
(sorry for the Chinese system language )
monitor info from jvisualvm:
Notes:
All ElasticsSearch is default .
Another service without for loop is really good , 10000 concurrent with
5000+ tps .
So is for loop the real reason ? How should I update this ?
Really thanks for your attention .
nodexy
--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com .
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/b0b4c52d-7e6d-4ad9-8cd9-261630f2c478%40googlegroups.com .
For more options, visit https://groups.google.com/d/optout .
nodexy
(nodexy)
December 5, 2014, 6:13am
2
Fixed this .
The key point is NEVER invoke cross-server or cross-process service in a
for loop . This is not a question to elasticsearch but common programming
sutff.
Sorry for disturbation. Thanks.
On Tuesday, December 2, 2014 5:55:21 PM UTC+8, nodexy wrote:
Hi,
I got this issue when build a basic search service by Elasticsearch in
Java as belown:
SearchResponse resp = client
.prepareSearch(ElasticSearchManager.INDEX_NAME)
.setTypes(ElasticSearchManager.INDEX_TYPE)
// way 1
// .setQuery(QueryBuilders.termQuery("pkgName",
// pkgName.toLowerCase()))
// way 2
.setQuery(QueryBuilders.matchAllQuery())
.setPostFilter(
FilterBuilders.termFilter("pkgName",
pkgName.toLowerCase())).execute().
actionGet();
And this method is invoked in a for loop on a list with 20 elements .
When we run this service in Tomcat container under 500 concurrent thread,
so many threads are waiting like this(TPS is about 1500):
名称: catalina-exec-15
状态: org.elasticsearch.common.util.concurrent.BaseFuture$Sync@23772759上的
WAITING
总阻止数: 1,136, 总等待数: 166,545
堆栈跟踪:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
java.util.concurrent.locks.AbstractQueuedSynchronizer.
parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
java.util.concurrent.locks.AbstractQueuedSynchronizer.
doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994)
java.util.concurrent.locks.AbstractQueuedSynchronizer.
acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303)
org.elasticsearch.common.util.concurrent.BaseFuture$Sync.get(BaseFuture.
java:274)
org.elasticsearch.common.util.concurrent.BaseFuture.get(BaseFuture.java:
113)
org.elasticsearch.action.support.AdapterActionFuture.actionGet(
AdapterActionFuture.java:45)
com.xxx.service.elastic.ElasticSearchService.getByPkgName(
ElasticSearchService.java:324)
... ...
(sorry for the Chinese system language )
monitor info from jvisualvm:
Notes:
All ElasticsSearch is default .
Another service without for loop is really good , 10000 concurrent with
5000+ tps .
So is for loop the real reason ? How should I update this ?
Really thanks for your attention .
nodexy
--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com .
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/bf1ec0db-434a-42a9-a549-934ca7ba047c%40googlegroups.com .
For more options, visit https://groups.google.com/d/optout .
sburnwal
(SATISH BURNWAL)
April 21, 2016, 1:55am
3
I do not have for-loop but I have very much same behavior with threads getting blocked in my tomcat server.
What is the solution here ? I am using 2.0.1 version.