建索引时优化的观察和思考

同事调整了IndexWriterConfig的maxThreadStates参数,发现性能有很大提升,原来之前一直没去注意这个东西。

addDocument时默认会调用ThreadAffinityDocumentsWriterThreadPool来获取线程锁,而这个线程池默认是8个线程,如果同时addDocument的线程多于8个,则线程处在等待锁的状态(一般是等最小竞争的>锁),所以本质上要在indexwriterconfig中增加最大索引线程数。

Lucene中还存在一个FlushStallControl,用于平衡addDocument和flush之间的速度差,如果flushBytes + activeBytes > 2 * ramBytes,且flushBytes > 0,则addDocument线程被暂停,直到flush完成。这有一个启发,最好监控下等待时间,如果等待时间太长,是不是考虑硬盘换一下?

另外使用LogByteMergePolicy的确比LogDocMergePolicy好,原因是这样内存平稳一点,表现略好。RamBufferSize是个很微妙的参数,理论上越大,索引归并的趟数越少,有利于减少归并时间,对建索引本身速度的影响,考虑addDocument和flush的平衡这一瓶颈,如果硬盘使用ssd(即等待时间变得超短,而且很少等待),段应该大一点好?这好像很难说清,从小索引测试结果来看,200M左右性能最好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值