继上一次全链路压测时,热key框架由于Java低版本(1.8.0_131之前的1.8版本)获取docker内cpu核数有问题,实则获取的是宿主机的核数,造成线程数量过多,压测瞬间cpu达到100%,问题也记录在了另一篇(https://blog.csdn.net/tianyaleixiaowu/article/details/106092060)。后来找到了问题原因,并成功修复了。然后还修改了一些其他的小问题,总体感觉框架比较稳定了。我就自己做了一些性能方面的压测,分别先后使用了4台、8台、16台、32台机器作为压力源,用死循环发送热key消息的方式,测试worker集群的性能,worker分别使用了8核、16核两种规格,数量都是2台,机器都是部署在docker内的。

首先说一下,我写的热key框架文章没有讲前因后果,会显得比较突兀。所以简单解释一下,worker端是一个Java程序,里面是一个netty server,用来接收来自于后端服务集群发来的字符串,然后对字符串进行归并,对相同的字符串数量进行累加,超过一定阈值的字符串,判定为热key,然后通过netty推送给这些后端服务集群。好比一个用户是个爬虫,他的userId=123456,他一直不停地访问后端集群,那么后端就会陆续把这个userId发往worker集群,worker对这个字符串的频率次数进行累加,譬如超过了设定的2秒10次就算爬虫,超过后worker集群就会把这个key推送给所有的后端服务,然后后端服务会记录到自己内存里,之后就可以对这个热key做操作了,譬如禁止他访问相关接口,做限流等等。

所以,这个worker也就是netty server它的性能就至关重要,后端集群每秒发过来或者几万、几十万、几百万个key信息,我就需要得到worker单机的QPS性能,然后根据实际的量来决定开多少个worker机器,worker是可以水平扩展的。

worker内部是使用netty单线程的bossGroup和cpu核数个workGroup,work接收到消息后自己不处理,全部写入到disruptor内,disruptor是200万的bufferSize,disruptor的消费者也是cpu核数个线程,每个线程只处理特定的key(即hash后取余分到消费者线程)。理论上消费的速度即是该应用的QPS。所以我通过反复调节线程数,缓存量等维度来测试性能表现。

之前老是有人抄我文章,到处乱发,还不注明出处。所以版权声明:本文为CSDN博主「天涯泪小武」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://tianyalei.blog.csdn.net/article/details/106327336

来看一下测试过程:

8核8G单机性能表现

worker端是固定2台机器,我用了2台8核8G的,压力机用了4台4核的,代码很简单就是死循环里netty发消息,让worker的netty server来接收并处理。netty server端我做了数量的统计,分别在接收到消息时变量totalReceiveCount数量加1,然后在数量处理完毕的地方totalDealCount加1。

很明显,接收的速率肯定是大于处理的速率的,接收到了没处理肯定是不算QPS的,当然处理的过程也很简单,就是内存计数累加,超过阈值就推送。

我每10秒打印一次接收的数量和处理过的数量,如图

从日志情况来看,每10秒大概处理了160万个key信息,接收量也差不多是160万,也就是基本上接收到的都被处理了,不存在明显的卡顿阻塞。这是单机的情况,两台机器情况是一致的。也就是两台每秒30多万QPS的样子。cpu占有率在70以上,但没有被打满。当前的cpu占用原则上已达到极限,故我们认为8核的单机QPS在16万。

16核单机性能表现

压力源不变,还是每10秒160万个key。

从日志上看,16核机器也是每10秒160万比较平稳,接收量和处理量保持一致。

cpu使用率明显是要比8核的小的多,大概在30%左右。说明在压力源保持不变的情况下,处理端的吞吐量是恒定的,核数多了,相应的只是cpu占用小一些。

16核单机调大线程数后性能表现

随后我把16核机器程序内处理消息的线程数调大一倍,从核数*1个线程,变成核数*2个线程,也就是变成了32个线程,日志如下,发现其实并没有什么变化,甚至有逐步下降的趋势。

原因也很明显,这是cpu密集型的应用,单核单线程处理的应该会更快,因为避免了cpu轮转切换,加大线程数并没有实际意义,如果线程过多,甚至导致性能下降。

我又恢复了16个线程,然后加大了disruptor的bufferSize,原来是200万,改成了1600万,同时将内存从16G加大到32G,大幅调大了JVM的新生代和老年代内存,同样是没什么鸟用,除了大幅增加了yong GC的耗时,其他的什么好处也没有。因为200万完全够用了,接收速率并没有比处理速率快很多,产生不了几百万的差距。

cpu倒是比内存小时占用更多了,有突破40%的趋势,主要还是因为gc时耗时大、耗cpu也高了。所以还是恢复了200万的bufferSize。

加大压力源后16核单机性能表现

之后我不断加大压力源,从4台到8台又到30台4核4G的。

可能是我压力源的死循环写的问题,导致压力源自身的发送量迟迟上不去,所以到worker接收端这边,也只是到了10秒200万的水平,看处理量,也是20万/s的样子。

worker端cpu的使用率也达到了50%。从16万/s的35%cpu到20万/s的50%。处理量和cpu的增长还算同步,但性价比其实不算高了。

在实际生产中,单机能到10万的QPS已经算是比较高的场景了,如果不够用,最好还是加个机器以分担峰值。

总结:该框架单机8核16万QPS,处于够用的状态,实际上netty server最高能处理多少,我也不清楚,没有相关的参考标的。如果能远远大于目前我的这个处理速率,可能是我程序写的不够完善。实际生产中如果量级不大,建议8c8g的机器再根据实际情况水平扩容。如果量级有突发特别密集的不确定因素存在,考虑上16核机器,毕竟16核在20万QPS时,cpu也才50%。上限远远大于8核的。

京东热key探测框架本地压测数据记录,单机(8核)QPS约16万/s,可水平扩展相关推荐

  1. 京东热 key 探测框架新版发布,单机 QPS 可达 35 万

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 300 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 对于大型的分布式系统 ...

  2. 京东毫秒级热key探测框架设计与实践,已完美支撑618大促

    在拥有大量并发用户的系统中,热key一直以来都是一个不可避免的问题.或许是突然某些商品成了爆款,或许是海量用户突然涌入某个店铺,或许是秒杀时瞬间大量开启的爬虫用户, 这些突发的无法预先感知的热key都 ...

  3. 京东开源热key探测(JD-hotkey)中间件单机qps 提升17倍实战

    京东hotkey框架(JD-hotkey)是京东app后台研发的一款高性能热数据探测中间件,用来实时探测出系统的热数据,并将热数据毫秒内推送至系统的业务集群服务器的JVM内存.以下统称为"热 ...

  4. etcd集群搭建和使用中常见的报错信息(热key探测系列教程)

    etcd的下载地址:https://github.com/etcd-io/etcd/releases 当前最新的v3.4.9,我之前用的时候包括目前京东热key线上都是用的3.4.6,下面主要是看一下 ...

  5. 京东热点key探测系统发布,单机 QPS 提升至 37 万

    HotKey在618稳定版0.2版基础上,引入了protobuf序列化方式,并优化了传输对象. worker单机性能从618大促稳定版的20万QPS稳定,30万极限,提升至30万稳定,37万极限.且c ...

  6. 京东热 Key 0.4 发布,单机 QPS 提升至 35 万

    点击▲关注 "爪哇笔记"   给公众号标星置顶 更多精彩 第一时间直达 发布 HotKey在618稳定版0.2版基础上,引入了proto序列化方式,并优化了传输对象. worker ...

  7. 京东热-key-探测框架新版发布,单机-QPS-可达-35-万

    还有一种热点数据的发现机制,那就是实时的做收集,比如在客户端.服务端或者在代理层,都可以对实时数据进行采集,然后进行统计汇总. 达到一定的数量之后,就会被识别为热key 如何解决热key问题 解决热k ...

  8. 分布式环境下对部分热数据(如redis热key,热请求)进行探测,并对探测结果及时同步到各个client实例的JVM内存的方案简述

    可先阅读之前的这篇,有赞的热key探测及缓存方案. 常见场景 突发性的无法预先感知的热点数据请求,或者有阵发性明显热点数据的. 譬如突然大量请求都命中了redis的某个分片,造成该redis卡顿,影响 ...

  9. Redis缓存热key问题常用解决方案

    前言 做一些C端业务,不可避免的要引入一级缓存来代替数据库的压力并且减少业务响应时间,其实每次引入一个中间件来解决问题的同时,必然会带来很多新的问题需要注意,比如上篇文章<数据库与缓存一致性实战 ...

最新文章

  1. zabbix监控搭建
  2. php正则原子,PHP正则表达式---原子
  3. Java并发编程—ThreadLocal用法详解
  4. CTF个人总结指南(更新中)
  5. java中对象的生存期_深入理解Java虚拟机-判断对象是否存活算法与对象引用
  6. 目标识别:如何从人脸图片中扣出眼图,实时人脸人眼检测和识别
  7. 别人家的程序员是如何使用 Java 进行 Web 抓取的? 1
  8. 字段与属性的总结与比较
  9. 增强学习训练AI玩游戏
  10. HDU 3533 Escape (预处理+BFS)
  11. 作品交流:锁相环环路滤波器系数、NCO增益单位、鉴相器输出之间的关系
  12. 【杂文】NOIP2018 蒟蒻自闭记
  13. unity3d 怎么生成网页版_急求unity3D动画简易版制作步骤?
  14. Qt音视频开发12-mpv解码播放
  15. python中的字体设置,pythontkinter设置界面字体样式_修改Python Tkinter中的默认字体...
  16. T flip-flop
  17. windows系统镜像里的×64和×86有什么区别?
  18. API网关:开源Apinto网关-应用管理篇
  19. PMP-11.项目管理的五大过程组
  20. 百度迁徙背后数据瓦片规则分析(自定义图层)

热门文章

  1. 太赫兹高速通信系统前端关键技术
  2. 真机电脑使用 HTTPS 方式登录ensp防火墙USG6000
  3. 软件测试qa等级考核制度,质量管理漫漫谈之也谈QA的考核
  4. 如何把caj文档免费转换成Word格式
  5. java的throw不常用吗_java中的throw与throws的区别
  6. 阿里云大学考试python中级题目及解析-python中级
  7. 标题击中率对SEO排名有多大影响?
  8. 创建LVM逻辑卷并挂载
  9. c语言中creat函数,C语言open和creat函数
  10. 先行发生原则(happens-before)介绍