之前一直没闹懂cpu核数和线程数的关系什么,我一直以为2核8线程是指:两个物理上的核同时可以处理8个线程。( 这里的同时是绝对意义上的同步处理。 )但是我搜了一下,貌似并不是,之前理解完全错误。
参考:https://zhidao.baidu.com/question/564747175879215284.html
https://www.cnblogs.com/hitwhhw09/p/4718404.html
最近做个http请求。有点大 几千万次。给我的机器是2核40线程。所以我想啊40线程可以同时处理40个线程,按照网上说的设置2-3倍,让他跑吧。然后我设置了80个,跑了一两天。崩了!带我的那个人更牛逼,直接设置3w个线程。然后觉得慢,就说你去做个试验看看,线程设置多少合适。然后实现数据如下:
connectionTimeOut指http请求超时设置,soTimeOut指等待返回时间超时。我们场景是希望请求获得有效返回。
从试验数据上看,单纯从处理速度,不管suc的话,设置在机器线程数量的10倍左右合适。如果从成功结果上看(抛开超时设置)越接近物理核数设置,请求成功率越高。
具体原因因为大概可以猜到,但是抱着严谨精神,我就不说了(我没查,但是学过计算机组成原理和操作系统,所以大概理解)。希望大家自己去查吧。
尽然数据贴出来了,就结合着数据找点经验吧。抛开 http因素。多核多线程情况下 线程数 设置 为线程数的10倍左右处理速度应该最快。
http请求照顾到成功率情况,request超时设置大点更为合理,根据http 响应服务器来定,我们这个应该2-4s直接合理,response超时设置500足够。线程数量应设置在50-240之间,具体大小应该计算或者再细测获得。
1:配置executor属性
打开/conf/server.xml文件,在Connector之前配置一个线程池:
重要参数说明:name :共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None; namePrefix :在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-; maxThreads :该线程池可以容纳的最大线程数。默认值:200; maxIdleTime :在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。 minSpareThreads :Tomcat应该始终打开的最小不活跃线程数。默认值:25。
2:配置Connector
重要参数说明:executor :表示使用该参数值对应的线程池; minProcessors :服务器启动时创建的处理请求的线程数; maxProcessors :最大可以创建的处理请求的线程数; acceptCount :指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
一.Tomcat内存优化
Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置JAVA_OPTS 参数。
1.JAVA_OPTS参数说明
现公司服务器内存一般都可以加到最大2G ,所以可以采取以下配置:
在cygwin=false前添加
配置完成后可重启Tomcat ,通过以下命令进行查看配置是否生效:
首先查看Tomcat 进程号:
result
我们可以看到Tomcat 进程号是27698 。
查看是否配置生效:
能在输出的信息中找到Heap Configuration中看到MaxHeapSize 等参数已经生效。
二.Tomcat并发优化
1.Tomcat连接相关参数
在Tomcat 配置文件 server.xml 中的 配置中
1.参数说明
minProcessors :最小空闲连接线程数,用于提高系统处理性能,默认值为 10 maxProcessors :最大连接线程数,即:并发处理的最大请求数,默认值为 75 acceptCount :允许的最大连接数,应大于等于 maxProcessors ,默认值为 100 enableLookups :是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false connectionTimeout :网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux是 1000 个左右。
2.Tomcat中的配置示例
2.调整连接器connector的并发处理能力
1.参数说明
maxThreads :客户请求最大线程数 minSpareThreads :Tomcat初始化时创建的 socket 线程数 maxSpareThreads :Tomcat连接器的最大空闲 socket 线程数 enableLookups :若设为true, 则支持域名解析,可把 ip 地址解析为主机名 redirectPort :在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口 acceptAccount :监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads ) connectionTimeout :连接超时 minProcessors :服务器创建时的最小处理线程数 maxProcessors :服务器同时最大处理线程数 URIEncoding :URL统一编码
2.Tomcat中的配置示例
3.Tomcat缓存优化
1.参数说明
compression :打开压缩功能 compressionMinSize :启用压缩的输出内容大小,这里面默认为2KB compressableMimeType :压缩类型 connectionTimeout :定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
2.Tomcat中的配置示例
4.参考配置
1.旧有的配置
参考网络对服务器做过如下配置,拿出来分享下:
后来发现在访问量达到3 百万多的时候出现性能瓶颈。
2.更改后的配置
corePoolSize:线程池的核心线程数。在没有设置 allowCoreThreadTimeOut 为 true 的情况下,核心线程会在线程池中一直存活,即使处于闲置状态。
maximumPoolSize:线程池所能容纳的最大线程数。当活动线程(核心线程+非核心线程)达到这个数值后,后续任务将会根据 RejectedExecutionHandler 来进行拒绝策略处理。
keepAliveTime:非核心线程闲置时的超时时长。超过该时长,非核心线程就会被回收。若线程池通过 allowCoreThreadTimeOut() 方法设置 allowCoreThreadTimeOut 属性为 true,则该时长同样会作用于核心线程。
workQueue:任务队列,当核心线程达到最大值,新请求的任务将放在这里;
RejectedExecutionHandler:当任务无法被执行时(超过线程最大容量 maximum 并且 workQueue 已经被排满了)的处理策略,这里有四种任务拒绝类型。
1、当线程池中线程数量小于 corePoolSize 则创建线程,并处理请求。
2、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中,随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从workQueue 中取任务并处理。
3 、当 taskQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。
4、如果线程池中线程数大于 maximumPoolSize 则使用 RejectedExecutionHandler 来进行任务拒绝处理。
CPU密集型核心线程数=CPU核数+1;
IO密集型核心线程数=CPU核数*2;
最大线程数= CPU 核心数 / (1 - 阻塞系数)
其中计算密集型阻塞系数为 0,IO 密集型阻塞系数接近 1,一般认为在 0.8 ~ 0.9 之间。比如 8 核 CPU,按照公式就是 2 / ( 1 - 0.9 ) = 20 个线程数
当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。
当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常。
切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize大小,当任务陡增时,不能新开线程来执行,响应时间会随之陡增。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)