线程数

扛住阿里双十一高并发流量,Sentinel是怎么做到的?

有些话、适合烂在心里 提交于 2019-12-01 19:54:33
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案 Sentinel 功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源不够,不足以应对大量请求,对系统按照预设的规则进行流量限制或功能限制 服务熔断 :当调用目标服务的请求和调用大量超时或失败,服务调用方为避免造成长时间的阻塞造成影响其他服务,后续对该服务接口的调用不再经过进行请求,直接执行本地的默认方法 服务降级 :为了保证核心业务在大量请求下能正常运行,根据实际业务情况及流量,对部分服务降低优先级,有策略的不处理或用简单的方式处理 服务降级的实现可以基于人工开关降级(秒杀、电商大促等)和自动检测(超时、失败次数、故障),熔断可以理解为一种服务故障降级处理 2 为什么需要限流降级 系统承载的访问量是有限的,如果不做流量控制,会导致系统资源占满,服务超时,从而所有用户无法使用,通过服务限流控制请求的量,服务降级省掉非核心业务对系统资源的占用,最大化利用系统资源,尽可能服务更多用户 3 Sentinel 简介 Sentinel: 分布式系统的流量防卫兵,是阿里中间件团队 2018 年 7 月开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护系统服务的稳定性 Sentinel

10-创建多少线程数才是合适的

删除回忆录丶 提交于 2019-12-01 19:33:35
1、为什么要使用多线程? 性能的核心指标: 延迟,指的是发送请求到收到响应的过程的耗时。延迟越短,程序执行时间越短,性能越好。 吞吐量,指的是单位时间能够处理的请求数。吞吐量越大,意味着程序能处理的请求越多,性能也就越好。 所以,要提升性能,就是要 降低程序的延迟。提高程序的吞吐量。 两个方向:1.优化算法 2.将硬件的性能发挥到极致,具体来讲,就是要提升硬件的利用率,再具体的讲,就是要提升 I/O利用率和CPU利用率。 2、不同的场景工程上有不同的线程数经验值 CPU密集型:最佳线程数=CPU核数+1 I/O密集型:最佳线程数=CPU核数 *(1+(I/O耗时 / CPU耗时)) 不过,定性的io密集或者cpu密集很难在定量的维度上反应出性能瓶颈,而且公式上忽略了线程数增加带来的cpu消耗,性能优化还是要定量比较好,这样不会盲目,比如io已经成为了瓶颈,增加线程或许带来不了性能提升,这个时候是不是可以考虑用cpu换取带宽,压缩数据,或者逻辑上少发送一些。经验值在大部分应用环境是合理的,是积累了一些调优经验后给出的方案,没有特殊需求,初始值我会选大家都在用的标准。 来源: https://www.cnblogs.com/bbsh/p/11714685.html

Jmeter中逻辑控制器

落爺英雄遲暮 提交于 2019-12-01 17:26:43
1.ForEach 控制器 操作如下: 对应结果: 2.if controller (类似于 if 语句,根据给定表达式的值决定是否执行该节点下的字节的) 3. 交替控制器(根据线程组中的循环次数来设定子节点中的取样器执行) ( 1 )当线程数循环次数设为 1 且控制器下有 3 个取样器时,结果如下: 结果仅只运行了第一个取样器 ( 2 )当线程数循环次数设为 3 且控制器下有 3 个取样器时,结果如下: 结果 3 个取样器,每个都运行了 1 次 4. 循环控制器(控制子节点的循环次数) 如下所示:线程组中只设置循环 1 次,但是循环控制器中设置了 2 次,输出的结果为两次 5. 仅一次控制器 如下所示:虽然线程组中设置了循环次数为 3 次,但是添加仅一次控制器后,输出的结果则每个取样器输出一次 6. 随机控制器(每次执行时,随机从字节点中随机选取一个来执行) 如下所示:线程组中设置循环 3 次,但是添加随机控制器后,输出的结果是随机从子节点中随机执行了 3 个线程数 7. 随机顺序控制器 如下所示:线程数设置循环 1 次,添加随机顺序控制器后,结果为子节点下的所有取样器都会执行一次,但是执行顺序是随机的 8.Switch Controller 如下所示:线程组设置循环 2 次添加 Switch Controller 控制器后,并设置 witch value 值后结果只对

