近年接了个有关大数据的项目,从0到有,一路走来,虽然中间磕磕绊绊,所幸走到现在,项目已是快要接近尾声;
项目采用的是elasticsearch搜索引擎用作数据库,主要场景,一个任务需要读取本地文本文件,大概七八十兆大小,八万条,一百五十列左右,读取完立即写入数据库,写入以后,再把每行的值根据另一个表来判断是否重复,也就是去重,去重以后再次插入这张对比的表;8核32g,虚拟机容量调到8g,十个并发内存就溢出了,而且程序运行期间,浏览网站响应时间超久,一直处在等待状态。
监控系统,elasticsearch进程cpu占用率峰值达到400%-500%,java进程也达到了200%左右,如何解决?
分析原因,页面一直在等待响应,很明显cpu的任务分配已经满员,没有多余的空间处理请求,造成cpu爆满的原因是,频繁的读写数据库,并且还要读取本地的文件内容,对内存来说也是一种负担;
第一次解决方案,去重方法加锁,限制并发去重的次数,结果是网页卡死,没有一个完成;
第二次解决方案,加锁,批量去重插入,结果是内存溢出,网页卡死,只有一个完成;
第三次解决方案,加锁,并且每次去重插入后,都让线程休息十秒,全都完成,网页运行流畅;
时间换空间,延长了系统执行的时间,把数据库的压力转移到系统中,将所有等待的内存对象移交到虚拟机中,需要调大虚拟机内存;延长线程休息时间,提升系统的吞吐量;