线程数

微服务之间的通讯安全(七)-Sentinel入门之热点参数限流及系统限流

旧时模样 提交于 2020-02-12 16:26:59
1、热点参数限流 1.1、何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如: a、商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制 b、用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制 热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效 Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。 1.2、定义资源,我们将获取订单信息设置为资源 1.2、定义规则,我们使用控制台来设置热点参数规则,对获取订单限流为每秒10个请求,但是当第一个参数,也就是id为123是,每秒一个请求。 1.3、测试,快速点击获取订单请求,参数不为123时,正常,但参数为123时,异常    控制台打印如下,可以看到当参数为123时,请求过快,抛出了ParamFlowException,说明我们设置的热点规则生效了。 2、系统限流   Sentinel不仅仅支持资源层面的限流、对整个应用的入口流量也可以做出限制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS

Jmeter的Html报告汉化及解析

蓝咒 提交于 2020-02-12 00:09:25
Jmeter的Html报告汉化及解析 Jmeter报告汉化 经常有人提出Jmeter生成的html报告都是英文的看不懂,能不能给解释一下,一般提出这种问题的人要么是懒,要么是对性能测试不是很了解(隔行如隔山嘛,可以理解)。所以我专门整理了Jmeter报告的汉化模板,有兴趣的可以下载。当然不可能所有的内容都汉化,所以以下我会对各项指标再做一下说明。 一、html模板汉化 专门准备了Jmeter 4.x 和Jmeter5.x 两套汉化模板: https://gitee.com/smooth00/jmeter-cn-report-template 使用方法也简单,下载我给的模板,将report-template目录替换apache-jmeter-x.x\bin\report-template目录即可,新生成的报告就被汉化了。汉化后的效果: 二、测试报告解析 1、Dashboard(概述面板) (1)Test and Report informations(测试和报告信息) Source file ---- 生成报告的源文件 Start Time ---- 开始时间 End Time ---- 结束时间 (2)APDEX (应用性能指标),计算每笔交易APDEX的容忍和满足阈值基于可配置的值,范围在 0-1 之间,1表示达到所有用户均满意。 Apdex:应用程序性能指标(0~1)

线程池的原理和连接池的原理

亡梦爱人 提交于 2020-02-11 01:19:37
一、 线程池的原理 : 线程池,究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下: 先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。 可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题——性能! 就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请 求并发数超 过100,如果为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。 二、 数据库连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象)

java tomcat jvm优化

假装没事ソ 提交于 2020-02-08 02:30:17
tomcat执行器(线程池)的优化 tomcat默认是没有启用线程池的,在tomcat中每一个用户请求都是一个线程,所以我们可以使用线程池来提高性能。tomcat的前段有一个调度线程,会将用户的请求放入线程池中,一定时间后线程池中的用户请求任务就变为工作线程。 1、开启线程池:打开server.xml中关于线程池的配置 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="600" minSpareThreads="10"/> 重要参数说明: name :共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None; namePrefix :在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-; maxThreads :该线程池可以容纳的最大线程数。默认值:200; maxIdleTime :在tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。 minSpareThreads

【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?

自古美人都是妖i 提交于 2020-02-04 07:53:09
原文链接: http://www.51testing.com/html/49/n-3721249.html 前言 当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?locust?还是loadrunner呢? 今天,笔者将根据自己使用经验,针对jmeter、locust、wrk和loadrunner常用的性能测试工具进行简单介绍和对比。首先,四者基本对比图: . loadrunner jmeter locust wrk 分布式压力 支持 支持 支持 不支持 单机并发能力 低 低 高 低 并发机制 进程/线程 线程 协程 线程 开发语言 C/Java Java Python C 报告与分析 完善 简单图标 简单图表 简单结果 授权方式 商业收费 开源免费 开源免费 开源免费 测试脚本形式 C/Java GUI Python C 资源监控 支持 不支持 不支持 不支持 由于loadrunner为商业收费模式,对于公司级测试使用而言涉及到授权问题,因此,本文暂不对loadrunner进行详细讨论。 wrk wrk是轻量化的http性能测试工具,采用线程+网络异步IO模型,网络异步IO可以使得系统使用很少的线程模拟大量的网络连接以增大并发量、提高压力。 优点 操作简单、易于使用, 使用方式例如: ./wrk -c 1000 -t 8 -d 10s http:/

大型网站技术架构演进与性能优化(五) 五、应用程序优化:代码级优化