多线程如何按指定顺序同步执行

喜你入骨 提交于 2019-12-01 17:23:59
笔者今天看到一个有趣的面试题,如何让多个线程按照既定的顺序依次执行?比如每个线程输出一个整数, 那么期望就是这样的: 0,1,2,3,4,5,6,7,8,9. 而不是 0,2,4,1,3,5,8,7,9,6 乍一看,这不是反人性的考题吗?多线程本来就以乱序执行出名的。稍加思索,想到3种解决方案,分别用代码实现之。 方法1 使用newSingleThreadExecutor newSingleThreadExecutor返回仅仅包含一个线程的线程池,将多个任务交给此Executor时,这个线程池处理完一个任务后接着处理下一个任务,这样就保证了执行顺序,先提交先执行。如果当前线程意外终止,会创建一个新线程继续执行任务。 示例代码如下: ExecutorService pool = Executors.newSingleThreadExecutor(); for(int i=0;i<1000;++i) { final int number = i; pool.execute(()-> { System.out.println("I am " + number); } ); } pool.shutdown(); 方法2 使用join方法 When we call this method using a thread object, it suspends the execution of

JMeter性能测试(完整入门篇)

牧云@^-^@ 提交于 2019-12-01 11:31:13
Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。 本文为JMeter性能测试完整入门篇,从Jmeter下载安装到编写一个完整性能测试脚本、最终执行性能测试并分析性能测试结果。 运行环境为Windows 10系统,JDK版本为1.8,JMeter版本为3.3。 Jmeter安装 2.1 JDK安装 由于Jmeter是基于java开发,首先需要下载安装JDK (目前JMeter只支持到Java 8,尚不支持 Java 9) 官网下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 选择Java SE 8u151/ 8u152,点击JDK下载 这里写图片描述 安装下载的JDK 配置系统环境变量 2.2 JMeter安装 官网下载地址: http://jmeter.apache.org/download_jmeter.cgi 下载最新JMeter 3.3版本:apache-jmeter-3.3.zip 这里写图片描述 下载完成后解压zip包 启动JMeter 双击JMeter解压路径(apache-jmeter-3.3\bin

你不知道的线程池构造方法的那些趣事?

