针对目前线上产品进行压力,发现不少问题,现在做个总结
我们的产品是一个问答系统,主要核心技术是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);