各位好:
执行ssh -p 29418 xxxx gerrit show-queue -w -q命令的时候,在Queue: Index-Interactive标签下出现好多start:merged状态的进程,这些进程看着像是在做查询的动作,这样的一条进程就直接占用一个核CPU,当出现多个类似
进程的时候,服务器资源就很容易被消耗完。
对接的jstack log如下:
Index-Interactive-9
org.apache.lucene.util.PriorityQueue.downHeap(PriorityQueue.java:284)
org.apache.lucene.util.PriorityQueue.updateTop(PriorityQueue.java:211)
org.apache.lucene.search.TopFieldCollector.updateBottom(TopFieldCollector.java:523)
org.apache.lucene.search.TopFieldCollector$SimpleFieldCollector$2.collect(TopFieldCollector.java:243)
org.apache.lucene.search.Weight$DefaultBulkScorer.scoreAll(Weight.java:221)
org.apache.lucene.search.Weight$DefaultBulkScorer.score(Weight.java:172)
org.apache.lucene.search.BulkScorer.score(BulkScorer.java:39)
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:821)
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:535)
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:744)
org.apache.lucene.search.IndexSearcher.searchAfter(IndexSearcher.java:729)
org.apache.lucene.search.IndexSearcher.searchAfter(IndexSearcher.java:671)
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:577)
org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:627)
com.google.gerrit.lucene.LuceneChangeIndex$QuerySource.doRead(LuceneChangeIndex.java:345)
com.google.gerrit.lucene.LuceneChangeIndex$QuerySource.access$300(LuceneChangeIndex.java:279)
com.google.gerrit.lucene.LuceneChangeIndex$QuerySource$1.call(LuceneChangeIndex.java:325)
com.google.gerrit.lucene.LuceneChangeIndex$QuerySource$1.call(LuceneChangeIndex.java:322)
com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:108)
com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:41)
com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:77)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
com.google.gerrit.server.git.WorkQueue$Task.run(WorkQueue.java:417)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)
查看了LuceneChangeIndex类里doRead方法,发现是opt.start() 这个值特别大。 start()这个是抽象QueryOptions类里的抽象方法,但是在gerrit源码里没有查到哪个子类进程了增抽象类重写了这个抽象方法。
想从源码去解决这个问题难度有点大。
哪位大佬碰到过类似的问题不?谢谢。