4.实时推荐系统性能优化-GC排查优化

经过上节匹配优化后,通过对结果集分组,降低数据量级,使得系统接口访问量得到了显著的提升。但此时需要注意的是,我们通过业务区分降低数据量级并没有优化系统代码运行性能。由此节开始,我们来进行系统性能优化。首先是在系统运行时,通过监控发现运行时系统GC频繁。所以详细分析了下系统中存在的GC问题。

继续阅读4.实时推荐系统性能优化-GC排查优化

3.实时推荐系统性能优化-匹配优化

(1)流程优化

上节说到在实时匹配中,map.putAll被丢入了大量数据导致。由于HashMap这里我们无法得到实质的性能优化,所以只能从业务流程上来进行优化。

我们先来看一下原匹配流程

优化后匹配流程

这里将map.putAll对于结果处理进行前置,通过配置后台更新过配置后,系统先将所有结果集处理完成后,丢入内存。这里对于系统有两点显著提升。

1.系统在匹配时无需对map进行重复计算。节约系统性能开销。

2.系统匹配时无需创建大量map对象,系统young gc次数显著降低。

(2)业务分组

上述优化中,虽然解决了系统中map对象重复多次操作问题。但是对于系统中大量配置的奖品,O(n)复杂度是避免不了的。以此带来的问题是系统使用越久、奖品越多,运算性能将逐渐降低。

解决此问题有两种方式

1.采用rate算法,涉及到系统匹配逻辑重构。

2.奖品分组,降低O(n)中n值得取值范围。

由于时间有限,需赶在618大促前达到预期性能。在刚接手系统随即对系统进行重构难度大、风险高。而且人手有限,整个项目只有我一个人,即要跟进业务需求上线,又需进行系统性能优化。所以这里采用第二种方案,对奖品根据发奖通道进行分组。

尽力保证单一场景下奖品数量在50个左右。相较于无分组时在数千奖品中进行匹配,此优化可以对系统性能带来大幅提升。复杂度问题得解决,使用rate算法是治本方案。在此我们两步走,先满足大促峰值性能,再进行提升优化。

2.实时推荐系统性能优化-系统性能瓶颈分析

很多人拿到系统的第一步,估计就是直接看代码,找瓶颈点了。其实这样的效率并不高。很多系统结构复杂,直接修改代码很有可能结果时改了一片代码,最后进行性能测试发现几乎没用提升。这里我们使用jProfiler进行代码性能分析。

继续阅读2.实时推荐系统性能优化-系统性能瓶颈分析

1.实时推荐系统性能优化-背景

18年底时,接手了实时推荐系统。系统设计之初为了进行千人千面,精准营销活动。对用户实时推送广告等消息。由于在经历了18年双11时,系统性能瓶颈,无法满足实时运算需求,导致整体实时推荐服务被降级。所以在接手系统后,必须对系统进行性能优化改造。

此次优化使得系统单机性能由qps30提升至qps300,使得300台服务器集群下可以在大促期间满足qps6万的预期目标。

继续阅读1.实时推荐系统性能优化-背景

快速开发环境搭建(docker + portainer)

为什么使用docker

  • 环境隔离困难,易出错

最开始做开发时,会在本机上也部署一些开发所需的组建,比如(mysql、redis、mq等),这样做虽然快速简单,但是一但安装环境出现问题,比如环境、参数修改错误、软件覆盖安装、各版本兼容性问题等,想要完全恢复到安装前的环境非常困难,有时甚至要浪费一上午来调整环境。

  • 环境一致性困难

自己部署的环境很难与测试环境、生产环境完全保持一致,容易产生本机运行良好,但是一上测试环境、生产环境运行出错。

  • 环境迁移困难

自己部署好的环境无法与别人分享,环境搭建时需要重复部署,浪费时间且容易出现环境不一致的问题。

继续阅读快速开发环境搭建(docker + portainer)

在集群环境下,偶尔数据无法取出的问题解决

最近在用户使用系统时,出现偶尔数据无法取出,但有时又正常的奇怪现象。刚开始以为是用户操作是session超时等问题,后来排查代码一直也没有发现问题。就搁置没有处理。

今天在部署新系统时,采用灰度发布的形式。在上线部分机器后查看日志,发现了一些空指针异常。看异常抛出的位置,感觉跟前段时间的问题应该相关。

继续阅读在集群环境下,偶尔数据无法取出的问题解决

illegally attempted to associate a proxy with two open Sessions

最近在做struts2批量上传的时候,遇到了hibernate出现

org.springframework.orm.hibernate3.HibernateSystemException: illegally attempted to associate a proxy with two open Sessions;的问题。并且只能正确保存1个提交对象,其余提交的对象均会保存。
openSessions

继续阅读illegally attempted to associate a proxy with two open Sessions

OS X 在QQ语音时,背景音变小的解决方法

用了近两年的OS X的QQ,一直被在QQ语音或视频时不能看视频或听歌所困扰。后来终于在网上搜到了解决方法:
1. 打开QQ,但是不要视频,或者挂断现有的视频连接。
2. 打开终端,输入
printf “p *(char*)(void(*)())AudioDeviceDuck=0xc3\nq” | lldb -n QQ
3. 然后在视频时背景音量就正常了