热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《第四章单系统高并发优化》之《第五节单机限流》

文章目录《4.5.1单机限流(限流算法及隔离策略》《4.5.2低入侵限流框架设计与实现》《【技术分享】OOM问题解决与优化》old《3.2.4内存爆炸、CPU100%问题分析、定位


文章目录

  • 《4.5.1 单机限流(限流算法及隔离策略》
  • 《4.5.2 低入侵限流框架设计与实现》
  • 《【技术分享】OOM问题解决与优化》
  • old《3.2.4 内存爆炸、CPU100%问题分析、定位、解决》
  • old《3.2.5 网易真实性能调优案例分享》
  • 《4.5.3 编写限流框架中的核心模块》
  • 《【技术分享】CPU100%问题解决与优化》


《4.5.1 单机限流(限流算法及隔离策略》


  • 四种限流算法:计数器、滑动窗口、漏桶、令牌桶

    • 计数器、滑动窗口的讲解可参考https://www.cnblogs.com/linjiqin/p/9707713.html
    • 漏桶:
      在这里插入图片描述
      在这里插入图片描述
    • 34分:令牌桶:

在这里插入图片描述
在这里插入图片描述
此缺点真的存在?《4.5.3 编写限流框架中的核心模块》118:50+有解释,但我认为解释不正确。
Guava RateLimiter原理是令牌桶


  • 隔离策略:线程池、信号量Semaphore

《4.5.2 低入侵限流框架设计与实现》

使用Guava RateLimiter实现限流

7分 DateTimeFormatter与LocalDateTime,是jdk1.8以后线程安全的时间处理类


《【技术分享】OOM问题解决与优化》


  • 在这里插入图片描述

  • 29:30:
    逃逸分析 & 栈上分配 & 标量替换 默认开启>=1.6u23
    逃逸分析默认开启,关闭 -XX:-DoEscapeAnalysis
    对象有动态调整大小的集合时,不会进行栈上分配

  • 55:30+ 防止full GC: 运用Btrace的强大定位功能,发现system.gc被调用
    在这里插入图片描述

  • 83分 分步骤分析瓶颈

  • 136分- 一些OOM场景:
    在这里插入图片描述

  • 146分 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/temp/202006.hprof
    用MemoryAnalyzer工具分析dump文件:在这里插入图片描述

  • 166:45+: 对堆内内存溢出的问题,在测试环境下用gperftools工具:
    在这里插入图片描述


old《3.2.4 内存爆炸、CPU100%问题分析、定位、解决》


  • 垃圾回收器一般用 CMS+ParNewGC?

  • 36:50 监控系统:大众点评的CAT, Zabbix

  • 60:23 禁止显式调用gc方法:
    在这里插入图片描述

  • jcmd
    jmap输出内存快照

  • 104:30 没有分页(或者前端参数不严谨)导致10w+的超长arraylist, OOM


old《3.2.5 网易真实性能调优案例分享》


  • 28:15 某案例中,cpu占用不高但接口访问依然慢,用jstack输出进程堆栈信息后,发现一个sleep的线程:
    在这里插入图片描述
    然后在对应代码中发现了问题:是调用了sleep命令
    在这里插入图片描述
  • 54:35 本机不能直连生产环境的机器,必须通过中转机(或称堡垒机)
  • 87:50 jstack输出信息中的线程的nid,为os中线程pid的16进制形式。通过这种办法来定位那些cpu占用率特别高的线程的代码
    在这里插入图片描述

《4.5.3 编写限流框架中的核心模块》

使用aop的环绕通知来拦截自定义注解,在切面类中使用Guava的令牌桶限流算法:
Controller中的方法:

@GetMapping("sdh")@SdhRateLimiter(permitsPerSecond = 1, timeout = 500, errorMsg = "有错误")public String sdhLimiter() {return "sdh success";}

自定义注解:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface SdhRateLimiter {double permitsPerSecond() default 1;long timeout() default 500;TimeUnit timeUnit() default TimeUnit.MILLISECONDS;String errorMsg();
}

切面类:

@Aspect
@Component
public class SdhRateLimiterAspect {private Map<String, RateLimiter> url_limitMap &#61; new ConcurrentHashMap<>();&#64;Around("&#64;annotation(com.study.current.limiting.aop.SdhRateLimiter)")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {// 获取request,responseHttpServletRequest request &#61; ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();HttpServletResponse response &#61; ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();String url &#61; request.getRequestURI();// 获取自定义注解SdhRateLimiter limiterAnnotation &#61; getSdhRateLimiter(joinPoint);if (limiterAnnotation !&#61; null) {RateLimiter limiter &#61; null;if (!url_limitMap.containsKey(url)) {// 创建令牌桶limiter &#61; RateLimiter.create(limiterAnnotation.permitsPerSecond());url_limitMap.put(url, limiter);System.out.println("<<&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; 请求"&#43;url&#43;",创建令牌桶成功!!!");}limiter &#61; url_limitMap.get(url);// 获取令牌boolean acquire &#61; limiter.tryAcquire(limiterAnnotation.timeout(), limiterAnnotation.timeUnit());if (!acquire) {return limiterAnnotation.errorMsg();}}return joinPoint.proceed();}/*** 获取注解对象** &#64;param joinPoint 对象* &#64;return ten LogAnnotation*/private SdhRateLimiter getSdhRateLimiter(final JoinPoint joinPoint) {Method[] methods &#61; joinPoint.getTarget().getClass().getDeclaredMethods();String name &#61; joinPoint.getSignature().getName();if (!StringUtils.isEmpty(name)) {for (Method method : methods) {SdhRateLimiter annotation &#61; method.getAnnotation(SdhRateLimiter.class);if (annotation!&#61;null && name.equals(method.getName())) {return annotation;}}}return null;}}

《【技术分享】CPU100%问题解决与优化》


  • 伪共享; &#64;Contended

  • 死锁&#xff1a;用jcmd列出进程号&#xff0c;用jstack可查看进程中是否有死锁

  • 55分-&#xff1a; cpu 100%(比如while(true)导致的)
    1&#xff0c;linux命令top,找到进程
    2&#xff0c;找到线程&#xff0c;top -H -P javapid
    3&#xff0c;jstack pid > log.txt

  • 64&#xff1a;14 核心方法的度量工具Metrics

  • 78:24 接口响应很慢
    监控工具arthas
    请求正在执行请求在等待

  • 90:47 【面试题】JUC包你使用过哪些类&#xff1f;在哪些场景使用&#xff1f;

页面打开太慢&#xff0c; 请求太多&#xff0c;浏览器有限制。
优化方案&#xff1a; 多个请求合并到一起。
后台优化&#xff1a;后台收到请求之后&#xff0c;要 执行多个复杂的service、多次数据库查询。多线程异步编程并发查询&#xff0c;用到futrue相关技术。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • Android系统启动过程分析一、Android平台架构首先贴一张Android系统架构图方便理解整个Android架构,这可以让我们从整体上对整个启动流程有个大概认知。可以看出整 ... [详细]
  • 本文涉及源码版本为2.6.9准备工作down一份Vue源码,从package.json入手,找我们需要的代码1、package.json中的scripts,build:nodesc ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
author-avatar
shajc220
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有