`
wbj0110
  • 浏览: 1604258 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

一次搜索服务优化笔记

阅读更多

测试环境

CentOS release 5.5系统,内核版本:Linux version 2.6.18-194.el5

Intel(R) Xeon(R) CPU E5640 @ 2.67GHz 16CPU64G内存;千兆网卡

300w用户数据,大概1G的索引文件。lucene 3.6.1

基于lucene实现的搜索服务,索引文件是文件类型的,DirectoryMMapDirectory.

 

目的

只对搜索的rpc接口进行压力测试

 

条件

100个搜索任务(搜索参数随机组合)同时进行压力测试,发现tps大概是400/s左右,从编码上优化,将索引文件拆解为10sub index,使用MultiReader,然后由10 sub IndexReader对应每个sub index,通过多线程完成每次搜索,结果发现搜索效率提升不大。

通过 sar -n / iostats 监控发现磁盘读写利用率为0%,也就说瓶颈不在磁盘io上。

同时cpu利用率/jvm垃圾回收都正常,搜索服务器的工作线程从1k提升到1.5ktps有些许提升,效果不大,而且cpu load大概在7-10左右。

将压力测试请求任务提升到3001000之后,请求响应的平均时间、最大时间逐渐增大至不可接受的时间。而磁盘iocpu load基本没有变化,jvm gc频率增大。也就是说每次搜索需要大量的cpu运算,在资源足够的情况下,cpu运算和线程竞争的瓶颈是无法避免的。

根据网上提供的解决方案:

1.通过FieldFilterCache的方式来缓存某个字段的搜索结果,然后通过子搜索条件来从cache中查找数据,但实际中发现lucene是将FieldFilterCache和子搜索结果做交集,效率更差,而且FieldFilterCache的数据是放在WeakedHashMap,数据如果被gc回收了,效率就更慢了。放弃此种方案

2.减少Collector返回的totalHit数据,lucene很实诚,每次搜索都会返回符合搜索条件的精准数据,这导致全索引扫描,而实际业务中只需要100条数据,不需要太精确的totalHit。故考虑自定义Collector实现,后来发现时间、精力、能力已经不允许在lucene3.6中自定义Collector实现了---项目要上线了。放弃此种方案

 

 

调整

根据实际业务情况调整:

用户的搜索条件基本固定,而且产品人员要求在翻页的情况下要保证数据的顺序是不变的,即从第二页到第N页然后在回退到第二页,第二页的数据不能因为索引的更新导致展现的数据不一致,考虑的解决方案:加缓存。因为搜索结果是按照时间排序,使用redis SortedSet来存储搜索结果。缓存架构如下:

优化

用户级别缓存:搜索条件+用户个性设置的结果。数据是从 搜索条件缓存中计算出来的。而且这2级缓存过期时间不同,用户级缓存可以被用户的特定请求主动穿透,过期时间设置比较久,搜索级缓存时间比较短,是为了避免用户级缓存被穿透后,对造成请求风暴,压力过大。

300线程,1000个搜索条件随机请求,tps大概在4k-8k/s。压力线程增加到1ktps依然在4k-8k/s。通过 sar命令监控网卡流量,大概在20m-30m之前浮动,未达到千兆网卡的实际极限传输速度( 125MB/s).在测试工程中,通过java方法级别的监控工具发现rpc调用的网络io没有write block,这也情况也证明网络并非瓶颈。

关于JVM参数,因为使用的是jdk6最新的版本,新加了2个参数: -XX:+UseCompressedOops,来减少64位机中新增对象句柄占用的空间。-XX:+UseNuma,根据Numa架构分配eden区空间,据Oracle官方文档介绍,能够提升gc并行回收的效率(32位机:30%提升,64位机:40%提升)。参考:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html

 

总结

性能测试要关注测试环境的网络IO、磁盘IOCPU利用率、内存利用率。如果这些硬件环境没有达到极限,就是代码存在瓶颈,在我开始做压力测试的时候,将搜索服务工作线程默认设置为5个,导致tps极低,后来经过分析发现工作线程数量限制导致的。。。而且做优化需要根据实际的业务情况来进行才能事半功倍,pscache真是web应用在高并发情况下保证响应的利器。

 

不足

没有通过java profile详细监控每个线程的响应时间(jprofile/yourKit)、竞争的原因

 

摘自互联网

分享到:
评论

相关推荐

    斯坦福大学cs231n课堂笔记翻译 最优化笔记

    斯坦福大学CS231n课程中的最优化笔记涵盖了深度学习中寻找最优参数集的过程,这是通过最小化损失函数来实现的。损失函数是衡量模型预测与实际数据之间不一致程度的一种方式,其目的在于通过调整参数来减少预测误差。...

    mysql优化笔记.doc

    MySQL数据库的优化是一个涵盖多个方面的复杂任务,旨在提高性能、减少资源消耗并确保系统的稳定性。以下是一些关键的优化策略: 1. **表的设计合理化(3NF)**: - **第一范式(1NF)**:确保每一列都具有原子性,...

    优化笔记 v1.0

    优化笔记为一款小型绿色软件,可以自由拷贝到任何机器上使用,所用数据库为Access,您可以通过按装微软Office办公软件里的Aceess自由打开查看修改复制里面的数据,无需担心你的日记被破坏或丢失。数据库存放在软件根...

    最优化原理基础入门-笔记.zip

    这篇笔记旨在为初学者提供一个基础的最优化理论入门,帮助理解并应用这些方法解决实际问题。 首先,从《1 Introduction.pdf》开始,我们可以了解到最优化原理的基本定义和目的:找到一个函数的极值点,即最小值或...

    dsml机器学习优化课程笔记

    梯度下降法是一种常用的优化算法,课程笔记中对梯度下降法进行了详细的讲解,包括了梯度下降法的定义、搜索方向、步长选择等方面的内容。此外,课程笔记还提供了梯度下降法的实现代码,帮助学生更好地理解和应用梯度...

    映象笔记安装包下载

    映象笔记,又名Evernote,是一款功能强大的跨平台笔记应用,它允许用户在各种设备上创建、存储、同步和管理他们的笔记。...通过这次下载,用户将能够享受到最新稳定版的映象笔记服务,提升自己的知识管理和工作效率。

    上交大最优化方法笔记 (18讲) (极简)

    2. **二次可微性**:在讨论最优化问题时,通常假设目标函数是两次连续可微的,这意味着在某个区域内,函数的梯度和Hessian矩阵都存在且连续。这是确保二阶条件成立的基础。 3. **局部最小点和全局最小点**:局部最...

    淘宝搜索优化(SEO)珍贵笔记

    大家都有目共睹淘宝七月八号改变规则后引发了不少争议,后面所引起的众多卖家“围攻”淘宝之事也不仅发生过一次了,还有的要求恢复时间排名机制。而淘宝却 给出此次规则调整,旨在提升消费者体验,提高搜索精准度。...

    SEO课程教程笔记、SEO、搜索引擎优化

    SEO,全称搜索引擎优化,是一种通过改进网站的内容、结构和链接策略来提高其在搜索引擎自然搜索结果中的排名的技术。本文将深入探讨SEO的关键概念,包括PageRank算法、影响PR值的因素,以及域名和主机对SEO的影响。 ...

    CS231n课程笔记翻译:最优化笔记(上) - 知乎专栏1

    这篇笔记主要探讨了最优化这一关键概念,它是机器学习模型训练的核心部分,特别是针对图像分类任务。最优化的目标是找到一组参数,使损失函数达到最小值,从而提高模型的预测准确性。 首先,我们要了解评分函数。在...

    陆吾生华东师大讲义笔记

    此外,步骤3中的线搜索(line search)过程是求解一维优化问题的一个重要环节。 接下来,讲义中介绍了相关的符号和基础概念: - x:一个包含n个变量的列向量。 - f(x):目标函数。 - g(x):目标函数的梯度向量,...

    近期SEO笔记整理

    9. **持续监控和调整**:SEO并非一次性任务,而是持续的过程。通过使用工具进行关键词排名跟踪、分析网站分析数据、定期审计,以及对算法更新的敏感,可以不断优化策略。 10. **算法更新**:谷歌和其他搜索引擎经常...

    大数据服务框架学习笔记.zip

    接下来,Flink是另一种实时流处理框架,它在处理连续数据流时提供了低延迟和精确一次的状态一致性保证。Flink的设计目标是同时支持流处理和批处理,实现从数据湖到数据管道的无缝集成。 除了这三个核心框架,大数据...

    笔记软件源码

    【笔记软件源码】是一款专为用户打造的高效、便捷的笔记工具的源代码,它提供了丰富的功能,帮助用户记录、整理和管理个人知识库。源码是软件开发的基础,通过对源码的学习和理解,开发者可以深入掌握软件的设计理念...

    PHP自学笔记

    18页面静态化文件介绍了如何将动态网页转化为静态HTML,以提升网站的SEO(搜索引擎优化)效果和加载速度。 21Nginx与服务器集群文件将教授如何配置和使用Nginx作为Web服务器,以及如何搭建和管理服务器集群,这对于...

    笔记本保护珍藏

    **每周进行一次磁盘碎片整理:** - 通过“开始”菜单找到“所有程序”>“附件”>“系统工具”>“磁盘碎片整理程序”; - 选择需要整理的磁盘分区(如C盘),点击“碎片整理”; - 在清理过程中,可以看到磁盘的当前...

    Jenkins笔记笔记笔记

    - **持续集成(Continuous Integration, CI)**:一种软件开发实践,要求开发人员频繁地(通常每天至少一次)将他们的代码更改合并到共享主分支中,通过自动化的构建和测试来快速发现错误。 - **Jenkins工作流**:...

    springcloud微服务技术栈-个人笔记文档(基础篇)

    SpringCloud 是一套完整的微服务解决方案,它为开发者提供了构建分布式系统所需的工具,包括服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等。...

    联想笔记本V470 BIOS 43CN45WW

    BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,它负责初始化和管理硬件设备,以及提供操作系统启动时的基本服务。BIOS的更新通常是为了修复已知问题、提高系统稳定性、增加新功能或优化硬件兼容性。 ...

    笔记本USB-串口驱动

    这一过程可能需要尝试多次,直到找到最合适的驱动版本。 4. **端口设置与优化**:安装完成后,用户可根据需要在设备属性的高级设置中调整端口号(例如,将其更改为COM3)。这一步骤有助于避免与其他串口设备的端口...

Global site tag (gtag.js) - Google Analytics