流过昼夜 提交于 2019-12-01 10:27:55
(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 ThreadPoolExecutor的构造方法是创建线程池的入口,虽然比较简单,但是信息量很大,由此也能引发一系列的问题,同样地,这也是面试中经常被问到的问题,下面彤哥只是列举了一部分关于ThreadPoolExecutor构造方法的问题,如果你都能回答上来,则可以不用看下面的分析了。 问题 (1)ThreadPoolExecutor有几个构造方法? (2)ThreadPoolExecutor最长的构造方法有几个参数? (3)keepAliveTime是做什么用的? (7)核心线程会不会超时关闭?能不能超时关闭? (4)ConcurrentLinkedQueue能不能作为任务队列的参数? (5)默认的线程是怎么创建的? (6)如何实现自己的线程工厂? (7)拒绝策略有哪些? (8)默认的拒绝策略是什么? 构造方法 好了,我们直接上代码。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize,

tomcat的内存及加大TOMCAT的连接数

最后都变了- 提交于 2019-12-01 10:04:03
如何加大tomcat的内存及加大TOMCAT的连接数 注: 如果在测试的时候可能会用Eclispe 这时候就需要在Eclipse ->run -arguments 中的VM arguments 中输入-Xms32m -Xmx800m这个参数就可以了。 项目加载的时候出现错误 2009-09-08 17:21 12,671:ERROR [http-8050-Processor24] (Compiler.java:407) - Error compiling file: /D:/Tomcat 5.0/work/Catalina/localhost/unicom//org/apache/jsp\index_jsp.java [javac] Compiling 1 source file 系统资源不足。 有关详细信息,请参阅以下堆栈追踪。 java.lang.OutOfMemoryError: Java heap space 该错误解决方法: 在tomcat\bin文件夹中的catalina.bat文件下.176行左右 rem Execute Java with the applicable properties下,将所有%CATALINA_OPTS%替换成-Xms256m -Xmx512m .他们分别指最小内存和最大内存.tomcat的最大内存只能改为物理内存的80%.

扛住阿里双十一高并发流量,Sentinel是怎么做到的?

自作多情 提交于 2019-12-01 08:28:05
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源不够,不足以应对大量请求,对系统按照预设的规则进行流量限制或功能限制 服务熔断 :当调用目标服务的请求和调用大量超时或失败,服务调用方为避免造成长时间的阻塞造成影响其他服务,后续对该服务接口的调用不再经过进行请求,直接执行本地的默认方法 服务降级 :为了保证核心业务在大量请求下能正常运行,根据实际业务情况及流量,对部分服务降低优先级,有策略的不处理或用简单的方式处理 服务降级的实现可以基于人工开关降级(秒杀、电商大促等)和自动检测(超时、失败次数、故障),熔断可以理解为一种服务故障降级处理 2 为什么需要限流降级 系统承载的访问量是有限的,如果不做流量控制,会导致系统资源占满,服务超时,从而所有用户无法使用,通过服务限流控制请求的量,服务降级省掉非核心业务对系统资源的占用,最大化利用系统资源,尽可能服务更多用户 3 Sentinel简介 Sentinel: 分布式系统的流量防卫兵,是阿里中间件团队2018年7月开源的,面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护系统服务的稳定性 Sentinel 的开源生态:

【JUC】5.线程池—ThreadPoolExecutor

Deadly 提交于 2019-12-01 04:30:35
创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象; 此构造方法,一共7个参数,5个必须参数,2个带有默认值的参数;详细后面说; 2. 通过Executors返回的线程池对象; 这种方法创建的常用线程池为4种,还可以创建ForkJoinPool对象; 可以说是封装好的方法,通过Executors的4种常用静态方法,返回4种已经封装好的ThreadPoolExecutor线程池对象; 3. ForkJoinPool并发框架 将一个大任务拆分成多个小任务后,使用 fork 可以将小任务分发给其他线程同时处理,使用 join 可以将多个线程处理的结果进行汇总;这实际上就是分治思想。 后面再说此类; 为什么要使用线程池: 使用线程池的好处 降低资源消耗。重复利用已创建线程,降低线程创建与销毁的资源消耗。 提高响应效率。任务到达时,不需等待创建线程就能立即执行。 提高线程可管理性。 防止服务器过载。内存溢出、CPU耗尽。 进入正题: ThreadPoolExecutor 尽量使用此类创建线程池,而非Executors创建;使用此方法,更明确线程池的运行规则,规避资源耗尽的风险 先说一下线程池的流程: 线程先进入核心池运行; 核心池满了,进队列等待; 队列满了,就创建新线程,直到最大线程数满了

jmeter梯度加压请求数

那年仲夏 提交于 2019-12-01 02:23:57
在压力测试时,可能需要使用jmeter的梯度加压。而在使用梯度加压时,大部分tester会对这一点疑惑:设置的总线程是100,但聚合报告中线程数远超100个 ,为什么梯度加压会有这样的现象?用事实说话,本文用示例去解释这一点。 环境: 先设置梯度加压的场景,访问某网站,具体如下: 从这个梯度加压设置的参数,我们可以看出设置的总线程数为50个,每2s增加5个,在1s内增加完成;然后线程保持30s;再然后,每2s停掉5个线程。 要正确理解最终请求数,需要明白每一秒钟线程释放了多少请求 分析: 在梯度加压有三个阶段:梯度加压、持续负载、线程释放。 梯度加压: 如果该请求的平均响应时间是100ms,那么1s钟该请求可以迭代10次; 那么在1s内如果启动了5个线程,这1s内发出的请求数就是5*10=50次 接着运行2s后才开始加载下一波线程,在这2s内,它发出的请求数是2*5*10=100次 在2s之后,线程组又在1s内释放5个请求,并运行2s,在这2s内,它发出的请求数是2*10*10=200次(此时是10个线程在运行) 以此类推,直到50个线程加载完之前,线程释放的请求数是这样的:(2*5*10)+(2*10*10)+(2*15*10)+(2*20*10)+(2*25*10)+....+(2*45*10)=4500次 持续负载: (注意:为什么最后不是2*50*10呢