∥☆過路亽.° 提交于 2020-02-04 00:52:22
五、应用程序优化:代码级优化 1、优化思路 做优化首先要知道从哪里入手,也就是要知道系统的瓶颈在哪里。一个请求会消耗很多资源:CPU、内存、网络、磁盘等。这些资源中总会有一个到达瓶颈,只有优化最先到达瓶颈的资源才会产生效果。 压测工具 Java有两个经典的代码热点分析工具:JProfiler和Yourkit Apache ab压测工具 这些具体使用参考文档。 发现瓶颈 Jstack,可以看看当前的Java线程 压测请求不是本机,要注意TCP连接数,可以使用netstat命令 检查网卡是否达到了瓶颈 I/O也可能成为瓶颈 2、影响性能的因素 所谓提升性能,通常意义上就是提升系统的QPS,即提升系统的吞吐量。 要提升系统的QPS,首先要了解QPS与RT的关系。 QPS与性能的关系 支持的线程数越多QPS越高,这只在一定范围内适用。 影响线程数量的两个主要因素是CPU数量和线程等待时间。 对于大部分的Web系统,RT(response tiime)一般由CPU执行时间和线程等待时间(远程RPC调用、I/O等待、sleep、wait等)组成。 减少CPU的执行时间对QPS有实质的提升,减少线程的等待时间对QPS提升不明显。 设置最佳线程数 所谓最佳线程数是指消耗完服务器的瓶颈资源的一个临界线程数量。 最佳线程数=[(线程等待时间+线程CPU时间)/线程CPU时间]/CPU数量。

Java 基础流程图、架构图

爱⌒轻易说出口 提交于 2020-02-03 20:00:51
Java 基础流程图、架构图 1. Spring 的生命周期 流程: 首次容器启动后,对 bean 进行初始化 按照 bean 的定义,注入属性 检测该贵姓是否实现了 xxxAware 接口,并将相关 xxxAware 实力注入给 bean,如 BeanNameAware 等 以上步骤,bean对象已正确构造,通过实现 BeanPostProcessor接口,可以再进行一些自定义方法处理。如:postProcessBeforeInitialzation BeanPostProcessor的前置处理完成后,可以实现postConstruct,afterPropertiesSet,init-method等方法, 增加我们自定义的逻辑 通过实现BeanPostProcessor接口,进行postProcessAfterInitialzation后置处理 接着Bean准备好被使用啦。 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法 通过给destroy-method指定函数,就可以在bean销毁前执行指定的 2. TCP 三次握手,四次握手 三次握手: 第一次握手(SYN=1, seq=x),发送完毕后,客户端进入 SYN_SEND 状态 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后

剑指Offer(锁)——Java线程池

◇◆丶佛笑我妖孽 提交于 2020-01-31 16:53:20
在Web开发中服务器需要接受并处理请求,因此会为一个请求分配一个线程去处理,如果并发的请求数量很大但是请求的时间很短,那么就会频繁的创建和销毁线程,造成CPU的隐患,这样会降低系统的效率。 为了解决上述问题,可以利用Executors创建不同的线程池满足不同场景的需求目前提供了五种创建线程池的方法: newFixedThreadPool(int nThreads) :指定工作线程数量的线程池; newCachedThreadPool() :处理大量短时间工作任务的线程池; (1)试图缓存线程并重用,当无缓存线程可用的时候,就会创建出新的工作线程 (2)如果线程限制的时间超过阈值,则会被终止并移除缓存 (3)系统长时间闲置的时候,不会消耗什么资源 newSingleThreadExecutor() :创建唯一的工作者线程去执行任务,如果线程异常结束另外一个线程去取代; newSingleThreadScheduledExecutor() 与 newScheduledThreadPool(int corePoolSize) :定时或者周期性的工作调度,两者的区别在于是单一线程还是多线程; newWorkStealingPool() :内部创建ForkJoinPool、利用work-stealing算法并行的处理任务,不保证处理顺序。 为了了解第五条所说的ForkJoinPool

weblogic调优

点点圈 提交于 2020-01-29 13:42:29
weblogic调优 发表者: java123 注:在下面做的介绍都是以 Weblogic8.1 为例的,其它版本的 Weblogic 可能会有些许不同。 1) 设置 JAVA 参数; a) 编辑 Weblogic Server 启动脚本文件; l BEA_HOME\user_projects\domains\domain-name\startWebLogic.cmd(startWebLogic.sh on Unix) l BEA_HOME\user_projects\domains\domain-name\startManagedWebLogic.cmd(startManagedWebLogic.sh on Unix) b) 编辑 set JAVA_OPTIONS 命令,如: set JAVA_OPTIONS=-Xms 256m –Xmx 256m ; c) 保存,重启即可。 注:在 WebLogic 中,为了获得更好的性能, BEA 公司推荐最小 Java 堆等于最大 Java 堆。 2) 开发模式 vs. 产品模式; 开发模式和产品模式的一些参数的默认值不同,可能会对性能造成影响,下面是对性能有影响的参数列表: 参数 开发模式默认值 产品模式默认值 Execute Queue: Thread Count 15 threads 25 threads JDBC

java线程池ThreadPoolExecutor

元气小坏坏 提交于 2020-01-29 03:38:47
使用线程池的好处: 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 线程并发数量过多,抢占系统资源从而导致阻塞 对线程进行一些简单的管理 1、ThreadPoolExecutor的一个构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.corePoolSize = corePoolSize; this