Qcon Cat性能优化
Cat性能优化
消息树 -> 实施分析 -> 内存报表
问题
CPU密集型任务
GC频繁
报表分析器
appId + ip 进行哈希
数据和线程绑定,无锁绑定
BIO -> NIO 流量不均导致部分队列堆积
加线程 -> 上下文切换 每秒几百万次
解决方案:
队列和线程解耦
NIO模型:selector
队列数据 notify selector
充分利用线程池
合并线程池(CPU个数)
合并selector,实现优先级调度
CPU 90% -> 70%
客户端计算
边缘计算
计算逻辑放在客户端:客户端聚合
- 不变的逻辑
- CPU密集型任务
Transaction计算
遍历messagetree,读取数据 -> 客户端合并messagetree,然后发送到服务端
客户端双队列模型
- messagetree
- 统计指标队列(优先发送)
小结
- 客户端有足够上下文信息,类似计算可放在客户端
Report双缓冲
Cat当前小时报表->内存
其他报表 持久化
数据丢失
- 初始化时map.resize
- 不可移除资源,无用youngGC
- young区移到old区,old区不断扩大
解决方法
- 开始时直接创建要使用的资源,移到old区
- 每次不创建新的资源,复用缓存资源
小结
GC -> young/old区,内存模型
- 少分配内存
- 是否复用内存
字符串优化
内存中创建大量字符串
字符串损耗
1次 new String
2次 new char[]
1次 字符集解码
对数据流lazy,使用时才反序列化
y
string -> byte[]
BytesWrapper对象有损耗
4*4对象头 8字节对齐
byte[] -> 重写hashmap
直接对byte[]的制定位置进行hash,而不是对Objcet继续宁
小结
关注大量使用对象的创建
new string 损耗大
是否可以直接使用byye[]
使用lazy
Object操作的重写,例如hashmap.get(obj) -> get(byte[])
优化思路
CPU
线程模型:上下文、锁竞争
GC
不必要对象创建
缓存重复创建的对象,复用内存(双缓冲,轮换使用)
调优
使用C++托管内存,JVM不进行管理内存
直接内存(堆外)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wshten@gmail.com
文章标题:Qcon Cat性能优化
本文作者:KevinTen
发布时间:2019-10-19, 00:00:00
最后更新:2019-10-22, 09:14:33
原始链接:http://github.com/kevinten10/2019/10/19/Qcon/监控-Cat/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。