测试环境
CentOS release 5.5系统,内核版本:Linux version 2.6.18-194.el5
Intel(R) Xeon(R) CPU E5640 @ 2.67GHz 16CPU;64G内存;千兆网卡
300w用户数据,大概1G的索引文件。lucene 3.6.1
基于lucene实现的搜索服务,索引文件是文件类型的,Directory为MMapDirectory.
目的
只对搜索的rpc接口进行压力测试
条件
100个搜索任务(搜索参数随机组合)同时进行压力测试,发现tps大概是400/s左右,从编码上优化,将索引文件拆解为10个sub index,使用MultiReader,然后由10 sub IndexReader对应每个sub index,通过多线程完成每次搜索,结果发现搜索效率提升不大。
通过 sar -n / iostats 监控发现磁盘读写利用率为0%,也就说瓶颈不在磁盘io上。
同时cpu利用率/jvm垃圾回收都正常,搜索服务器的工作线程从1k提升到1.5k对tps有些许提升,效果不大,而且cpu load大概在7-10左右。
将压力测试请求任务提升到300、1000之后,请求响应的平均时间、最大时间逐渐增大至不可接受的时间。而磁盘io、cpu 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。压力线程增加到1k,tps依然在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、磁盘IO、CPU利用率、内存利用率。如果这些硬件环境没有达到极限,就是代码存在瓶颈,在我开始做压力测试的时候,将搜索服务工作线程默认设置为5个,导致tps极低,后来经过分析发现工作线程数量限制导致的。。。而且做优化需要根据实际的业务情况来进行才能事半功倍,ps:cache真是web应用在高并发情况下保证响应的利器。
不足
没有通过java profile详细监控每个线程的响应时间(jprofile/yourKit)、竞争的原因
摘自互联网
相关推荐
斯坦福大学CS231n课程中的最优化笔记涵盖了深度学习中寻找最优参数集的过程,这是通过最小化损失函数来实现的。损失函数是衡量模型预测与实际数据之间不一致程度的一种方式,其目的在于通过调整参数来减少预测误差。...
MySQL数据库的优化是一个涵盖多个方面的复杂任务,旨在提高性能、减少资源消耗并确保系统的稳定性。以下是一些关键的优化策略: 1. **表的设计合理化(3NF)**: - **第一范式(1NF)**:确保每一列都具有原子性,...
优化笔记为一款小型绿色软件,可以自由拷贝到任何机器上使用,所用数据库为Access,您可以通过按装微软Office办公软件里的Aceess自由打开查看修改复制里面的数据,无需担心你的日记被破坏或丢失。数据库存放在软件根...
这篇笔记旨在为初学者提供一个基础的最优化理论入门,帮助理解并应用这些方法解决实际问题。 首先,从《1 Introduction.pdf》开始,我们可以了解到最优化原理的基本定义和目的:找到一个函数的极值点,即最小值或...
梯度下降法是一种常用的优化算法,课程笔记中对梯度下降法进行了详细的讲解,包括了梯度下降法的定义、搜索方向、步长选择等方面的内容。此外,课程笔记还提供了梯度下降法的实现代码,帮助学生更好地理解和应用梯度...
映象笔记,又名Evernote,是一款功能强大的跨平台笔记应用,它允许用户在各种设备上创建、存储、同步和管理他们的笔记。...通过这次下载,用户将能够享受到最新稳定版的映象笔记服务,提升自己的知识管理和工作效率。
2. **二次可微性**:在讨论最优化问题时,通常假设目标函数是两次连续可微的,这意味着在某个区域内,函数的梯度和Hessian矩阵都存在且连续。这是确保二阶条件成立的基础。 3. **局部最小点和全局最小点**:局部最...
大家都有目共睹淘宝七月八号改变规则后引发了不少争议,后面所引起的众多卖家“围攻”淘宝之事也不仅发生过一次了,还有的要求恢复时间排名机制。而淘宝却 给出此次规则调整,旨在提升消费者体验,提高搜索精准度。...
SEO,全称搜索引擎优化,是一种通过改进网站的内容、结构和链接策略来提高其在搜索引擎自然搜索结果中的排名的技术。本文将深入探讨SEO的关键概念,包括PageRank算法、影响PR值的因素,以及域名和主机对SEO的影响。 ...
这篇笔记主要探讨了最优化这一关键概念,它是机器学习模型训练的核心部分,特别是针对图像分类任务。最优化的目标是找到一组参数,使损失函数达到最小值,从而提高模型的预测准确性。 首先,我们要了解评分函数。在...
此外,步骤3中的线搜索(line search)过程是求解一维优化问题的一个重要环节。 接下来,讲义中介绍了相关的符号和基础概念: - x:一个包含n个变量的列向量。 - f(x):目标函数。 - g(x):目标函数的梯度向量,...
9. **持续监控和调整**:SEO并非一次性任务,而是持续的过程。通过使用工具进行关键词排名跟踪、分析网站分析数据、定期审计,以及对算法更新的敏感,可以不断优化策略。 10. **算法更新**:谷歌和其他搜索引擎经常...
接下来,Flink是另一种实时流处理框架,它在处理连续数据流时提供了低延迟和精确一次的状态一致性保证。Flink的设计目标是同时支持流处理和批处理,实现从数据湖到数据管道的无缝集成。 除了这三个核心框架,大数据...
【笔记软件源码】是一款专为用户打造的高效、便捷的笔记工具的源代码,它提供了丰富的功能,帮助用户记录、整理和管理个人知识库。源码是软件开发的基础,通过对源码的学习和理解,开发者可以深入掌握软件的设计理念...
18页面静态化文件介绍了如何将动态网页转化为静态HTML,以提升网站的SEO(搜索引擎优化)效果和加载速度。 21Nginx与服务器集群文件将教授如何配置和使用Nginx作为Web服务器,以及如何搭建和管理服务器集群,这对于...
**每周进行一次磁盘碎片整理:** - 通过“开始”菜单找到“所有程序”>“附件”>“系统工具”>“磁盘碎片整理程序”; - 选择需要整理的磁盘分区(如C盘),点击“碎片整理”; - 在清理过程中,可以看到磁盘的当前...
- **持续集成(Continuous Integration, CI)**:一种软件开发实践,要求开发人员频繁地(通常每天至少一次)将他们的代码更改合并到共享主分支中,通过自动化的构建和测试来快速发现错误。 - **Jenkins工作流**:...
SpringCloud 是一套完整的微服务解决方案,它为开发者提供了构建分布式系统所需的工具,包括服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等。...
BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,它负责初始化和管理硬件设备,以及提供操作系统启动时的基本服务。BIOS的更新通常是为了修复已知问题、提高系统稳定性、增加新功能或优化硬件兼容性。 ...
这一过程可能需要尝试多次,直到找到最合适的驱动版本。 4. **端口设置与优化**:安装完成后,用户可根据需要在设备属性的高级设置中调整端口号(例如,将其更改为COM3)。这一步骤有助于避免与其他串口设备的端口...