设为首页 收藏本站
查看: 1478|回复: 0

[经验分享] Solr性能优化之QTime的误区

[复制链接]

尚未签到

发表于 2016-12-16 08:37:48 | 显示全部楼层 |阅读模式
  最近公司的其中的一个集群的solr出现了一个比较奇怪的事情,先简单说说以下的情况
  机器A是前端的逻辑应用
  机器B是具体一个 solr 应用
  很通用的方式都是从机器A向机器B的 solr 拿搜索结果并呈现给前端,机器A与机器B处于千兆局域网络。
  前端的同事反应有时候, solr 返回的 QTime 很快,但实现搜索出来的结果时间却很久,我大概画了一个图,让大家更明白。
DSC0000.jpg

  如上图所示,前端的同事在请求 solr 的方法前后加了时间计算,就是请求的所有时间,再前去 solr 反回的 QTime ,则就是网络的响应时间了。前端的同事发现,有些情况下,当然不是特定的条件,QTime 返回一般只就 100 ms 到 200 ms ,但网络的响应时间却比QTime 大很多,经常是1秒甚至更长。
  找寻问题的根源:
  1.  基于这一个情况,当时我认为是内部的网络有问题,但通过机器之前的同步文件,速度也非常快,似乎都不存在过多的网络延时。
  2. 因为 solr  那端是用了 tomcat ,当时有想过是否 tomcat 的连接池原因?通过更改 server.xml 的参数,问题似乎依然,但如果直通访问 tomcat 上的网页速度非常快,也看不出什么任何延时。
  3. 会不会是 linux 主机的 sokcet 连接数,参数等影响了?因为机器安装上去后,我是看到并没有对 /etc/syscotl.conf 的参数做调整过,机器A与机器B也调整过了,但问题依旧。
  4. 因为前端的机器A是用了 httpclient 的,把 httpclient 的连接池,参数等也调整过,问题依旧,最后把 httpclient 完全去掉了,改用了普通的 socket ,效果有一点点的改善,但不明显。
  最后似乎都是无计可施了。。。。,按字面的理解,QTime 就是搜索的总用时。
  在查看代码的情况下,在各搜索模块的 component 的 prepare , process 的时间都非常快,与QTime 很符合,当时我认为,搜索的过程就这样子了,时间很快哦,难道是把搜索的结果写回机器A时很久了?
  最后在自己最不认为是问题的代码块中添加了一个时间检查,如下:
DSC0001.jpg

  就从表面上来说,这段代码是所有的搜索操作都完成后,需要把搜索的结果 solrRsp 写到网络并回传到机器A的前端去,但这个时间耗用的时间与响应时间非常吻合,看来时间就是耗用在这个了,而且一个偶尔的发现,如果把solr 参数 rows=0 的时候,发现所有的响应时间非常短,都在几毫秒完成了。但就算 rows=1 也好,响应时间都有几十毫秒,这里我突然间意识到,在里面,肯定还有读写硬盘的操作并非仅仅是把结果写回网络中。
  最后深入看代码后,发现了,其实 solrRsp 只拿到 docId, 具体的文档的内容,还需要通过 docId 从硬盘中读回来。正正就是这段时间损耗了,因为 QTime 在这之前已经结束了,并没有算上这一部分时间,导致了误解了 QTime 的与网络响应时间之前的关系。以 BinaryResponseWriter 为例子,时间都用在以下的代码里面的
DSC0002.jpg

  因为群集中的索引比较大,一份索引约20G左右,这机器总有4份,约80G左右这时读取索引的内容反而成了瓶颈了。
   解决的方案:
  一个能缓解这种情况的方法就是在 solrconfig.xml 中,把 docsCache 加大到100W甚至更大,这个只能对于之前读取过的 doc 才能有效,所以这种方式只能是暂时缓解没有根本解决。
  一个比较彻底解决的是,在启动的过程,通过 index.termEnum 把索引的所有相关的内容都采用延时加载到一个 数组中,一个 2000W ,只要内存有16G以上那并不是什么难题。对于这么大的的数据量,肯定是只有一份索引在添加新的索引,其他的索引保持不变,就算有删除了数据,也不会 optimize ,所以这种方式还是能根本上解决以上的问题。
  欢迎转载,请注册出处 http://kernaling-wong.iyunv.com/blog/2017985

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314922-1-1.html 上篇帖子: solr使用dismax的一些record 下篇帖子: Solr如何避免查询条件过多异常
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表