针对目前线上产品进行压力,发现不少问题,现在做个总结
我们的产品是一个问答系统,主要核心技术是lucene搜索,针对不同实例,分成不同的索引目录,有N个实例会存在N个indexwriter
目前测试数据量及环境如下:
6核4G
数据量1000万
问题字数:平均14个字
问题答案字数:平均418个字
优化前1000万数据量需要构建索引16个小时,IO已经极限
优化后1000万数据量针对不同实例对比如下
索引构建所并发数 |
单实例构建索引 |
两个实例两个线程并发构建索引 |
三个实例三个线程并发构建索引 | ||
内存优化时间 |
182655毫秒 3分钟 |
实例1
|
192110毫秒 3.20分钟 |
实例1
|
189883毫秒 3.164分钟 |
实例2
|
192114毫秒 3.20分钟 |
实例2
|
189889毫秒3.164分钟 | ||
|
|
实例3
|
189879毫秒 3.164分钟 | ||
磁盘优化时间 |
1514423毫秒 25分钟 |
实例1
|
3820694毫秒 63.678分钟 |
实例1
|
4874940毫秒 81.249分钟 |
实例2
|
3322985毫秒 55.383分钟 |
实例2
|
4579260毫秒 76.321分钟 | ||
|
|
实例3
|
4807620毫秒 80.127分钟 | ||
单独构建索引的时间 |
4663807毫秒 1.295 个小时 |
实例1
|
7867191毫秒 2.185小时 |
实例1
|
13925086 毫秒 3.868 小时 |
实例2
|
7776207毫秒 2.16小时 |
实例2
|
14423098 毫秒 4.006小时 | ||
|
|
实例3
|
14349161 毫秒 3.985小时 | ||
构建索引和优化总时间 |
6196072毫秒 1.721 小时 |
实例1
|
11811529毫秒 3.28小时 |
实例1
|
18991299毫秒 5.275小时 |
实例2
|
11202412毫秒 3.11小时 |
实例2
|
19212047毫秒 5.336小时 | ||
|
|
实例3
|
19356620毫秒 5.376小时 |
优化方针:
1、多线程构建索引
采用jdk1.5提供的线程池多线程构建索引
2、构建索引的脚本调优
采用游标方式抓取数据而不是分页抓取数据
3、lucene api调优
indexwriter.setRAMBufferSizeMB(256);// M
indexwriter.setUseCompoundFile(false);// 多文件索引
indexwriter.setMergeFactor(10);