同事调整了IndexWriterConfig的maxThreadStates参数,发现性能有很大提升,原来之前一直没去注意这个东西。
addDocument时默认会调用ThreadAffinityDocumentsWriterThreadPool来获取线程锁,而这个线程池默认是8个线程,如果同时addDocument的线程多于8个,则线程处在等待锁的状态(一般是等最小竞争的>锁),所以本质上要在indexwriterconfig中增加最大索引线程数。
Lucene中还存在一个FlushStallControl,用于平衡addDocument和flush之间的速度差,如果flushBytes + activeBytes > 2 * ramBytes,且flushBytes > 0,则addDocument线程被暂停,直到flush完成。这有一个启发,最好监控下等待时间,如果等待时间太长,是不是考虑硬盘换一下?
原文地址:http://blog.csdn.net/jollyjumper/article/details/25428381